Android自定义控件:老版优酷的三级菜单(效果图 + Demo)

效果图:


制作思路:

1、先分析这个效果,其实可以理解为把三级菜单分成 level1,level2,level3,level1是始终显示的。点击level1后,level2会出现;点击level2后,level3会出 现;level2,level3出现后,点击level1,level2和level3都会消失。然后消失和出现我们用到了一个动画效果。

2、动画效果用到的是RotateAnimation,由于我们都是用同一个效果,那么我们只要写一个类,把效果实现了就可以了。要是使用RotateAnimation的话,我们会不断的复用一些代码,这样开发的效率会比较低。

3、RotateAnimation的旋转进入和旋转出去是个坑——因为他是在X轴顺时针方向旋转的。大家可以看看图:


整体思路就是这样,接下来就是一些操作了:

代码:

1、MyAnimation类:

  1. public class MyAnimation{  
  2.     public static void animationIn(View view){  
  3.         animationIn(view,0);  
  4.     }  
  5.       
  6.     public static void animationOut(View view){  
  7.         animationOut(view,0);  
  8.     }  
  9.       
  10.     public static void animationIn(View view,long delay){  
  11.         RotateAnimation animation = new RotateAnimation(180, 360, view.getWidth()/2, view.getHeight());  
  12.         animation.setDuration(500);  
  13.         animation.setFillAfter(true);  
  14.         animation.setStartOffset(delay);  
  15.           
  16.         view.startAnimation(animation);  
  17.     }  
  18.       
  19.     public static void animationOut(View view,long delay){  
  20.         RotateAnimation animation = new RotateAnimation(0, 180, view.getWidth()/2, view.getHeight());  
  21.         animation.setDuration(500);  
  22.         animation.setFillAfter(true);  
  23.         animation.setStartOffset(delay);  
  24.           
  25.         view.startAnimation(animation);  
  26.     }  
  27. }  


2、MainActivity类:

    1. public class MainActivity extends Activity implements OnClickListener{  
    2.     private boolean isLevel2showed,isLevel3showed;  
    3.       
    4.     private RelativeLayout level1,level2,level3;  
    5.     private ImageButton home,menu;  
    6.       
    7.     @Override  
    8.     protected void onCreate(Bundle savedInstanceState) {  
    9.         super.onCreate(savedInstanceState);  
    10.         setContentView(R.layout.main);  
    11.           
    12.         isLevel2showed = false;  
    13.         isLevel3showed = false;  
    14.         initLayout();  
    15.         initImageButton();  
    16.     }  
    17.   
    18.     public void initLayout() {  
    19.         level1 = (RelativeLayout)findViewById(R.id.relate_level1);  
    20.         level2 = (RelativeLayout)findViewById(R.id.relate_level2);  
    21.         level3 = (RelativeLayout)findViewById(R.id.relate_level3);  
    22.           
    23.         level2.setVisibility(View.INVISIBLE);  
    24.         level3.setVisibility(View.INVISIBLE);  
    25.     }  
    26.   
    27.     public void initImageButton() {  
    28.         home = (ImageButton)level1.findViewById(R.id.home);  
    29.         menu = (ImageButton)level2.findViewById(R.id.menu);  
    30.           
    31.         home.setOnClickListener(this);  
    32.         menu.setOnClickListener(this);  
    33.     }  
    34.   
    35.     @Override  
    36.     public void onClick(View v) {  
    37.         switch(v.getId()){  
    38.         case R.id.home:  
    39.             if(!isLevel2showed){  
    40.                 isLevel2showed = true;  
    41.                 MyAnimation.animationIn(level2);  
    42.             }else if(!isLevel3showed){  
    43.                 isLevel2showed = false;  
    44.                 MyAnimation.animationOut(level2);  
    45.             }else{  
    46.                 isLevel2showed = false;  
    47.                 isLevel3showed = false;  
    48.                 MyAnimation.animationOut(level3);  
    49.                 MyAnimation.animationOut(level2,500);  
    50.             }  
    51.               
    52.             break;  
    53.         case R.id.menu:  
    54.             if(!isLevel3showed){  
    55.                 isLevel3showed = true;  
    56.                 MyAnimation.animationIn(level3);  
    57.             }else{  
    58.                 isLevel3showed = false;  
    59.                 MyAnimation.animationOut(level3);  
    60.             }  
    61.             break;  
    62.         }  
    63.     }  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。