package me.storm.ninegag.view; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Canvas; import android.os.AsyncTask; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.nineoldandroids.view.ViewHelper; import me.storm.ninegag.util.BitmapUtils; import me.storm.ninegag.util.Blur; /** * Created by storm on 14-4-19. * <p/> * 自定义的ActionBarDrawerToggle,同时实现折叠和毛玻璃效果 */ public class BlurFoldingActionBarToggle extends ActionBarDrawerToggle { private static final int DEFAULT_RADIUS = 10; private static final int DEFAULT_DOWN_SAMPLING = 3; private Activity mActivity; private View mContainer; private ImageView mBlurImage; private int mBlurRadius; private int mDownSampling; public BlurFoldingActionBarToggle(Activity activity, DrawerLayout drawerLayout, int drawerImageRes, int openDrawerContentDescRes, int closeDrawerContentDescRes) { super(activity, drawerLayout, drawerImageRes, openDrawerContentDescRes, closeDrawerContentDescRes); this.mActivity = activity; mBlurRadius = DEFAULT_RADIUS; mDownSampling = DEFAULT_DOWN_SAMPLING; } public void onDrawerSlide(android.view.View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, slideOffset); if (drawerView instanceof BaseFoldingLayout) { ((BaseFoldingLayout) drawerView).setFoldFactor(1 - slideOffset); } if (slideOffset > 0.0f) { setBlurAlpha(slideOffset); } else { clearBlurImage(); } } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); clearBlurImage(); } private void setBlurAlpha(float slideOffset) { if (mBlurImage.getVisibility() != View.VISIBLE) { setBlurImage(); } ViewHelper.setAlpha(mBlurImage, slideOffset); } private void setBlurImage() { mBlurImage.setImageBitmap(null); mBlurImage.setVisibility(View.VISIBLE); // do the downscaling for faster processing Bitmap downScaled = BitmapUtils.drawViewToBitmap(mContainer, mContainer.getWidth(), mContainer.getHeight(), mDownSampling); // apply the blur using the renderscript Bitmap blurred = Blur.fastblur(mActivity, downScaled, mBlurRadius); mBlurImage.setImageBitmap(blurred); downScaled.recycle(); } public void setBlurImageAndView(ImageView blurImage, View view) { this.mBlurImage = blurImage; this.mContainer = view; } public void clearBlurImage() { mBlurImage.setVisibility(View.GONE); mBlurImage.setImageBitmap(null); } }