美文网首页
View动态移动后的点击事件

View动态移动后的点击事件

作者: AiPuff | 来源:发表于2016-11-28 14:49 被阅读230次

View做在做动画的时候,它并没有真正的移动它的位置。而是根据动画时间的插值,计算出一个Matrix,然后不停的invalidate,在onDraw中的Canvas上使用这个计算出来的Matrix去draw这个View的内容。
换句话说,View在做动画的时候,它的位置根本没有变化,只是画它的时候进行了Matrix处理,使得它看起来变化了。那么,动画中的View点击事件的判断区域,应该是它“看起来”的那片区域,而不是它layout的那片区域。

我相信很多人还是不明白。所以特地找到了一个大牛人写的另外一个博文《Android 动画框架详解》,供大家搞明白Android中的动画原理。明白了Android补间动画的原理之后,然后再读下去。
http://www.ibm.com/developerworks/cn/opensource/os-cn-android-anmt1/index.html

由于android的绘图机制,就算正常情况下移动了view,它所对应的点击事件仍然显示在原来位置上,个人觉得解决方案有两种:
1.正常移动view后,重新绘制view

/**
     * float fromXDelta:这个参数表示动画开始的点离当前View X坐标上的差值;

       float toXDelta, 这个参数表示动画结束的点离当前View X坐标上的差值;

       float fromYDelta, 这个参数表示动画开始的点离当前View Y坐标上的差值;

       float toYDelta)这个参数表示动画开始的点离当前View Y坐标上的差值;

       如果view在A(x,y)点 那么动画就是从B点(x+fromXDelta, y+fromYDelta)点移动到C 点(x+toXDelta,y+toYDelta)点.
     * @param view
     * @param fromXDelta
     * @param toXDelta
     * @param fromYDelta
     * @param toYDelta
     */
    public static void regist_bt_slideview(final View view, final float fromXDelta, final float toXDelta
            , final float fromYDelta, final float toYDelta) {
        //平移动画
        TranslateAnimation animation = new TranslateAnimation(fromXDelta, toXDelta, fromYDelta, toYDelta);
        //Interpolator插值器:OvershootInterpolator向前甩一定值后再回到原来位置,
        // 不懂可以阅读:http://blog.csdn.net/harvic880925/article/details/40049763
        animation.setInterpolator(new OvershootInterpolator());
        //设置动画时长:1s
        animation.setDuration(1000);
        //监听动画
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
            @Override
            public void onAnimationEnd(Animation animation) {
                int left = view.getLeft();
                int top = view.getTop()+(int)(toYDelta-fromYDelta);
                int width = view.getWidth();
                int height = view.getHeight();
                view.clearAnimation();
                view.setX(left);
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
                        RelativeLayout.LayoutParams.WRAP_CONTENT); //The WRAP_CONTENT parameters can be replaced by an absolute width and height or the FILL_PARENT option)
                params.topMargin = top; //Your Y coordinate
                params.setMargins(width/2,top,width/2,0);
                view.setLayoutParams(params);
                //view.layout(left, top, left+width, top+height);
            }
        });
             view.startAnimation(animation);
         }

2.使用ValueAnimator动画,可以参考:

http://blog.csdn.net/harvic880925/article/details/50549385

相关文章

网友评论

      本文标题:View动态移动后的点击事件

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