转载注明出处: 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