ビュー要素の下に滑らかな影をドロップしようとしています。これが私がこれまでに行ったことです:
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 関数は、スクロール中などに頻繁に呼び出されます。キャッシュする方法はありますか?