[컴][안드로이드] scroll 할 때 속도 구하기

fling 의 속도 구하기, 플링의 속도 구하기,  스크롤 속도 구하기

Velocity of fling

fling(터치화면에서 튕기기) 이라고 부르는 동작을 할 때 fling 의 속도에 따른 scroll 화면을 구하려고 한다면 fling 의 속도(velocity) 를 구할 수 있어야 한다. 속도를 구할 때 써야 하는 android api 는 아래와 같다.
  • addMovement(MotionEvent)
  • computeCurrentVelocity(unit)
  • getXVelocity() / getYVelocity()
addMovement(Event) 는 Event 가 발생한 지점을 시작점으로 지정한다는 얘기고,
computeCurrentVelocity(unit, maximumVelocity) 을 하면, 이 함수를 호출한 시점을 마지막 지점으로 해서 start~end 까지의 속도를 계산한다는 이야기이다. 그리고 이것을 parameter 로 넘기는 unit 의 단위로 반환해 준다. 예를 들면 unit 이 1,000 이면 1000 ms 동안 간 거리를 반환해 주는 것이다. 속도는 m/s 이니까 …(말이 복잡할 수도 있겠다. ㅜ.ㅜ)
그리고 maximumVelocity 는 속도의 한계치이다. 이 속도 이상이 나오지 않도록 해주는 것이다. 너무 빠른 스크롤은 유저한테나 기계한테나 안 좋다.^^
getXVelocity()/getYVelocity(), 그런데 computeCurrentVelocity(unit) 는 return 값이 없다. 즉, 계산만 해준다. 실제로 velocity를 얻어오는 함수는 getXVelocity()/getYVelocity() 이다. 이 함수로 computeCurrentVelocity() 를 호출했을 때 계산해서 저장된 값들을 return 해준다.


how to compute velocity




사용 예


source from : Cross Reference: /android/4.3/frameworks/base/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
public boolean onTouchEvent(MotionEvent ev) {
    ...
    mVelocityTracker.addMovement(ev);
    final int action = ev.getAction();
    switch (action) {
        
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            float maxVelocity = MAX_DISMISS_VELOCITY * mDensityScale;
            mVelocityTracker.computeCurrentVelocity(1000 /* px/sec */, maxVelocity);
            mVelocityTracker.getXVelocity()
            ...



References

  1. http://developer.android.com/reference/android/view/VelocityTracker.html
  2. http://code.metager.de/source/s?refs=maxVelocity&project=android

댓글 2개:

  1. 잘보았습니다~
    요걸 구현해보려 합니다~
    4년이 흐른 현재에도 요런방식으로 플링스크롤 원리가 적용되겠죵?

    답글삭제
    답글
    1. fling 의 속도를 구하시겠다는 말씀이시죠? 가능할 듯 합니다. 아직까지 api 가 사라졌거나 (deprecated), 변경됐다는 말은 없는 듯 하네요.^^

      삭제