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...
那真的没有意义...
关于如何修复它的一些想法?
初步猜测:设备上还有其他手指导致移动工作不稳定
第二个猜测: 现在您似乎正在使用更像 moveX
的 setX
方法并指定函数移动的增量。这可能不是它的设计目的
第三点:
有时 move 函数的行为很挑剔。它总是 运行(只要屏幕上有指针)并且取决于手指的位置。我建议更改功能以使其像一个步骤
建议
使动作像采用一个值的阶梯函数一样移动
case MotionEvent.ACTION_MOVE:
int currentX = (int)evt.getX();
if(abs(currentX)>10)currentX=(int) currentX/5;
toDrag.setX(currentX-offset);
我创建了一个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... 那真的没有意义... 关于如何修复它的一些想法?
初步猜测:设备上还有其他手指导致移动工作不稳定
第二个猜测: 现在您似乎正在使用更像 moveX
的 setX
方法并指定函数移动的增量。这可能不是它的设计目的
第三点: 有时 move 函数的行为很挑剔。它总是 运行(只要屏幕上有指针)并且取决于手指的位置。我建议更改功能以使其像一个步骤
建议 使动作像采用一个值的阶梯函数一样移动
case MotionEvent.ACTION_MOVE:
int currentX = (int)evt.getX();
if(abs(currentX)>10)currentX=(int) currentX/5;
toDrag.setX(currentX-offset);