Android自定义横向拖动颤抖

时间:2015-06-25 14:02:35

标签: android drag-and-drop slide

我创建了一个类,用于允许用户通过在条形图上滑动手指来水平重定位视图,代码是这个

function drawChart(toChart,dataURL,showLegend,chartHeight)
{   
    var chart1 = c3.generate({
        bindto: toChart,
        data: {
            url: dataURL,
            labels: false
        },
        color: {pattern: ['green','black']},
        zoom: {enabled: false},
        size: {height: chartHeight},
        transition: {duration: 0},
        legend: {show: showLegend}
    });
}

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

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;
  }
}

它显然有效,但拖动时似乎很震撼......我试图理解为什么它的工作如此奇怪,所以我在ACTION_MOVE中添加了一条Log指令,结果就是......即使我只是逐个像素地移动到右边有时是currentX而不是增加1它减少了一个可变数字,有时是10,有时是18,当我去下一个像素时它会通过增加1来恢复正常... 这真的没有意义...... 关于如何解决它的一些想法?

1 个答案:

答案 0 :(得分:1)

首先猜测:设备上还有其他手指导致移动无法正常工作

第二次猜测:现在您似乎正在使用setX方法更像moveX并指定函数移动的增量。这可能不是它为

设计的

第三点: 有时移动功能看起来很挑剔。它始终运行(如屏幕上有指针一样)并取决于手指的位置。我建议更改功能,使其像步骤

<强>建议 使操作像一个带有一个值的步骤函数一样移动

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