2012-03-19 2 views
7

Android 프로그래밍에서 새로 생겨서 제 문제에 도움을 요청하고 있습니다. MouseEvent.ACTION_DOWN과 MouseEvent.ACTION_UP 사이의 시간을 초/밀리 초 단위로 측정하려고합니다.Android에서 두 MotionEvents 사이의 경과 시간을 측정하십시오.

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    long start=0; 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     // manage down press 
     start=System.nanoTime();//START 
     System.out.println("START"); 
    } 
    else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
     // manage move 
     System.out.println(event.getRawX()+","+event.getRawY()); 
    } 
    else { 
     // manage up 
     long finish=System.nanoTime()//FINISH 
     long seconds = (finish-start)/1000000000;//for seconds 
     Toast.makeText(this, "FINISH, duration: "+seconds, Toast.LENGTH_SHORT).show(); 
     System.out.println("FINISH, duration: "+seconds); 
    } 
    return true; 
} 




Logcat: 
03-19 04:04:27.140: I/System.out(4348): START 
03-19 04:04:27.160: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.190: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.200: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.220: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.250: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.260: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.300: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.310: I/System.out(4348): 517.0,280.0 
03-19 04:04:27.330: I/System.out(4348): FINISH, duration: 16545 

내 문제는 초 변수 (I 위 예 기간 correctly.For의 측정이 16545이라면, 내가 알지도 못하는 원하는 것을 보여주지 않는 것을 사실로 구성 ???! ?)?하지만 1-3 초 사이 여야합니다. 두 초 단위로 정확하게 측정하려면 어떻게해야합니까? 두 개의 MotionEvents 사이의 시간 또는 예가 밀리 초입니까? 고맙습니다 ! MotionEvent

답변

11
long startTime; 
public boolean onTouchEvent(MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) 
     startTime = System.nanoTime();  

    else if (event.getAction() == MotionEvent.ACTION_UP) { 
     long elapseTime = System.nanoTime() - startTime; 
     //do whatever u want with elapseTime now, its in nanoseconds 
    } 
} 
+0

나는 내 잘못을 발견 코드를보고, 감사 : 여기 – Matey

+3

System.currentTimeMillis() 대신'System.nanoTime()'을 사용해야합니다. 두 함수에 대한 javadoc을 읽으십시오. 런타임에서 조정될 수 있기 때문에'currentTimeMillis()'는 측정 간격으로 사용해서는 안된다고합니다. – keaukraine

+0

감사합니다 keaukraine, nanoTime() 사용을위한 변경된 내용 –

8

은 타임 스탬프를 가지고있다. 액세스하려면 getEventTime()을 사용하십시오.

실제로 MotionEvent이 코드에 즉시 전달된다는 보장이 없으므로이 타임 스탬프는 System.getCurrentTimeMillis()에서 얻은 모든 것보다 정확합니다.

private long startTimeInMilliSec; 
@Override 
public boolean onTouchEvent(MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) 
     startTimeInMilliSec = event.getEventTime();  

    else if (event.getAction() == MotionEvent.ACTION_UP) { 
     long elapsedTime = event.getEventTime() - startTimeInMilliSec; 
     //do whatever u want with elapsedTime now, its in milliseconds 
    } 
} 
+1

+1 'android.os.SystemClock.uptimeMillis()'와 함께 사용되는이 기능은 실제 다운 이벤트와 다운 이벤트 사이의 시간을 찾는 정확한 해결책입니다. –

0

은 @CvR에 의해 기술 솔루션입니다 가변 길이 시작, 글로벌 선언 내 기능에서 로컬이 아닌되어야한다, 대단히 감사합니다!
관련 문제