1

スムーズなスクロール機能を備えたカスタム ビューを実装したいと思います。Android View.onDraw() には常にクリーンな Canvas があることを読みました。オフスクリーン ビットマップを作成すると、オフスクリーン ビットマップの描画にさらに時間がかかります。したがって、ビュー描画キャッシュを使用することを考えています。

@Override
public void onDraw(Canvas canvas){
    long start = System.nanoTime(); 
    if(redrawAll){
        drawFullScreen(canvas);
        handler.post(new Runnable(){
            @Override
            public void run() {
                cachedBitmap = SampleView4.this.getDrawingCache();
            }                   
        });
    }
    else{
        if(cachedBitmap != null && !cachedBitmap.isRecycled()){
            canvas.drawBitmap(cachedBitmap ,scrollByX, scrollByY, p);
            drawPartOfScreen(canvas, scrollByX, scrollByY);
        }
        handler.post(new Runnable(){
            @Override
            public void run() {
                cachedBitmap = SampleView4.this.getDrawingCache();
            }                   
        });
    }
    Log.d(TAG, "drawTiles take: "+(System.nanoTime() - start) + " ns");     

}

おそらく機能しますが、奇妙な動作をします。時々、キャッシュされたBitmapものが変更されず、onDraw()非常に奇妙に見えることがあります。

drawFullScreen(canvas);そして、主な問題は、ビューがスクロールするたびに呼び出すだけでパフォーマンスがあまり変わらないことです。

私は正しい軌道に乗っていますか?私は Android 4 で開発しているので、ハードウェア アクセラレーションをオンにします。しかし、ドキュメントによると、ビューはハードウェア テクスチャにキャッシュされています。ハードウェア アクセラレーション環境で描画キャッシュが本当に必要ですか?

4

1 に答える 1

0

ハードウェア アクセラレーションがオンの場合、描画キャッシュに頼ることはできないと思います。View.setDrawingCacheEnabled() に関するドキュメントによると:

「描画キャッシュを有効にすることは、ハードウェア アクセラレーションがオフになっているときにレイヤーを設定するのと似ています。ハードウェア アクセラレーションがオンになっている場合、描画キャッシュを有効にしてもレンダリングには影響しません。これは、システムがアクセラレーションにフラグを無視する別のメカニズムを使用するためです。ハードウェア アクセラレーションが有効な場合でも、ビューにビットマップを使用したい場合は、ソフトウェアおよびハードウェア レイヤーを有効にする方法について、setLayerType(int, android.graphics.Paint) を参照してください。"

于 2013-08-15T10:57:32.663 に答える