为什么这个移动的圆圈在拖动过程中会振动



我写了自己的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()的使用干扰了触摸事件坐标。显然,事件考虑了翻译。当我切换到自己的翻译领域时,振动消失了。

触摸不

是一个完美的设备,坐标中会有一些噪音。 更新过于频繁,尤其是在没有任何平滑的情况下,会导致圆由于报告坐标中的噪声而跳来跳去。

您可能想执行以下一项或两项操作:

    更新
  • 频率较低,尤其是仅在坐标至少更改最小量时才更新

  • 实现平滑过滤器,例如运行平均值或更高级的算法。

我只对触摸界面进行了简短的工作,但我会想象,如果你的手指像大多数其他手指一样,它们会同时触摸屏幕上的许多位置。

您获得的反馈可能更符合触摸过程中屏幕上最大点的平均值。

尝试平均您将处理的onTouchEvent的数量。 将其置于设定的 fps,以便忽略某些调用,但仍然具有足够高的 FPS 以创建漂亮的平滑拖动。

您可能还需要进行某种输入过滤/平均,以便接收的点永远不会大于之前收到的 X 个输入量的平均值。 因此,如果您的手指(像我的手指)有点矮胖,它会自行平衡。

相关内容

  • 没有找到相关文章

最新更新