我写了自己的extends View
,但效果不好。它的目的是允许拖动红色圆圈。不幸的是,圆圈在拖动过程中会振动,即不能平滑移动:
public class FieldView extends View {
private int cellWidth;
private int cellHeight;
private float startleft, starttop;
private float startx, starty;
private Paint paint;
public FieldView(Context context) {
super(context);
paint = new Paint();
paint.setColor(Color.RED);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawOval(new RectF(
getTranslationX()-(float)cellWidth/2f,
getTranslationY() - (float)cellHeight/2f,
getTranslationX() + (float)cellWidth/2f,
getTranslationY() + (float)cellHeight/2f), paint);
}
public void setCellWidth(int value) {
this.cellWidth = value;
}
public void setCellHeight(int value) {
this.cellHeight = value;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if( event.getActionMasked() == MotionEvent.ACTION_DOWN ) {
startx = event.getX();
starty = event.getY();
startleft = getTranslationX();
starttop = getTranslationY();
return true;
}
else if( event.getActionMasked() == MotionEvent.ACTION_UP ) {
setTranslationX( startleft + (event.getX() - startx) );
setTranslationY( starttop + (event.getY() - starty) );
invalidate();
startx = starty = 0;
return true;
}
else if( event.getActionMasked() == MotionEvent.ACTION_MOVE ) {
setTranslationX( startleft + (event.getX() - startx) );
setTranslationY( starttop + (event.getY() - starty) );
invalidate();
return true;
}
else {
return false;
}
}
}
转轮:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FieldView fieldView = new FieldView(this);
fieldView.setCellHeight(100);
fieldView.setCellWidth(100);
setContentView(fieldView);
}
问题是:为什么?
编辑1
我不认为这是一种噪音,因为跳跃发生的幅度相对较大。
固定
这是一个错误。我对get / setTranslationX / Y()的使用干扰了触摸事件坐标。显然,事件需要考虑翻译。当我改变自己的翻译领域时,振动就消失了。
答案 0 :(得分:3)
touchscreeen不是一个完美的设备,坐标会有一些噪音。更新太频繁,特别是没有任何平滑,会导致圆圈因报告坐标中的噪音而跳转。
可能你想做其中一个或两个:
更新频率较低,或者只有在坐标更改至少最少量时才更新
实施平滑滤波器,例如运行平均值或发烧友算法。
答案 1 :(得分:1)
我只是简单地使用了触摸界面,但我想如果你的手指和大多数人一样,他们会立刻触摸屏幕上的许多地方。
您获得的反馈可能更符合触摸期间屏幕上最大点的平均值。
尝试平均你将要处理的onTouchEvent的数量。把它放在一个设定的fps,这样一些调用被忽略,但仍然足够高的FPS来创建一个很好的平滑拖动。
您可能还希望进行某种输入过滤/平均,以便接收的点永远不会大于先前接收的X输入量的平均值。因此,如果你的手指(像我的手指)有点胖,它就会自我平衡。