拖动后的Stick-To-Edge动画

时间:2014-08-31 16:29:52

标签: android animation edge

我想制作像facebook一样的聊天室。正如您所看到的,当您拖动聊天头时,它会跟随您的手指移动(< - 好吧我可以处理它)。松开手指后,聊天头将移动/粘在屏幕的左/右边缘。您可以查看此clip

编辑:

按照Junior Buckeridge的一些指示,这个效果完成了!但是它看起来并不顺利,尽管我改变了参数:(。检查clip

这是我的代码:

        iv.setOnTouchListener(new View.OnTouchListener() {

        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                initialX = params.x;
                initialY = params.y;
                initialTouchX = event.getRawX();
                initialTouchY = event.getRawY();
                return true;
            case MotionEvent.ACTION_UP:
                while (params.x > 0
                        && params.x < outMetrics.widthPixels - 3)
                    if (params.x <= outMetrics.widthPixels / 2) {
                        TranslateAnimation animate = new TranslateAnimation(
                                params.x, params.x - 3,
                                Animation.RELATIVE_TO_SELF,
                                Animation.RELATIVE_TO_SELF);
                        params.x -= 3;
                        animate.setDuration(100);
                        animate.setFillAfter(true);
                        iv.setAnimation(animate);
                        manager.updateViewLayout(iv, params);
                    } else {
                        TranslateAnimation animate = new TranslateAnimation(
                                params.x, params.x + 3,
                                Animation.RELATIVE_TO_SELF,
                                Animation.RELATIVE_TO_SELF);
                        params.x += 3;
                        animate.setDuration(100);
                        animate.setFillAfter(true);
                        iv.setAnimation(animate);
                        manager.updateViewLayout(iv, params);
                    }
                return true;
            case MotionEvent.ACTION_MOVE:
                params.x = initialX
                        + (int) (event.getRawX() - initialTouchX);
                params.y = initialY
                        + (int) (event.getRawY() - initialTouchY);
                manager.updateViewLayout(iv, params);
                return true;
            }
            return false;
        }
    });

1 个答案:

答案 0 :(得分:1)

您必须处理(MotionEvent.ACTION_UP | MotionEvent.ACTION_CANCEL)事件以确定事件的当前位置。然后计算设备宽度并根据覆盖位置继续。 您可以使用

获取设备宽度
DisplayMetrics dm = context.getResources().getDisplayMetrics();
int w = dm.widthPixels;
boolean goLeft = (event.getRawX() > width/2 - view.getWidth()/2) ? false : true;

编辑: 如果你想设置一个动画,并且你不在活动上下文之外(我认为这会导致使用TranslateAnimation,这将是直截了当的),你必须创建一个基本动画,及时更新布局参数。类似的东西:

while(true){
        if(goLeft){
            if(view.getLeft()/2>0){
                left -= LEFT_STEP;
            }else{
                left = 0;
                break;
            }

        }else{
            if(view.getRight()<w){
                left += LEFT_STEP;
            }else{
                left = w - view.getWidth();
                break;
            }

        }

        SystemClock.sleep(SLEEP_TIME_IN_MILLIS);
    }

尝试改变参数以获得平滑的动画效果。 希望能帮助到你。