2

ビュー要素の下に滑らかな影をドロップしようとしています。これが私がこれまでに行ったことです:

dispatchDraw(...) をオーバーライドし、次のことを行う FrameLayout (私の ShadowViewport) をサブクラス化します。

  • スーパークラスのdispatchDrawを呼び出し、出力をビットマップとして保存
  • このビットマップからアルファを抽出する
  • ぼかし
  • いくつかのオフセットでぼやけた抽出されたアルファを描画します
  • 元のビューのビットマップを描画する

    @Override
    protected void dispatchDraw(Canvas canvas) {
        Log.d("ShadowViewport", "dispatchDraw");
    
        final Bitmap output = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
        final Canvas sCanvas = new Canvas(output);
    
        // Draw internal view in canvas
        super.dispatchDraw(sCanvas);
        final Bitmap original = output.copy(Config.ARGB_8888, true);
    
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(0x55000000);
        paint.setMaskFilter(new BlurMaskFilter(SHADOW_SIZE, Blur.NORMAL));
    
        canvas.drawBitmap(output.extractAlpha(), 0, SHADOW_SIZE, paint);
        canvas.drawBitmap(original, 0, 0, null);
    }
    

結果

ここで画像を見つけてください。ご覧のとおり、左のボックスは角が丸くなっている場合でも、素敵な影が生成されています ;)

質問

on dispatchDraw 関数は、スクロール中などに頻繁に呼び出されます。キャッシュする方法はありますか?

4

1 に答える 1

0

AndroidManifest で android:hardwareAccelerated="true" 属性を有効にすると、画像の自動キャッシュが有効になります。たとえば、スクロール中は、dispatchDraw メソッドは呼び出されません。

また、レイアウト クラスでsetDrawingCacheEnabledを使用することも可能だと思います。これを機能させるには、最初に getDrawingCache を呼び出し、null でない場合は返されたビットマップを呼び出す必要があります。これは「貧乏人の」最適化のように見えますが、古い携帯電話のパフォーマンスを引き出すにはおそらく良い考えです.

于 2012-08-28T22:04:09.210 に答える