我创建了一个类,用于允许用户通过在条形图上滑动手指来水平重定位视图,代码是这个
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来恢复正常... 这真的没有意义...... 关于如何解决它的一些想法?
答案 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);