Android自定义横拖抖音

Android custom horizontal drag tremble

我创建了一个class,应该用于允许用户通过在栏上滑动手指来水平移动视图,代码是这样

public class Dragger implements View.OnTouchListener {
  private View toDrag;
  private Point startDragPoint;
  private int offset;
  public Dragger (View bar, View toDragg){
    toDrag = toDragg;
    dragging = false;
    bar.setOnTouchListener(this);
  }
  public boolean onTouch(View v, MotionEvent evt) {
    switch (evt.getAction()) {
        case MotionEvent.ACTION_DOWN:
          startDragPoint = new Point((int) evt.getX(), (int) evt.getY());
          offset = startDragPoint.x - (int) toDrag.getX();
        break;
        case MotionEvent.ACTION_MOVE:
          int currentX = (int)evt.getX();
          Log.d("LOG","currentX=" + currentX);
          toDrag.setX(currentX-offset);
        break;
        case MotionEvent.ACTION_UP:
            int difference = (startDragPoint.x-offset)-(int)toDrag.getX();
            if(difference<-125){
              ((ViewManager) toDrag.getParent()).removeView(toDrag);
            }else{
                toDrag.setX(startDragPoint.x-offset);
            }
            dragging = false;
    }
    return true;
  }
}

在主要 activity 的 oncreate 中,我只是通过调用他的构造函数来使用它:

new Dragger(barItem,itemToDrag);

貌似可以,但是拖的时候好像抖得厉害。。。想弄明白为什么会这么奇怪,于是在ACTION_MOVE里面加了一条Log指令,结果是那...即使我只是逐个像素地向右移动,有时 currentX 而不是增加 1,它会减少一个可变数字,有时是 10,有时是 18,当我转到下一个像素时,它会通过增加而恢复正常1... 那真的没有意义... 关于如何修复它的一些想法?

初步猜测:设备上还有其他手指导致移动工作不稳定

第二个猜测: 现在您似乎正在使用更像 moveXsetX 方法并指定函数移动的增量。这可能不是它的设计目的

第三点: 有时 move 函数的行为很挑剔。它总是 运行(只要屏幕上有指针)并且取决于手指的位置。我建议更改功能以使其像一个步骤

建议 使动作像采用一个值的阶梯函数一样移动

case MotionEvent.ACTION_MOVE:
      int currentX = (int)evt.getX();
      if(abs(currentX)>10)currentX=(int) currentX/5;
      toDrag.setX(currentX-offset);