49

透明にした Linearlayout があります。今はぼかし効果を与える方法を探しているので、その下にあるものはぼやけます。Windows 7 の Aero の外観とまったく同じです (スクリーンショットを参照)。

私はあなたがこのようなぼかし効果を行うことができることを知っています:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

ただし、これは、ダイアログが表示されたときに背景をぼかすなどにのみ適用されます。

ほぼ1時間グーグルで検索しましたが、何も見つかりません。これを行う方法について何か提案はありますか?

ありがとう

Windows 7 エアロ効果

4

6 に答える 6

0

ステップ 1. ぼかしたいビットマップの背景画像の部分をカットします。

ステップ 2. ビットマップのその部分をぼかします。

ステップ 3. 背景としてビットマップを設定します。

Java メソッド

private void applyBlur(final View image, final View layout) {
image.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            image.getViewTreeObserver().removeOnPreDrawListener(this);
            image.buildDrawingCache();

            Bitmap bmp = image.getDrawingCache();

            Bitmap overlay = Bitmap.createBitmap((int) (layout.getMeasuredWidth()),
                    (int) (layout.getMeasuredHeight()), Bitmap.Config.ARGB_8888);

            Canvas canvas = new Canvas(overlay);

            canvas.translate(-layout.getLeft(), -layout.getTop());
            canvas.drawBitmap(bmp, 0, 0, null);

            RenderScript rs = RenderScript.create(getActivity());

            Allocation overlayAlloc = Allocation.createFromBitmap(
                    rs, overlay);

            ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(
                    rs, overlayAlloc.getElement());

            blur.setInput(overlayAlloc);

            blur.setRadius(20);

            blur.forEach(overlayAlloc);

            overlayAlloc.copyTo(overlay);

            layout.setBackground(new BitmapDrawable(
                    getResources(), overlay));

            rs.destroy();
            return true;
        }
    });
}

...

この関数を呼び出します:

呼び出し方法

applyBlur(detail_main_image, titleLayout);

...

//ここで、detail_main_image はぼかし部分を表示する必要がある画像です。//titleLayout は、背景のぼかしを設定する必要があるビューです。

于 2016-05-02T09:43:12.013 に答える
0

レイアウト機能を使って簡単に行うことはできません。

ここで説明されているように、親ビューをキャンバスに描画することをお勧めします: How to make any view to draw to canvas? 前景ビューを非表示にします。次に、キャンバスをぼかし、このデータを背景またはその一部として使用して前景ビューを描画します。

この効果をライブにしたい場合は、非常にリソースを集中的に使用する操作になります。少なくとも、ぼかしの結果をキャッシュしてみてください。

于 2014-03-19T12:02:15.960 に答える