2017-02-14 2 views
0

onDraw 및 onTouchEvent 메서드가있는 간단한 사용자 지정보기가 있습니다. 내가 필요한 것은 사용자가 2 초 이상 같은 지점 (Y 좌표)에 손가락을 쥐고 있는지 어떻게 든 확인하는 것입니다.사용자가 화면에서 동일한 위치를 2 초 동안 누르고있는 것을 확인하는 방법은 무엇입니까?

편집 : 설명 및 코드가 추가되었습니다.

내 간단한 사용자 정의보기는 사용자 손가락 아래에 수평선을 그립니다. 화면을 가로 질러 위아래로 움직이면 수평선이 생깁니다. 내가하려고하는 것은 사용자가 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 좌표가 runnable이 처음 시작될 때 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를 잡아서 끌기 위해 선이 움직입니다. 내가 원하는 것은 사용자가 2 초 동안 Y 좌표 주위에 선을 잡고 있으면 이미지가 튀어 나오는 것입니다. 대신 ACTION_MOVE에 코드를 삽입하면 어떻게 작동합니까? – DisplayName

+0

나는 사용자가 손을 움직 였는지 여부를 추적해야한다는 것을 제외하면 같은 논리를 적용 할 수 있다고 생각한다. 질문에 더 많은 코드를 제공 할 수 있다면 더 많은 도움이 될 것입니다. 이 논리를 사용하여이 논리가 작동하는지보십시오. – skbrhmn

+0

설명과 함께 코드 추가 :) – DisplayName

관련 문제