2

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

4

2 回答 2

3

触摸屏不是完美的设备,坐标中会有一些噪音。更新太频繁,尤其是没有任何平滑处理,会导致圆因为报告坐标中的噪声而跳动。

可能您想做以下一项或两项:

  • 不那么频繁地更新,或者特别是仅在坐标至少发生最小量的变化时才更新

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

于 2012-05-03T20:23:12.867 回答
1

我只简单地使用过触摸界面,但我想如果你的手指和大多数其他手指一样,它们会同时触摸屏幕上的许多地方。

你得到的反馈可能更符合触摸时屏幕上最大点的平均值。

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

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

于 2012-05-03T20:26:59.953 回答