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 に答える