2012-01-13 2 views
0

제 문제는 제가 스크롤러를 사용하고 캔버스를 그릴 때입니다. 그것은 원활하게 스크롤하지만 비트 맵 + 캔버스를 그릴 때 스크롤러 스크롤이 매우 느리면 스크롤이 너무 무거워서 왜 느린 패션으로 스크롤 하는지를 의미합니다.스크롤러를 부드럽게 스크롤하는 방법은 무엇입니까?

이 문제를 해결하는 방법은 무엇입니까?

+0

죄송합니다. 귀하의 질문에 비판적인 사용자가 답변을하였습니다. 나는 당신이이 질문을 확인하는 것이 좋습니다 : http://stackoverflow.com/questions/4951142/smooth-scrolling-in-android – Will

답변

1

나는 OpenGL도 경험이 없지만 스 와이프 (안드로이드의 API에서 fling이라고 함)는 달성하기가 어렵지 않습니다. 이러한 사용자 정의보기를 할 때 당신이 필요로 우선은 GestureDetector을 구현하고 스크롤러를해야하는 onFling() 방법에 대한보기의 onTouchEvent()

GestureDetector mGD = new GestureDetector(getContext(), 
             new SimpleOnGestureListener() { 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
           float distanceX, float distanceY) { 
     // beware, it can scroll to infinity 
     scrollBy((int)distanceX, (int)distanceY); 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float vX, float vY) { 
     mScroller.fling(getScrollX(), getScrollY(), 
       -(int)vX, -(int)vY, 0, (int)mMaxScrollX, 0, (int)mMaxScrollY); 
     invalidate(); // don't remember if it's needed 
     return true; 
    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
     if(!mScroller.isFinished()) { // is flinging 
      mScroller.forceFinished(true); // to stop flinging on touch 
     } 
     return true; // else won't work 
    } 
}); 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return mGD.onTouchEvent(event); 
} 

OnGestureListener.onScroll() 동안 통화를 직접 View.scrollBy()onTouchEvent()를 호출한다.

Scroller은 참조로 말하면 스크롤을 캡슐화하는 단순한 개체입니다. 그것은 연속 스크롤 또는 flings에 반응하는 데 사용될 수 있습니다. 자체 내에서 날뛰는 스크롤의 "시뮬레이션"시작 Scroller.fling(), 그것을 보면서 당신은 지속적인 다시 그리기 애니메이션과의 부드러움을 복사 할 수 있습니다 : 애니메이션이 실행 될 때까지

입니다
@Override 
protected void onDraw(Canvas canvas) { 
    // ....your drawings.... 

    // scrollTo invalidates, so until animation won't finish it will be called 
    // (used after a Scroller.fling()) 
    if(mScroller.computeScrollOffset()) { 
     scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); 
    } 
} 

, 우리가 도달 한 지점을 계산하고이 스크롤 .

마지막주의 사항 : 아래에서 아무 것도하지 않으려는 경우에도 OnGestureListener.onDown()에서 true를 반환해야합니다. 그렇지 않으면 작동하지 않습니다.

안드로이드 2.2의 Scroller에는 fling 애니메이션이 인수로 전달한 한계에 도달하더라도 실제로 종료되지 않는 버그가 있으므로 (계산 된 오프셋은이를 고려하므로 실제로 이동하지 않습니다)주의해야합니다. .

+0

안녕하세요 마이크, reply.this 개념에 대한 고마워요 때 캔버스가 그릴 때만 괜찮을 때 작동합니다 무승부 이미지 + 캔버스 (비트 맵) 제대로 작동하지 않습니다. –

+1

여기에서 도난당했습니다. http://stackoverflow.com/a/4951681/1228 – Will

관련 문제