2012-01-13 12 views
0

私の問題は、私がスクロールを使用してキャンバスを描いているときです。スムーズにスクロールしますが、ビットマップ+キャンバスを描くとスクロールスクロールが非常に遅いということは、スクロールするのが重いことを意味します。スクロールをスムーズにスクロールする方法は?

この問題を解決するにはどうすればよいですか?

+0

申し訳ありません、あなたの質問には非倫理的なユーザーが回答しました。私はあなたがこの質問をチェックすることをお勧めします:http://stackoverflow.com/questions/4951142/smooth-scrolling-in-android – Will

答えて

1

私はOpenGLも加速度センサーでも経験はありませんが、スワイプ(Androidの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は、参照のとおり、スクロールをカプセル化する単純なオブジェクトです。それは連続スクロールやフイングに反応するために使用できます。 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を返すようにしてください。そうしないと動作しません。

Android 2.2のScrollerには引数として渡された制限に達しても実際にアニメーションが終了しないバグがあるので注意してください(計算されたオフセットはそれらを尊重しているため実際には移動しません) 。

+0

こんにちはマイク、描画イメージ+キャンバス(ビットマップ)正しく動作していないbcozは重いです。 –

+1

ここから盗まれたhttp://stackoverflow.com/a/4951681/1228 – Will