2012-05-03 12 views
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); 


} 

質問はなぜ?

EDIT 1

私はジャンプが比較的大きな振幅で発生するので、これはノイズではないと思います。

FIXED

それはバグでした。 get/setTranslationX/Y()の私の使い方は、タッチイベントの座標を妨害していました。明らかに、イベントは翻訳を考慮に入れます。自分の翻訳分野に変更したとき、振動は消えました。

答えて

3

タッチスクリーンは完全なデバイスではないため、座標にノイズが発生します。あまり頻繁に、特にスムージングを行わずに頻繁に更新すると、報告された座標のノイズのためにサークルが飛び跳ねることになります。

おそらくあなたは、1つまたは両方のやりたい:座標は、少なくとも最低限の量によって

  • を変更した場合は、平滑化フィルタを実装

    • あまり頻繁に更新、または特に更新のみを、例えば、ランニング平均、またはより魅力的なアルゴリズムである。

  • +0

    まさに私が書いていたものです。 :) –

    +0

    しかし、あなたはどちらも間違った人でした:)私の更新を見てください:) –

    1

    私はタッチインターフェースでしか作業しませんでしたが、あなたの指が他のほとんどのようなものであれば、画面上の多くの場所に一度に触れると思います。

    フィードバックは、タッチ中に画面上で最も大きいポイントの平均に沿っている場合があります。

    あなたが処理するonTouchEventの数を平均化してみてください。セットfpsにすると、いくつかの呼び出しは無視されますが、スムーズなドラッグを作成するのに十分なFPSがあります。

    入力フィルタリング/平均化も同様にして、受け取ったポイントが受信した以前のX入力の平均よりも大きくならないようにすることもできます。だから、あなたの指が(私のように)ちょっとした酔いがある場合、それはそれ自体を払拭します。

    関連する問題