美文网首页
2.自定义控件:仿老版YouKu菜单

2.自定义控件:仿老版YouKu菜单

作者: BusyBunny | 来源:发表于2019-05-01 21:23 被阅读0次

    效果展示:

    仿YouKu.gif

    布局:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <RelativeLayout
            android:id="@+id/iv_level1"
            android:background="@drawable/level1"
            android:layout_width="80dp"
            android:layout_height="40dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true">
            <ImageButton
                android:id="@+id/ib_home"
                android:background="@null"
                android:src="@drawable/icon_home"
                android:layout_alignParentBottom="true"
                android:layout_centerInParent="true"
                android:layout_marginBottom="6dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </RelativeLayout>
    
        <RelativeLayout
            android:id="@+id/iv_level2"
            android:background="@drawable/level2"
            android:layout_width="140dp"
            android:layout_height="70dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true">
            <ImageButton
                android:id="@+id/ib_menu"
                android:background="@null"
                android:src="@drawable/icon_menu"
                android:layout_centerHorizontal="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/icon_search"
                android:background="@null"
                android:layout_alignParentLeft="true"
                android:layout_alignParentBottom="true"
                android:layout_marginLeft="3dp" />
    
            <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/icon_myyouku"
                android:background="@null"
                android:layout_alignParentRight="true"
                android:layout_alignParentBottom="true"
                android:layout_marginRight="3dp" />
        </RelativeLayout>
    
        <RelativeLayout
            android:id="@+id/iv_level3"
            android:background="@drawable/level3"
            android:layout_width="220dp"
            android:layout_height="110dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true">
    
            <ImageButton
                android:background="@null"
                android:src="@drawable/channel4"
                android:layout_marginTop="3dp"
                android:layout_centerHorizontal="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
    
            <ImageButton
                android:background="@null"
                android:src="@drawable/channel1"
                android:layout_marginTop="3dp"
                android:layout_centerHorizontal="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_alignParentBottom="true"
                android:layout_marginLeft="5dp"/>
    
            <ImageButton
                android:background="@null"
                android:src="@drawable/channel2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_marginTop="45dp"
                android:layout_marginLeft="22dp" />
    
            <ImageButton
                android:background="@null"
                android:src="@drawable/channel3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_marginTop="15dp"
                android:layout_marginLeft="50dp" />
    
            <ImageButton
                android:background="@null"
                android:src="@drawable/channel7"
                android:layout_marginTop="3dp"
                android:layout_centerHorizontal="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentBottom="true"
                android:layout_marginRight="5dp"/>
    
    
            <ImageButton
                android:background="@null"
                android:src="@drawable/channel6"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_marginTop="45dp"
                android:layout_marginRight="22dp" />
    
            <ImageButton
                android:background="@null"
                android:src="@drawable/channel5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_marginTop="15dp"
                android:layout_marginRight="50dp" />
    
        </RelativeLayout>
    
    </RelativeLayout>
    

    Activity:

    • 屏蔽快速点击导致动画闪烁问题:
     //在监听器设置动画数量的增减,在Activity判断动画数量,当动画数量大于0的时候,让点击事件失效,从而快速点击的时候可以屏蔽动画闪烁。
    if (MyAnimationUtils.animationCount>0){
         return;
    }
    
    
    //在监听器中设置:
    static class MyRotateAnimationListener implements Animation.AnimationListener{
    
            @Override
            public void onAnimationStart(Animation animation) {
                animationCount++;
            }
    
            @Override
            public void onAnimationEnd(Animation animation) {
                animationCount--;
            }
    
            @Override
            public void onAnimationRepeat(Animation animation) {
    
            }
        }
    
    • 完整Activity代码:
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private RelativeLayout mIvLevel3,mIvLevel2;
        private boolean isLevel3Show=true;
        private boolean isLevel2Show=true;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initViews();
        }
    
        private void initViews() {
            findViewById(R.id.ib_home).setOnClickListener(this);
            findViewById(R.id.ib_menu).setOnClickListener(this);
            mIvLevel3=findViewById(R.id.iv_level3);
            mIvLevel2=findViewById(R.id.iv_level2);
        }
    
        @Override
        public void onClick(View v) {
            long delay=0;
            switch (v.getId()){
                case R.id.ib_menu:
                    //利用监听器判断动画数量,当动画数量大于0的时候,让点击事件失效,从而快速点击的时候可以屏蔽动画闪烁。
                    if (MyAnimationUtils.animationCount>0){
                        return;
                    }
                    if (isLevel3Show){
                        MyAnimationUtils.rotateOutAnimation(mIvLevel3,delay);
                    }else {
                        MyAnimationUtils.rotateInAnimation(mIvLevel3);
                    }
                    isLevel3Show=!isLevel3Show;
                    break;
    
                case R.id.ib_home:
                    if (MyAnimationUtils.animationCount>0){
                        return;
                    }
                    //判断二级菜单是否显示:如果二级菜单显示,再判断三级菜单是否显示,如果显示先退出三级菜单,最后再退出二级菜单;
                    //如果二级菜单不显示,点击按钮后则让二级菜单显示;
                    if (isLevel2Show){
                        if (isLevel3Show){
                            MyAnimationUtils.rotateOutAnimation(mIvLevel3,delay);
                            delay+=200;
                            isLevel3Show=false;
                        }
                        MyAnimationUtils.rotateOutAnimation(mIvLevel2,delay);
                    }else {
                        MyAnimationUtils.rotateInAnimation(mIvLevel2);
                    }
                    isLevel2Show=!isLevel2Show;
                    break;
            }
        }
    }
    
    

    MyAnimationUtils

    public class MyAnimationUtils {
        public static int animationCount=0;
        public static void rotateInAnimation(ViewGroup viewGroup){
            //屏蔽补间动画的仍存在原位置的弊端:
            int childCount = viewGroup.getChildCount();
            for (int i=0;i<childCount;i++){
                viewGroup.getChildAt(i).setEnabled(true);
            }
    
            RotateAnimation rotateAnimation=new RotateAnimation(
                    -180f,0f,
                    Animation.RELATIVE_TO_SELF,0.5f,
                    Animation.RELATIVE_TO_SELF,1.0f
            );
            rotateAnimation.setDuration(500);
            rotateAnimation.setFillAfter(true);
            rotateAnimation.setAnimationListener(new MyRotateAnimationListener());
            viewGroup.startAnimation(rotateAnimation);
        }
    
        public static void rotateOutAnimation(ViewGroup viewGroup,long delay){
            int childCount = viewGroup.getChildCount();
            for (int i=0;i<childCount;i++){
                viewGroup.getChildAt(i).setEnabled(false);
            }
    
            RotateAnimation rotateAnimation=new RotateAnimation(
                    0f,-180f,
                    Animation.RELATIVE_TO_SELF,0.5f,
                    Animation.RELATIVE_TO_SELF,1.0f
            );
            rotateAnimation.setDuration(500);
            rotateAnimation.setAnimationListener(new MyRotateAnimationListener());
            //设置动画延时:
            rotateAnimation.setStartOffset(delay);
            //让控件停留在动画最后的位置:
            rotateAnimation.setFillAfter(true);
            viewGroup.startAnimation(rotateAnimation);
        }
    
        static class MyRotateAnimationListener implements Animation.AnimationListener{
    
            @Override
            public void onAnimationStart(Animation animation) {
                animationCount++;
            }
    
            @Override
            public void onAnimationEnd(Animation animation) {
                animationCount--;
            }
    
            @Override
            public void onAnimationRepeat(Animation animation) {
    
            }
        }
    }
    

    总结:

    1. 在监听器中设置动画数量,然后在Activity中判断动画数量来屏蔽因快速点击按钮而造成动画闪烁;
    2. 屏蔽布局的所有子控件的点击效果,从而避免补间动画仍存留在原来位置的弊端;

    相关文章

      网友评论

          本文标题:2.自定义控件:仿老版YouKu菜单

          本文链接:https://www.haomeiwen.com/subject/dpgwnqtx.html