・android-stackblurを使う。
・RenderScriptはradiusがMAX25までしか設定できないぽいので期待しない。
・Eclipse想定
StackBlurライブラリの開発プロジェクトへのインストール
・NDK導入・stackblurをDLして、StackBlurディレクトリをプロジェクトimport。
・プロジェクトのコンテキストメニューから、Build Project
・libsディレクトリ配下にビルド成果物ができるので、まるっと開発プロジェクトのlibs配下にコピー
※stackblurのrenderscript8.jarでの競合が無ければIs Libraryでの追加でも大丈夫かも。
利用例
StackBlurManager _stackBlurManager = new StackBlurManager(orig); _stackBlurManager.processNatively(radius); Bitmap blurred = _stackBlurManager.returnBlurredImage();
利用例:Dialogで使う場合
Dialogに背景画像設定する場合は、DialogのWindow層に設定。>そうするとDialogの位置とサイズが崩れる。styleで色々設定しても駄目。
>なのでAlertDialogは諦めて自前でCustomViewを作る必要がある。
>それも含めたベースのDialogFragment
/hoge/fuga/AbstractDialogFragment.java
package hoge.fuga; import com.enrique.stackblur.StackBlurManager; import hoge.fuga.R; import android.annotation.SuppressLint; import android.app.Dialog; import android.content.DialogInterface; import android.content.DialogInterface.OnShowListener; import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.FrameLayout; abstract public class AbstractDialogFragment extends DialogFragment implements OnShowListener { public static final String TAG = "AbstractDialogFragment"; protected Dialog mDialog; private ViewGroup mContainer; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { mDialog = super.onCreateDialog(savedInstanceState); // Get status bar height Rect rectgle= new Rect(); getActivity().getWindow().getDecorView().getWindowVisibleDisplayFrame(rectgle); int statusBarHeight = rectgle.top; // Screen shot http://stackoverflow.com/a/9596132/1121509 View v = getActivity().getWindow().getDecorView(); v.setDrawingCacheEnabled(true); Bitmap ss = v.getDrawingCache(); if (ss != null) { ss = Bitmap.createBitmap(ss, 0, statusBarHeight, ss.getWidth(), ss.getHeight() - statusBarHeight); } v.setDrawingCacheEnabled(false); // Blur effect if (ss != null) { int radius = (int) (ss.getHeight() * 0.25); radius = radius > 100 ? 100 : radius; StackBlurManager _stackBlurManager = new StackBlurManager(ss); _stackBlurManager.processNatively(radius); Bitmap blurred = _stackBlurManager.returnBlurredImage(); mDialog.getWindow().setBackgroundDrawable(new BitmapDrawable(getResources(), blurred)); } // without title mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // set listener mDialog.setOnShowListener(this); return mDialog; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // コンテナの設定 mContainer = (ViewGroup) inflater.inflate(R.layout.dialog_base, container, false); return mContainer; } public void addViewToContainer(View contentView) { ((ViewGroup) mContainer.findViewById(R.id.dialog_container)).addView(contentView, 0); } @SuppressLint("NewApi") @SuppressWarnings("deprecation") @Override public void onShow(DialogInterface dialog) { // サイズ調整、このタイミングでないとうまく動かない Point size = new Point(); Display display = getActivity().getWindowManager().getDefaultDisplay(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { display.getSize(size); } else { size.x = display.getWidth(); size.y = display.getHeight(); } FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)mContainer.getLayoutParams(); lp.width = size.x; lp.height = size.y; ViewGroup dialogContainer = (ViewGroup) mContainer.findViewById(R.id.dialog_container); FrameLayout.LayoutParams lp2 = (FrameLayout.LayoutParams) dialogContainer.getLayoutParams(); lp2.topMargin = (size.y - dialogContainer.getMeasuredHeight()) / 2; } }
/res/layout/dialog_base.xml
・Dialogを使う場合はAbstractDialogFragmentをextend。
・dialogの設定をするときはonCreateDialog()をoverrideしてsuper.onCreateDialog()してから設定。
・ViewはonCreateView()をoverrideして、super.onCreateView()してから子Viewを作り、super.addViewToContainer(childDialogView)する。
GPUImage for androidがblur effect対応してくれたら嬉しいな〜。