android studio自定义滑动控件时,使用 ObjectAnimator.ofFloat滑动后,getRight()值不变问题的解决

因为需要左滑显示删除的控件,按照https://blog.csdn.net/qq_36523667/article/details/78628633方法实现时遇到了问题https://ask.csdn.net/questions/768628,最后决定不用ObjectAnimator.ofFloat方法,而直接用layout方法

 layout((getLeft() + offsetX), getTop(), (getRight() + offsetX), getBottom());

具体代码如下,把所有需要ObjectAnimator.ofFloat方法实现动画的地方,用layout方法实现



    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("TestView", "onTouchEvent: ");
        int x = (int) event.getX();
        int y = (int) event.getY();
        Log.d("TestView", "x="+String.valueOf(x)+"y="+String.valueOf(y));

        switch ( event.getAction()){
            case MotionEvent.ACTION_DOWN: {
                Log.d("TestView", "ACTION_DOWN: ");
                MainActivity.rerecyclerView.requestDisallowInterceptTouchEvent(true);
                if (MainActivity.isDeleteIconShown){//删除按钮显示出来时,直接复位
                    if (MainActivity.current == this){
                        Log.d("TestView", "ddddgetRight ="+String.valueOf(getRight())+"getLeft"+
                                String.valueOf(getLeft()));
                        //代替ObjectAnimator.ofFloat方法实现滑动效果
                        for (int i=0; i<buttonWidth/600;i++){
                            layout((getLeft() + offsetX), getTop(), (getRight() + offsetX), getBottom());
                            Log.d("TestView", "uuuuuuugetRight ="+String.valueOf(getRight())+"getLeft"+
                                    String.valueOf(getLeft()));
                        }
                        layout(0, getTop(), itemwidth, getBottom());
                        Log.d("TestView", "uuuuuuuuugetRight ="+String.valueOf(getRight())+"getLeft"+
                                String.valueOf(getLeft()));

                        //ObjectAnimator.ofFloat(this,"translationX",0,itemwidth -getRight()).setDuration(600).start();
                        Log.d("TestView", "ddddddgetRight ="+String.valueOf(getRight())+"getLeft"+
                                String.valueOf(getLeft()));
                        MainActivity.isDeleteIconShown=false;
                    }
                    return false;
                }
                lastX = x;
                lastY = y;
                break;
            }
            case MotionEvent.ACTION_MOVE: {
                Log.d("TestView", "ACTION_MOVE: ");
                offsetX =x-lastX;
                Log.d("TestView", "offsetX="+String.valueOf(offsetX));
                int offsetY=y -lastY;
                itemwidth=getWidth();//全长
                viewGroup = (ViewGroup) getParent();
                textView=getChildAt(1);
                buttonWidth = viewGroup.getChildAt(0).getWidth(); //按钮长度
                Log.d("TestView", "buttonWidth="+String.valueOf(buttonWidth)+"itemwidth="
                        +String.valueOf(itemwidth));

                if (getRight()+offsetX < itemwidth && getRight()+offsetX >= itemwidth-(3*buttonWidth)/2) {//滑动效果
                    layout((getLeft() + offsetX), getTop(), (getRight() + offsetX), getBottom());
                }
                Log.d("TestView", "mmmmmgetRight ="+String.valueOf(getRight())+"getLeft"+
                        String.valueOf(getLeft()));

                break;
            }
            case MotionEvent.ACTION_UP: {
                Log.d("TestView", "ACTION_UP: ");
                //抬手时,滑动距离小于删除控件长度的1/2时,自动向右复位
                if (getRight() <= itemwidth && getRight() >= itemwidth - buttonWidth/2)
                {
                    Log.d("TestView", "*****back star");
                    Log.d("TestView", "1*****getRight ="+String.valueOf(getRight())+"getLeft"+
                            String.valueOf(getLeft()));
                    offsetX=itemwidth-getRight();
                    //代替ObjectAnimator.ofFloat方法实现滑动效果
                    for (int i=0; i<offsetX/600;i++){
                        layout((getLeft() + offsetX), getTop(), (getRight() + offsetX), getBottom());
                        Log.d("TestView", "uuuuuuugetRight ="+String.valueOf(getRight())+"getLeft"+
                                String.valueOf(getLeft()));
                    }
                    layout(0, getTop(), itemwidth, getBottom());

                    Log.d("TestView", "uuuuuuuuugetRight ="+String.valueOf(getRight())+"getLeft"+
                            String.valueOf(getLeft()));

                    Log.d("TestView", "2*****getRight ="+String.valueOf(getRight())+"getLeft"+ String.valueOf(getLeft()));

                }else if (getRight() < itemwidth-(buttonWidth/2))//抬手时,滑动距离大于删除控件长度的1/2时,显示出删除控件
                {

                    Log.d("TestView", "*****show delete");
                    Log.d("TestView", "3*****getRight ="+String.valueOf(getRight())+"getLeft"+ String.valueOf(getLeft()));
                    offsetX=getRight()-(itemwidth-buttonWidth);
                    //代替ObjectAnimator.ofFloat方法实现滑动效果
                    for (int i=0; i<offsetX/600;i++){
                        layout((getLeft() + offsetX), getTop(), (getRight() + offsetX), getBottom());
                        Log.d("TestView", "mmmmmgetRight ="+String.valueOf(getRight())+"getLeft"+
                                String.valueOf(getLeft()));
                    }
                    layout(0-buttonWidth, getTop(), itemwidth-buttonWidth, getBottom());
                    Log.d("TestView", "mmmmmgetRight ="+String.valueOf(getRight())+"getLeft"+
                            String.valueOf(getLeft()));

                    Log.d("TestView", "4*****getRight ="+String.valueOf(getRight())+"  getLeft ="
                            +String.valueOf(getLeft()));
                    MainActivity.isDeleteIconShown=true;
                    MainActivity.current=this;
                }
                break;
            }
        }
        return true;
    }

主要就是,下面的那段代码

                        for (int i=0; i<buttonWidth/600;i++){
                            layout((getLeft() + offsetX), getTop(), (getRight() + offsetX), getBottom());
                            Log.d("TestView", "uuuuuuugetRight ="+String.valueOf(getRight())+"getLeft"+
                                    String.valueOf(getLeft()));
                        }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值