2017-02-14 4 views
0

私はonDrawとonTouchEventメソッドを持つ単純なカスタムビューを持っています。私が必要とするのは、ユーザーが2秒以上同じ位置(Y座標)に指を持っていたかどうかを何とか確認することです。ユーザーが画面上の同じ場所を2秒間押しているかどうかを確認する方法はありますか?

EDIT:追加の説明とコード。私の単純なカスタムビューが何をしているか

は、ユーザーの指の下に横線を引くです。画面上を上下に移動すると、水平線があなたに続きます。 私がしようとしているのは、ユーザーが2秒間同じ場所に指を持っていた場合にフラグを立てることです()。言い換えれば、ラインが2秒間何らかのY座標の周りに保持されていた場合です。

public class RateView extends View { 

float touchY = (getHeight()/2); 
boolean isPressed = false; 
Paint paint = new Paint(); 

//Bunch of standard constructors 

private void init(Context context, AttributeSet attr) { 
    paint.setColor(ContextCompat.getColor(context, R.color.line)); 
    paint.setStrokeWidth(10); 
    paint.setAntiAlias(true); 
} 

@Override 
public void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    //If pressed -> draw horizontal line 
    if (isPressed) { 
     canvas.drawLine(0, touchY, (canvas.getWidth()), touchY, paint); 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent motionEvent) { 

    switch (motionEvent.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      isPressed = true; 

      break; 
     case MotionEvent.ACTION_MOVE: 
      touchY = motionEvent.getY(); 

      break; 
     case MotionEvent.ACTION_UP: 
      isPressed = false; 

      break; 
    } 
    invalidate(); 
    return true; 
}} 

答えて

0

これを実現するために、実行可能ファイルと組み合わせて実行ファイルを使用することができます。あなたは、ビューがまだ押され、y座標を実行中には、y座標実行可能が最初に起動したときの範囲内にある場合である場合にのみ、2秒後に何をしたい実行のRunnableを実行することができます。コードは次のようになります。

boolean mViewIsPressed = false; 
float yCoordPrev; 
float yCoordCurr; 
Runnable runnable; 

@Override 
public boolean onTouchEvent(final MotionEvent event) { 
    // MotionEvent object holds X-Y values 
    if(event.getAction() == MotionEvent.ACTION_DOWN) { 
     String text = "You click at x = " + event.getX() + " and y = " + event.getY(); 
     Log.d("debug-x: ", String.valueOf(event.getX())); 
     Log.d("debug-y: ", String.valueOf(event.getY())); 
     Toast.makeText(this, text, Toast.LENGTH_LONG).show(); 
     yCoordPrev = event.getY(); 

     runnable = new Runnable() { 
      public void run() { 


       //Check if user is still holding down on the view 
       if (mViewIsPressed) { 
        yCoordCurr = event.getY(); 

        //Check if position that is being held down is the same (or within range) as 2 seconds ago 
        if ((yCoordCurr < yCoordPrev+10) && (yCoordCurr > yCoordPrev -10)){ 
         //Do what you want here after 2 seconds of pressing 
         Log.d("debugFireEvent: ", "fire"); 
        } 
       } 
      } 
     }; 

     handler.postDelayed(runnable, 2000); 
     mViewIsPressed = true; 


    } 
    if(event.getAction() == MotionEvent.ACTION_UP) { 
     if(mViewIsPressed) { 
      mViewIsPressed = false; 
      yCoordCurr = event.getY(); 
      //Cancel the runnable because the user stopped pressing 
      handler.removeCallbacks(runnable); 
      } 
     } 
    return super.onTouchEvent(event); 
} 

あなたは、実行可能ではif文での範囲で遊ぶことができます((yCoordCurr < yCoordPrev+10) && (yCoordCurr > yCoordPrev -10))場合は、より正確にはなく、指は、ユーザーがまだ同じ場所でプレスされた場合でも、少し移動するので、私はそれだと思います範囲を持つ方が良い。

+0

うわー私は、これは私が探していたまさにだと思います。ちょっとした微調整が必​​要です。私のonDrawメソッドでは、ユーザーの指の下に水平線を描いているので、上下に動かすことができます。また、ACTION_MOVEによって座標をキャッチして描画するため、線も移動します。私が達成したいのは、ユーザーがY座標の周りを2秒間保持していて、画像がポップしている場合です。代わりに私のコードをACTION_MOVEに入れると、それはうまくいくのでしょうか? – DisplayName

+0

私は、ユーザーがアップかどうか手を動かすかどうかを追跡する必要があると思い除いて、あなたが同じロジックを適用することができると思います。あなたの質問にもっと多くのコードを提供できるかどうかは、より有益かつ明白です。あなたはこのロジックを使用してみて、これがあなたに役立つかどうかを見てみてください。 – skbrhmn

+0

説明とともにコードを追加しました:) – DisplayName

関連する問題