android隐藏View动画的注意事项

android动画有一个特性就是View在隐藏的时候执行动画,View会显示出来,不管这个View是invisible还是gone掉了.我们公司现在有这样一个需求,现在有一个圆盘,要在圆盘外面有一个一个按下的动画(就是出现一个白色的180度圆弧,但是为了节省内存,只准使用一段圆弧图片,其他的就自己去做动画旋转来使用,很操蛋的....),通过按键位置来判断动画旋转的角度这个是中学问题了,这里就不说了.不过这里就出现一个问题了,这个VIew最初要是invisible的,当按下的时候才旋转到相应的位置,并显示出来,笔者最初仅仅是通过控制View的显示与选择来做的,不过也能满足需求了,只是当按下一个位置的时候,手机比较卡的话会出现一个旋转过程的,最终解决方案就是用一个动画集合来做,再做一个alpha动画,最初的时候让其不显示,最后完全呈现.这样就能完全满足了,下面贴一下代码片段,以及一些bug的解决方式

//这里强烈建议用手势识别器来解析事件,这样就能很轻松的解决bug了

GestureDetector gestureLeft = new GestureDetector(context,new GestureDetector.OnGestureListener() {
        @Override
        public boolean onDown(MotionEvent motionEvent) {
            CURRENT_STATE = BUTTON_LEFT;
                vibrator.vibrate(40);
                starAnimation();

            return true;
        }


        @Override
        public void onShowPress(MotionEvent motionEvent) {
        }


        @Override
        public boolean onSingleTapUp(MotionEvent motionEvent) {
            new Handler().post(new Runnable() {
                @Override
                public void run() {
                    iv_navigation_background.clearAnimation();//记得要清除动画否则View是隐藏不掉的
                    iv_navigation_background.setVisibility(View.INVISIBLE);
                }
            });
            return false;
        }


        @Override
        public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) {
            new Handler().post(new Runnable() {
                @Override
                public void run() {
                    iv_navigation_background.clearAnimation();
                    iv_navigation_background.setVisibility(View.INVISIBLE);
                }
            });
            return false;
        }


        @Override
        public void onLongPress(MotionEvent motionEvent) {


        }
        @Override
        public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent2, float v, float v2) {
            new Handler().post(new Runnable() {
                @Override
                public void run() {
                    iv_navigation_background.clearAnimation();
                    iv_navigation_background.setVisibility(View.INVISIBLE);
                }
            });
            return false;
        }
    });

/**
     * 开始旋转,由于这个背景图片很大这样能省不少内存,总体是模拟了一个背景选择器
     */
    private void starAnimation() {
        AlphaAnimation alpha = new AlphaAnimation(0, 1);
        RotateAnimation rotate = new RotateAnimation(LAST_STATE, CURRENT_STATE, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        AnimationSet animationSet = new AnimationSet(false);
        animationSet.addAnimation(alpha);
        animationSet.addAnimation(rotate);
        animationSet.setFillAfter(true);
        iv_navigation_background.clearAnimation();
        iv_navigation_background.startAnimation(animationSet);
        iv_navigation_background.setVisibility(View.VISIBLE);//
        LAST_STATE = CURRENT_STATE;
    }

 

  //防止快速滑动白圈不还原;sv_remote是rootView,这样是要是根View滑动的时候就会还原
        sv_remote.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        iv_navigation_background.clearAnimation();
                        iv_navigation_background.setVisibility(View.INVISIBLE);
                    }
                });
                return false;
            }
        });

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值