BaseRender

import android.graphics.Bitmap;public interface BaseRender {    public abstract void blur(float radius, Bitmap in, Bitmap out);    public abstract void destory();}

Blur

public class Blur {    private static final float BITMAP_SCALE_NOMAL = 0.8f;    private static final float BLUR_RADIUS_NOMAL = 12.0f;        public  static final float BITMAP_SCALE_FAST = 0.2f;    public static final float BLUR_RADIUS_FAST = 5.0f;        private boolean USE_JNI = false;        private BaseRender mRender;        private static Blur instance;        public static Blur getInstance(Context context) {        if(instance == null)            instance = new Blur(context);        return instance;    }        private Blur(Context context) {            mRender = new ScriptIntrinsicBlurRender(context);    }        public Bitmap blur(Bitmap image, boolean fast) {        float scale = BITMAP_SCALE_NOMAL;        float radius = BLUR_RADIUS_NOMAL;                if (fast) {            scale = BITMAP_SCALE_FAST;            radius = BLUR_RADIUS_FAST;        }                int width = Math.round(image.getWidth() * scale);        int height = Math.round(image.getHeight() * scale);                Bitmap bitmap = Bitmap.createScaledBitmap(image, width, height, true);        Bitmap outputBitmap = bitmap.copy(bitmap.getConfig(), true);        mRender.blur(radius, bitmap, outputBitmap);        bitmap.recycle();                return outputBitmap;    }        public void destory() {        if (mRender != null) {            mRender.destory();        }    }    }

RSRender

public abstract class RSRender implements BaseRender {    protected RenderScript rs;        public RSRender(Context ctx) {        rs = RenderScript.create(ctx);    }        @Override    public void blur(float radius, Bitmap in, Bitmap out) {        Allocation tmpIn = Allocation.createFromBitmap(rs, in);        Allocation tmpOut = Allocation.createFromBitmap(rs, out);        blur(radius, tmpIn, tmpOut);        tmpOut.copyTo(out);        tmpIn.destroy();        tmpOut.destroy();    }    public abstract void blur(float radius, Allocation tmpIn, Allocation tmpOut);        @Override    public void destory() {        if (rs != null) rs.destroy();    }}

ScriptIntrinsicBlurRender

public class ScriptIntrinsicBlurRender extends RSRender {    private ScriptIntrinsicBlur theIntrinsic;        public ScriptIntrinsicBlurRender(Context context) {        super(context);        theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));    }    @Override    public void blur(float radius, Allocation tmpIn, Allocation tmpOut) {        theIntrinsic.setRadius(radius);        theIntrinsic.setInput(tmpIn);        theIntrinsic.forEach(tmpOut);    }        @Override    public void destory() {        super.destory();        theIntrinsic.destroy();    }}

调用方式

 Bitmap bitmap = Blur.getInstance(context).blur(bitmap, false);

更多相关文章

  1. Android异步加载图片详解之方式一(4)
  2. 以Dialog方式显示activity
  3. Android调用系统camera
  4. Glide 圆角图片
  5. Android(安卓)Service系列(十七)发送request到后台service
  6. 探索FragmentTransaction#commit()抛出IllegalStateException
  7. Android学习笔记-Android初级 (二)
  8. Android中模拟HOME键功能
  9. android activity与view的联系--window

随机推荐

  1. Android入门:Activity四种启动模式
  2. 非常全的android manifest详解
  3. Notification学习
  4. parseSdkContent failed Could not initi
  5. 第23章 0115-Vue基础与常用指令介绍,学习
  6. Android(安卓)Studio使用技巧系列教程(一)
  7. Android屏幕density, dip等相关概念总结
  8. Android开发者指南(1) —— Android(安卓
  9. Android(安卓)旋转屏幕时禁止Activity重
  10. 在windows平台上搭建Android开发环境-图例