package com.likebamboo.osa.android.ui.view.blur; import android.graphics.Bitmap; import android.graphics.Rect; import android.support.annotation.ColorRes; import android.support.annotation.NonNull; import android.support.annotation.StyleRes; import android.support.v4.app.DialogFragment; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.FrameLayout; import android.widget.ImageView; import com.likebamboo.osa.android.R; /** * BlurDialogFragmentHelper.java * * @author Manabu-GT on 6/12/14. */ public class BlurDialogFragmentHelper { private final DialogFragment mFragment; private ViewGroup mRoot; private ViewGroup mBlurContainer; private View mBlurBgView; private ImageView mBlurImgView; private int mAnimDuration; private int mWindowAnimStyle; private int mBgColorResId; /** * 是否在touch时 dismiss */ private boolean dismissOnTouch = true; public BlurDialogFragmentHelper(@NonNull DialogFragment fragment) { mFragment = fragment; mAnimDuration = fragment.getActivity().getResources().getInteger(android.R.integer.config_mediumAnimTime); mWindowAnimStyle = R.style.DialogSlideAnimation; mBgColorResId = R.color.bg_glass; } /** * Duration of the alpha animation. * @param animDuration The length of ensuing property animations, in milliseconds. * The value cannot be negative. */ public void setAnimDuration(int animDuration) { mAnimDuration = animDuration; } public void setWindowAnimStyle(@StyleRes int windowAnimStyle) { mWindowAnimStyle = windowAnimStyle; } public void setBgColorResId(@ColorRes int bgColorResId) { mBgColorResId = bgColorResId; } public void setDismissOnTouch(boolean dismissOnTouch) { this.dismissOnTouch = dismissOnTouch; } public void onCreate() { mFragment.setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Translucent_NoTitleBar); } public void onActivityCreated() { Window window = mFragment.getDialog().getWindow(); window.setWindowAnimations(mWindowAnimStyle); mRoot = (ViewGroup) mFragment.getActivity().getWindow().getDecorView(); Rect visibleFrame = new Rect(); mRoot.getWindowVisibleDisplayFrame(visibleFrame); mBlurContainer = new FrameLayout(mFragment.getActivity()); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); params.topMargin = visibleFrame.top; params.bottomMargin = mRoot.getHeight() - visibleFrame.bottom; mBlurContainer.setLayoutParams(params); mBlurBgView = new View(mFragment.getActivity()); mBlurBgView.setBackgroundColor(mFragment.getResources().getColor(mBgColorResId)); Util.setAlpha(mBlurBgView, 0f); mBlurImgView = new ImageView(mFragment.getActivity()); Util.setAlpha(mBlurImgView, 0f); mBlurContainer.addView(mBlurImgView); mBlurContainer.addView(mBlurBgView); mRoot.addView(mBlurContainer); Bitmap bitmap = Util.drawViewToBitmap(mRoot, mRoot.getWidth(), visibleFrame.bottom, 0, visibleFrame.top, 3); Bitmap blurred = Blur.apply(mFragment.getActivity(), bitmap); if (blurred == null) { return; } mBlurImgView.setScaleType(ImageView.ScaleType.FIT_XY); mBlurImgView.setImageBitmap(blurred); bitmap.recycle(); View view = mFragment.getView(); if (view != null && dismissOnTouch) { view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mFragment.dismiss(); return true; } }); } } public void onStart() { startEnterAnimation(); } public void onDismiss() { startExitAnimation(); } private void startEnterAnimation() { Util.animateAlpha(mBlurBgView, 0f, 1f, mAnimDuration, null); Util.animateAlpha(mBlurImgView, 0f, 1f, mAnimDuration, null); } private void startExitAnimation() { Util.animateAlpha(mBlurBgView, 1f, 0f, mAnimDuration, null); Util.animateAlpha(mBlurImgView, 1f, 0f, mAnimDuration, new Runnable() { @Override public void run() { mRoot.removeView(mBlurContainer); } }); } }