模仿优酷菜单

转载注明出处:    http://blog.csdn.net/forwardyzk/article/details/42554691

在开发中,会使用菜单,现在模拟一下优酷的菜单效果。

其实效果都是由android基本的动画效果组成的,在合适的时间显示对应的动画,即可展示出不一样的效果。

思路:

1.自定义类RotateMenuView继承RelativeLayout。

2.在需要加载的布局文件中,添加对应的菜单View。

3.定义菜单进入和出去的动画效果,使用旋转动画,进来顺时针,出去的时候,为逆时针。

4.在为不同等级的菜单添加动画的时,设置合适时间间隔。

同时进入时候,进入顺序,一级菜单,二级菜单,三级菜单,有动画间隔延迟加载。

同时出去的时候,出去顺序,三级菜单,二级菜单,一级菜单,有动画间隔延迟加载。

5.一级菜单控制耳机菜单,二级菜单控制三级菜单,菜单的显示状态,每次都更新,初始化额时候,默认都是不现实。

6.对二级菜单和三级菜单的按钮增加点击事件。

菜单进入,出去,点击的效果

private static boolean isRunning = false;

	/**
	 * 菜单进入动画,顺时针,
	 *
	 * @param viewGroup
	 * @param startOffset
	 *            延迟时间
	 */
	public static void startInRotateAnimation(ViewGroup viewGroup,
			long startOffset) {
		for (int i = 0; i < viewGroup.getChildCount(); i++) {
			viewGroup.getChildAt(i).setEnabled(true); // 设置VieGroup所有的孩子状态Endbled为True
		}

		RotateAnimation anim = new RotateAnimation(-180f, 0f,
				Animation.RELATIVE_TO_SELF, 0.5f, // x轴上的值
				Animation.RELATIVE_TO_SELF, 1.0f); // y轴上的值
		anim.setDuration(500); // 一次动画的事件
		anim.setStartOffset(startOffset);
		anim.setFillAfter(true); // 动画停止在最后状态
		anim.setAnimationListener(new AnimationListener() {

			@Override
			public void onAnimationStart(Animation animation) {
				isRunning = true;
			}

			@Override
			public void onAnimationEnd(Animation animation) {
				isRunning = false;
			}

			@Override
			public void onAnimationRepeat(Animation animation) {
				// TODO Auto-generated method stub

			}
		});
		viewGroup.startAnimation(anim);
	}

	/**
	 * 菜单出去动画
	 *
	 * @param viewGroup
	 * @param startOffset
	 *            延迟时间
	 */
	public static void startOutRotateAnimation(ViewGroup viewGroup,
			long startOffset) {
		for (int i = 0; i < viewGroup.getChildCount(); i++) {
			viewGroup.getChildAt(i).setEnabled(false);
		}

		RotateAnimation anim = new RotateAnimation(0f, -180f,
				Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
				1.0f);
		anim.setDuration(500);
		anim.setStartOffset(startOffset);
		anim.setFillAfter(true);

		anim.setAnimationListener(new AnimationListener() {

			/**
			 * 当动画开始时
			 */
			@Override
			public void onAnimationStart(Animation animation) {
				isRunning = true;
			}

			/**
			 * 当动画结束时
			 */
			@Override
			public void onAnimationEnd(Animation animation) {
				isRunning = false;
			}

			/**
			 * 当动画开始之前
			 */
			@Override
			public void onAnimationRepeat(Animation animation) {
				// TODO Auto-generated method stub

			}
		});
		viewGroup.startAnimation(anim);
	}

	/**
	 * 获取动画是否正在执行
	 *
	 * @return
	 */
	public static boolean isRunningAnimation() {
		return isRunning;
	}

	/**
	 * @return 点击菜单按钮的效果,放大
	 */
	public static ScaleAnimation normalToBig(View view) {
		ScaleAnimation animation = new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f,
				ScaleAnimation.RELATIVE_TO_SELF, 0.5f,
				ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
		animation.setDuration(2000);
		animation.setFillAfter(false);
		view.startAnimation(animation);
		return animation;
	}

设置菜单显示和隐藏

/**
	 * 优酷菜单是否显示
	 *
	 * @return
	 */
	public boolean showMeun() {
		if (MenuAnimationUtils.isRunningAnimation())
			return true;
		if (isDisplayMenu) {
			long startOffset = 0;
			// 隐藏菜单
			if (isDisplayLevel2) { // 二级菜单显示状态, 隐藏

				if (isDisplayLevel3) { // 三级菜单显示状态, 隐藏它
					MenuAnimationUtils.startOutRotateAnimation(rlLevel3,
							startOffset);
					startOffset = 200;
					isDisplayLevel3 = !isDisplayLevel3;
				}

				MenuAnimationUtils.startOutRotateAnimation(rlLevel2,
						startOffset);
				startOffset += 200;
				isDisplayLevel2 = !isDisplayLevel2;
			}

			// 隐藏一级菜单
			MenuAnimationUtils.startOutRotateAnimation(rlLevel1, startOffset);
		} else {
			// 显示菜单
			// 判断菜单是否是为View.GONE的状态
			if (rlLevel1.getVisibility() == View.GONE
					&& rlLevel2.getVisibility() == View.GONE
					&& rlLevel3.getVisibility() == View.GONE) {
				// 设置菜单显示
				rlLevel1.setVisibility(View.VISIBLE);
				rlLevel2.setVisibility(View.VISIBLE);
				rlLevel3.setVisibility(View.VISIBLE);
			}

			MenuAnimationUtils.startInRotateAnimation(rlLevel1, 0);
			MenuAnimationUtils.startInRotateAnimation(rlLevel2, 200);
			MenuAnimationUtils.startInRotateAnimation(rlLevel3, 400);

			isDisplayLevel2 = !isDisplayLevel2;
			isDisplayLevel3 = !isDisplayLevel3;
		}

		return isDisplayMenu = !isDisplayMenu;
	}

控制按钮的点击事件

		if (MenuAnimationUtils.isRunningAnimation())
			return;
		switch (v.getId()) {
		case R.id.ib_home:// 主菜单按钮

			if (isDisplayLevel2) {

				long startOffset = 0;
				if (isDisplayLevel3) {
					MenuAnimationUtils.startOutRotateAnimation(rlLevel3,
							startOffset);
					isDisplayLevel3 = !isDisplayLevel3;
					startOffset = 200;
				}

				// 隐藏二级菜单
				MenuAnimationUtils.startOutRotateAnimation(rlLevel2,
						startOffset);
			} else {
				// 显示二级菜单
				MenuAnimationUtils.startInRotateAnimation(rlLevel2, 0);
			}
			isDisplayLevel2 = !isDisplayLevel2;
			break;
		case R.id.ib_menu:// 二级菜单控制三级菜单的按钮
			if (isDisplayLevel3) {
				// 隐藏三级菜单
				MenuAnimationUtils.startOutRotateAnimation(rlLevel3, 0);
			} else {
				// 显示三级菜单
				MenuAnimationUtils.startInRotateAnimation(rlLevel3, 0);
			}
			isDisplayLevel3 = !isDisplayLevel3;
			break;
		default:
			break;
		}
	

非控制菜单按钮的点击事件。

private OnClickListener clickListener = new OnClickListener() {

		@Override
		public void onClick(View v) {
			if (clickMenuListener == null) {
				return;
			}
			switch (v.getId()) {
			case R.id.ib_level2_1:
				clickMenuListener.click(v, LEVEL2_21);
				break;
			case R.id.ib_level2_3:
				clickMenuListener.click(v, LEVEL2_23);
				break;
			case R.id.ib_level3_1:
				clickMenuListener.click(v, LEVEL3_31);
				break;
			case R.id.ib_level3_2:
				clickMenuListener.click(v, LEVEL3_32);
				break;
			case R.id.ib_level3_3:
				clickMenuListener.click(v, LEVEL3_33);
				break;
			case R.id.ib_level3_4:
				clickMenuListener.click(v, LEVEL3_34);
				break;
			case R.id.ib_level3_5:
				clickMenuListener.click(v, LEVEL3_35);
				break;
			case R.id.ib_level3_6:
				clickMenuListener.click(v, LEVEL3_36);
				break;
			case R.id.ib_level3_7:
				clickMenuListener.click(v, LEVEL3_37);
				break;

			default:
				break;
			}
			MenuAnimationUtils.normalToBig(v);

		}
	};

布局文件:

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

    <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/icon_youku_level1" >

        <ImageButton
            android:id="@+id/ib_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:background="@drawable/icon_youku_home" />
    </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/icon_youku_level2" >

        <ImageButton
            android:id="@+id/ib_level2_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="5dip"
            android:layout_marginLeft="10dip"
            android:background="@drawable/icon_youku_search" />

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

        <ImageButton
            android:id="@+id/ib_level2_3"
            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="10dip"
            android:background="@drawable/icon_youku_myyouku" />
    </RelativeLayout>

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

        <ImageButton
            android:id="@+id/ib_level3_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="10dip"
            android:layout_marginLeft="15dip"
            android:background="@drawable/icon_youku_channel1" />

        <ImageButton
            android:id="@+id/ib_level3_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/ib_level3_1"
            android:layout_marginBottom="20dip"
            android:layout_marginLeft="40dip"
            android:background="@drawable/icon_youku_channel2" />

        <ImageButton
            android:id="@+id/ib_level3_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/ib_level3_2"
            android:layout_marginBottom="10dip"
            android:layout_marginLeft="10dip"
            android:layout_toRightOf="@id/ib_level3_2"
            android:background="@drawable/icon_youku_channel3" />

        <ImageButton
            android:id="@+id/ib_level3_4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="10dip"
            android:background="@drawable/icon_youku_channel4" />

        <ImageButton
            android:id="@+id/ib_level3_7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="10dip"
            android:layout_marginRight="15dip"
            android:background="@drawable/icon_youku_channel5" />

        <ImageButton
            android:id="@+id/ib_level3_6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/ib_level3_7"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="20dip"
            android:layout_marginRight="40dip"
            android:background="@drawable/icon_youku_channel6" />

        <ImageButton
            android:id="@+id/ib_level3_5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/ib_level3_6"
            android:layout_marginBottom="10dip"
            android:layout_marginRight="10dip"
            android:layout_toLeftOf="@id/ib_level3_6"
            android:background="@drawable/icon_youku_channel7" />
    </RelativeLayout>

</RelativeLayout>

使用步骤:

activity_main1.xml

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

    <com.example.view.RotateMenuView
        android:id="@+id/menu"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="bottom" >
    </com.example.view.RotateMenuView>

    <Button
        android:id="@+id/bt_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="87dp"
        android:background="@drawable/bt_pay_selector"
        android:text="显示菜单"
        android:textColor="@android:color/white" />

</RelativeLayout>

MainActivity.java

public class MainActivity extends Activity {

	private RotateMenuView menu;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main1);
		menu = (RotateMenuView) findViewById(R.id.menu);
		final Button bt_show = (Button) findViewById(R.id.bt_show);
		bt_show.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (!menu.showMeun()) {
					bt_show.setText("显示菜单");
				} else {
					bt_show.setText("隐藏菜单");
				}

			}
		});
		menu.setClickMenuListener(new ClickMenuListener() {

			@Override
			public void click(View view, int position) {
				switch (position) {
				case RotateMenuView.LEVEL2_21:
					showShortToast("搜索");
					break;
				case RotateMenuView.LEVEL2_23:
					showShortToast("关注");
					break;
				case RotateMenuView.LEVEL3_31:

					showShortToast("音乐");
					break;
				case RotateMenuView.LEVEL3_32:

					showShortToast("播放器");
					break;
				case RotateMenuView.LEVEL3_33:

					showShortToast("熊猫");
					break;
				case RotateMenuView.LEVEL3_34:

					showShortToast("排名");
					break;
				case RotateMenuView.LEVEL3_35:

					showShortToast("麦克风");
					break;
				case RotateMenuView.LEVEL3_36:

					showShortToast("视频");
					break;
				case RotateMenuView.LEVEL3_37:

					showShortToast("收音机");
					break;

				default:
					break;
				}

			}
		});

	}

	public void showShortToast(String message) {
		Toast.makeText(getApplicationContext(), message, 0).show();
	}
}

源码下载:http://download.csdn.net/detail/forwardyzk/8344663

效果图:

时间: 2024-10-09 08:09:34

模仿优酷菜单的相关文章

android自定义控件之模仿优酷菜单

去年的优酷HD版有过这样一种菜单,如下图: 应用打开之后,先是三个弧形的三级菜单,点击实体键menu之后,这三个菜单依次旋转退出,再点击实体键menu之后,一级菜单会旋转进入,点击一级菜单,二级菜单旋转进入,点击二级菜单的menu键,三级菜单旋转进入,再次点击二级菜单的旋转键,三级菜单又会旋转退出,这时再点击一级菜单,二级菜单退出,最后点击实体menu键,一级菜单退出. 总体来说实现这样的功能: (1)点击实体menu键时,如果界面上有菜单显示,不管有几个,全部依次退出,如果界面上没有菜单显示,

Android优酷菜单组件自定义

主要做的就是模仿优酷手机客户端的底部菜单控件的实现.先来几张图片,点击中间的home,显示二级菜单,点击二级菜单的menu,显示三级菜单. 这是实现起来最简单的一个布局,但是从中学会了自定义动画和一些布局的基本知识,从中还是收获很大的. 首先是定义布局文件,三个菜单条其实就是三个relativelayout,level1,level2,level3,然后每个菜单条中的小标题就加到对应的相对布局中. <RelativeLayout xmlns:android="http://schemas.

HTML5 CSS3 诱人的实例 :模仿优酷视频截图功能

一般的视频网站对于用户上传的视频,在用户上传完成后,可以对播放的视频进行截图,然后作为视频的展示图.项目中也可以引入这样的功能给用户一种不错的体验,而不是让用户额外上传一张展示图. 效果图: 看起来还是很不错,下面我给大家分析下,极其核心代码很简单: _canvas = document.createElement("canvas"); _ctx = _canvas.getContext("2d"); _ctx.fillStyle = '#ffffff'; _ctx

自定义View(一)-ViewGroup实现优酷菜单

自定义View的第一个学习案例 ViewGroup是自动以View中比较常用也比较简单的一种方式,通过组合现有的UI控件,绘制出一个全新的View 效果如下: 主类实现如下: package com.demo.youku; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.K

优酷菜单

Android中RelativeLayout各个属性的含义 android:layout_above="@id/xxx"  --将控件置于给定ID控件之上android:layout_below="@id/xxx"  --将控件置于给定ID控件之下 android:layout_toLeftOf="@id/xxx"  --将控件的右边缘和给定ID控件的左边缘对齐android:layout_toRightOf="@id/xxx"

Android仿优酷菜单效果

一.效果图 二.主要的技术点 1.RelativeLayout布局 2.RotateAnimation旋转动画 三.需求 1.点击二级菜单中的“menu”键控制三级菜单的进入和退出动画效果: 2.点击一级菜单中的“home”键控制二级和三级菜单的进入和退出效果: 3.点击手机上的菜单键控制一级.二级和三级菜单的进入和退出效果. 四.实例代码 1.布局文件:activity_main.xml <RelativeLayout xmlns:android="http://schemas.andr

Android自定义控件——仿优酷圆盘菜单

尊重作者劳动成果,转载时请标明该文章出自  http://blog.csdn.net/allen315410/article/details/39232535 最近学习的时候,看见一份资料上教怎么写自定义控件,上面的示例用的是优酷早期版本的客户端,该客户端的菜单就是一个自定义的组件(现在的版本就不清楚有没有了,没下载过了),好吧,废话不多说,先上优酷的原型图. 这个自定义组件感官上看是,里外三层设计,每一层上有布置不同的菜单按钮,每一层又设置了进入和退出的动画,来增强用户的体验效果.这种设计非常

[android] 优酷环形菜单-相对布局练习

优酷环形菜单 布局文件,使用<RelativeLayout/>控件作为第一级菜单,相对布局,位于父控件的底部,水平居中,因为图片不是特别的标准,因此宽度和高度都钉死,宽度是高度的两倍 二次菜单和三级菜单都一样的布局 小房子的图标<imageView/>控件,在父控件中居中 第二级搜索图标,位于父控件的底部,上下左右maigin10dp 第二级菜单图标,位于父控件的顶部,水平居中,marginTop 10dp 第二级叹号图标,位于父控件的底部,右边,margin 10dp 第三级的图

优酷、YouTube、Twitter及JustinTV视频网站架构设计

优酷视频网站架构 一.网站基本数据概览 据2010年统计,优酷网日均独立访问人数(uv)达到了8900万,日均访问量(pv)更是达到了17亿,优酷凭借这一数据成为google榜单中国内视频网站排名最高的厂商.     硬件方面,优酷网引进的戴尔服务器主要以 PowerEdge 1950与PowerEdge 860为主,存储阵列以戴尔MD1000为主,2007的数据表明,优酷网已有1000多台服务器遍布在全国各大省市,现在应该更多了吧. 二.网站前端框架 从一开始,优酷网就自建了一套CMS来解决前