要はiOS7以降のBlur effectぽいことをしたい場合。
・
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対応してくれたら嬉しいな〜。