小说网站 搜小说 无限网 烟雨红尘 小说爱好者 免费小说 免费小说网站

Android简易实战教程--第二十三话《绚丽的菜单项》

转载本博客请注明出处:点击打开链接  http://blog.csdn.net/qq_32059827/article/details/52327456

今天这篇稍微增强点代码量,可能要多花上5分钟喽。

本篇完成一个稍微显得绚丽的菜单项,模仿优酷选择菜单。如果想对其中的任意一项实现点击功能,自行加入即可。

现在就一步一步做出这个小案例:

在实现功能前,先看一下完成的结果,可能能对代码更好的理解。

效果演示:



PS:由于代码中做出了详细的解释,不再做过多的赘述。

首先自定义组合控件布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal" >

    <RelativeLayout
        android:id="@+id/rl_level3"
        android:layout_width="320dip"
        android:layout_height="160dip"
        android:layout_alignParentBottom="true"
        android:background="@drawable/level3" >

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="8dip"
            android:background="@drawable/channel4" />

        <ImageButton
            android:id="@+id/iv_channel1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="5dip"
            android:layout_marginLeft="12dip"
            android:background="@drawable/channel1" />

        <ImageButton
            android:id="@+id/iv_channel2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/iv_channel1"
            android:layout_marginBottom="16dip"
            android:layout_marginLeft="35dip"
            android:background="@drawable/channel2" />

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/iv_channel2"
            android:layout_marginBottom="16dip"
            android:layout_marginLeft="70dip"
            android:background="@drawable/channel3" />

        <ImageButton
            android:id="@+id/iv_channel7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="5dip"
            android:layout_marginRight="12dip"
            android:background="@drawable/channel7" />

        <ImageButton
            android:id="@+id/iv_channel6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/iv_channel7"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="16dip"
            android:layout_marginRight="35dip"
            android:background="@drawable/channel6" />

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/iv_channel6"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="16dip"
            android:layout_marginRight="70dip"
            android:background="@drawable/channel5" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/rl_level2"
        android:layout_width="200dip"
        android:layout_height="100dip"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/level2" >

        <ImageButton
            android:id="@+id/ib_menu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="8dip"
            android:background="@drawable/icon_menu" />

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="5dip"
            android:layout_marginLeft="12dip"
            android:background="@drawable/icon_search" />

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="5dip"
            android:layout_marginRight="12dip"
            android:background="@drawable/icon_myyouku" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/rl_level1"
        android:layout_width="100dip"
        android:layout_height="50dip"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/level1"
        android:gravity="center" >

        <ImageButton
            android:id="@+id/ib_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/icon_home" />
    </RelativeLayout>

</RelativeLayout>
因为动画不断地使用,选择定义一个动画效果的utils类:

package com.itydl.yukudemo.Utils;

import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.RotateAnimation;
import android.widget.RelativeLayout;

/**
 * 这是专门设置动画操作的工具类
 * @author lenovo
 *
 */

public class MyAnimationUtils {
	
	private static int runningAnimation = 0;//是否存在动画播放的标志位
	
	public static boolean isRunningAnimation(){
		return runningAnimation!=0;
	}
	
	/**
	 * 开始旋转隐藏的动画
	 * @param v
	 * 		要给哪个view加动画
	 */
	public static void startRotateHindeAnimation(RelativeLayout v){
		//复用动画方法,这里是不延时动画
		
		startRotateHindeAnimation(v,0);
	}
	
	/**
	 * 带有延时效果的动画
	 * @param v
	 * 			要给哪个组件加入动画
	 * @param startOffset
	 * 			延时时间,传递过来
	 */
	public static void startRotateHindeAnimation(RelativeLayout v,long startOffset){
		//如果当前的动画隐藏了,该view动画上边的控件的事件也要阉割掉
		for(int i = 0 ;i< v.getChildCount(); i ++){
			v.getChildAt(i).setEnabled(false);//view.getChildAt(i)获取索引位置的子控件实例;setEnabled(false);禁用事件
		}
		RotateAnimation ra = new RotateAnimation(
				0, -180, 
				Animation.RELATIVE_TO_SELF, 0.5f, 
				Animation.RELATIVE_TO_SELF, 1f);
		ra.setDuration(500);
		ra.setFillAfter(true);//设置动画执行完毕,控件状态停留在结束状态
		//设置动画监听状态
		ra.setAnimationListener(animationListener);
		//加入延时
		ra.setStartOffset(startOffset);
		//给哪个view加动画,传递过来这个view
		v.startAnimation(ra);
		
	}
	
	/**
	 * 旋转显示的动画
	 * @param v
	 * 		要给哪个view加动画
	 */
	public static void startRotateShowAnimation(RelativeLayout v){
		startRotateShowAnimation(v, 0);
	}
	
	/**
	 * 延时显示动画
	 * @param v
	 * 		要给哪个view加动画
	 * @param startOffset
	 * 		设置动画延时时间,传递过来
	 */
    public static void startRotateShowAnimation(RelativeLayout v,int startOffset){
		
		//设置如果当前的view显示,让该view子控件也都重新获取事件
		for(int i = 0 ;i< v.getChildCount(); i ++){
			v.getChildAt(i).setEnabled(true);//view.getChildAt(i)获取索引位置的子控件实例;setEnabled(true);启动事件
		}
		RotateAnimation ra = new RotateAnimation(
				-180, 0, 
				Animation.RELATIVE_TO_SELF, 0.5f, 
				Animation.RELATIVE_TO_SELF, 1f);
		ra.setDuration(500);
		ra.setFillAfter(true);//设置动画执行完毕,控件状态停留在结束状态
		//设置动画监听状态
		ra.setAnimationListener(animationListener);
		//延时播放动画
		ra.setStartOffset(startOffset);
		//给哪个view加动画,传递过来这个view
		v.startAnimation(ra);
	}
	
	static AnimationListener animationListener = new AnimationListener() {
		
		//开始播放
		@Override
		public void onAnimationStart(Animation animation) {
			// 播放一个动画,说明存在一个动画在播放
			runningAnimation ++ ;
			
		}
		
		@Override
		public void onAnimationRepeat(Animation animation) {
			// TODO Auto-generated method stub
			
		}
		
		//播放结束
		@Override
		public void onAnimationEnd(Animation animation) {
			// 动画播放完毕
			runningAnimation -- ;
			
		}
	};
		
}

MainActivity的代码如下:

package com.itydl.yukudemo;

import com.itydl.yukudemo.Utils.MyAnimationUtils;

import android.os.Bundle;
import android.app.Activity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

	private RelativeLayout mRl_Level1;
	private RelativeLayout mRl_Level2;
	private RelativeLayout mRl_Level3;
	private ImageButton mIb_Home;
	private ImageButton mIb_Menu;
	
	private boolean level3 = true;//设置标志位,对状态改变标记;三级菜单默认状态为显示。(注意这种编程思想)
	private boolean level2 = true;//设置标志位,对状态改变标记;二级菜单默认状态为显示。(注意这种编程思想)
	private boolean level1 = true;//设置标志位,对状态改变标记;一级菜单默认状态为显示。(注意这种编程思想)

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		initEvent();
	}

	/**
	 * 初始化事件
	 */
	private void initEvent() {

		// 对menu和home按钮加入点击事件
		OnClickListener listener = new OnClickListener() {

			@Override
			public void onClick(View v) {
				switch (v.getId()) {
				case R.id.ib_home:// 点击的是home键
					//解决连续点击按钮,动画播放不完
					if(MyAnimationUtils.isRunningAnimation()){
						return;
					}
					int longTime = 0;
					if(level2){
						if(level3){
							//如果三级菜单显示,点击home键,应该让其也消失
							MyAnimationUtils.startRotateHindeAnimation(mRl_Level3);
							level3 = false;
							//进入这里,说明开始三级菜单为显示状态。延时增加
							longTime = 200;
						}
						//显示,点击应该隐藏
						MyAnimationUtils.startRotateHindeAnimation(mRl_Level2,longTime);
						//修改状态值
						level2 = false;
					}else{
						//隐藏状态,应该显示
						MyAnimationUtils.startRotateShowAnimation(mRl_Level2);
						//修改状态值
						level2 = true;
					}
					
					
					break;
				case R.id.ib_menu:// 点击的是menu键
					if(MyAnimationUtils.isRunningAnimation()){
						//保证动画播放完毕再播放一次播放
						return;
					}
					//判断三级菜单的状态
					if(level3){
						//显示,点击应该隐藏
						MyAnimationUtils.startRotateHindeAnimation(mRl_Level3);
						//修改状态值
						level3 = false;
					}else{
						//隐藏状态,应该显示
						MyAnimationUtils.startRotateShowAnimation(mRl_Level3);
						//修改状态值
						level3 = true;
					}
					break;

				default:
					break;
				}

			}
		};

		mIb_Home.setOnClickListener(listener);
		mIb_Menu.setOnClickListener(listener);

	}
	
	//手机的menu键按下的时候调用事件
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(level1){
			int longTime = 0;
			//判断二级菜单是否显示
			if(level2){
				//判断三级菜单是否显示
				if(level3){
					//隐藏三级菜单
					MyAnimationUtils.startRotateHindeAnimation(mRl_Level3);
					level3 = false;
					longTime = 200;//延时标记
				}
				//隐藏二级菜单
				MyAnimationUtils.startRotateHindeAnimation(mRl_Level2,longTime);
				level2 = false;
				longTime += 200;
			}
			//一级菜单显示状态
			//隐藏一级菜单
			MyAnimationUtils.startRotateHindeAnimation(mRl_Level1,longTime);
			level1 = false;
		}else{
			//一次显示
			MyAnimationUtils.startRotateShowAnimation(mRl_Level1);
			MyAnimationUtils.startRotateShowAnimation(mRl_Level2,200);
			MyAnimationUtils.startRotateShowAnimation(mRl_Level3,400);
			level1 = true;
			level2 = true;
			level3 = true;
		}
		// 交由父类去处理逻辑,自己不做处理
		return super.onKeyDown(keyCode, event);
	}

	/**
	 * 初始化界面
	 */
	private void initView() {

		mRl_Level1 = (RelativeLayout) findViewById(R.id.rl_level1);
		mRl_Level2 = (RelativeLayout) findViewById(R.id.rl_level2);
		mRl_Level3 = (RelativeLayout) findViewById(R.id.rl_level3);

		mIb_Home = (ImageButton) findViewById(R.id.ib_home);
		mIb_Menu = (ImageButton) findViewById(R.id.ib_menu);

	}
}

好啦,赶快把代码复制到您的IDE中把效果跑起来吧!

欢迎关注本博客点击打开链接  http://blog.csdn.net/qq_32059827,每天花上5分钟,阅读一篇有趣的安卓小文哦。


posted on 2016-08-26 13:35  王小航  阅读(124)  评论(0编辑  收藏  举报

导航