最近回看撸撸的代码,有一些自定义的view写法很不错,下面封装出来,希望能帮到大家:

    1.毛玻璃效果:BitmapUtils

package com.example.p030_popbgqcode.utils;import android.content.Context;import android.graphics.Bitmap;import android.renderscript.Allocation;import android.renderscript.Element;import android.renderscript.RenderScript;import android.renderscript.ScriptIntrinsicBlur;import android.view.View;public class BitmapUtils {    /**     * 截图     * @param view     * @return     */    public static Bitmap takeScreenShot(View view) {        view.setDrawingCacheEnabled(true);        view.buildDrawingCache(true);        Bitmap res = Bitmap.createBitmap(view.getDrawingCache());        view.setDrawingCacheEnabled(false);        return res;    }    /**     * 模糊     * @param context     * @param src     * @return     */    public static Bitmap blur(Context context, Bitmap src) {        Bitmap out = Bitmap.createBitmap(src);        // 创建RenderScript内核对象        RenderScript script = RenderScript.create(context);        // 创建一个模糊效果的RenderScript的工具对象        ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(script, Element.U8_4(script));        // 由于RenderScript并没有使用VM来分配内存,所以需要使用Allocation类来创建和分配内存空间。        // 创建Allocation对象的时候其实内存是空的,需要使用copyTo()将数据填充进去。        Allocation inAllo = Allocation.createFromBitmap(script, src);        Allocation outAllo = Allocation.createFromBitmap(script, out);        // 设置渲染的模糊程度, 25f是最大模糊度        blur.setRadius(25f);        // 设置blurScript对象的输入内存        blur.setInput(inAllo);        // 将输出数据保存到输出内存中        blur.forEach(outAllo);        // 将数据填充到Allocation中        outAllo.copyTo(out);        return out;    }}

    PopWindows使用方法:

Bitmap shot = BitmapUtils.takeScreenShot(activity.getWindow().getDecorView());Bitmap blur = BitmapUtils.blur(activity, shot);

    2.动态生成二维码:QrCodeUtil

package com.example.p030_popbgqcode.utils;import android.graphics.Bitmap;import android.widget.ImageView;import com.google.zxing.BarcodeFormat;import com.google.zxing.EncodeHintType;import com.google.zxing.WriterException;import com.google.zxing.common.BitMatrix;import com.google.zxing.qrcode.QRCodeWriter;import java.util.Hashtable;public class QrCodeUtil {    private static int IMAGE_HALFWIDTH = 50;//宽度值,影响中间图片大小    private static final int DEFAULT_SIZE = 500;    /**     * 生成二维码,默认大小为500*500     *     * @param text 需要生成二维码的文字、网址等     * @return bitmap     */    public static void createQRCode(ImageView iv, String text) {        createQRCode(iv, text, DEFAULT_SIZE);    }    /**     * 生成二维码     *     * @param text 需要生成二维码的文字、网址等     * @param size 需要生成二维码的大小()     * @return bitmap     */    public static void createQRCode(final ImageView iv, final String text, final int size) {        new Thread() {            @Override            public void run() {                super.run();                try {                    Hashtable hints = new Hashtable<>();                    hints.put(EncodeHintType.CHARACTER_SET, "utf-8");                    BitMatrix bitMatrix = new QRCodeWriter().encode(text,                            BarcodeFormat.QR_CODE, size, size, hints);                    int[] pixels = new int[size * size];                    for (int y = 0; y < size; y++) {                        for (int x = 0; x < size; x++) {                            if (bitMatrix.get(x, y)) {                                pixels[y * size + x] = 0xff000000;                            } else {                                pixels[y * size + x] = 0xffffffff;                            }                        }                    }                    sleep(500);                    final Bitmap bitmap = Bitmap.createBitmap(size, size,                            Bitmap.Config.ARGB_8888);                    bitmap.setPixels(pixels, 0, size, 0, 0, size, size);                    iv.post(new Runnable() {                        @Override                        public void run() {                            if (iv != null) {                                iv.setImageBitmap(bitmap);                            }                        }                    });                } catch (WriterException e) {                    e.printStackTrace();                    ToastUtil.showToastShort("creat code err");                } catch (InterruptedException e) {                    ToastUtil.showToastShort("creat code err");                    e.printStackTrace();                }            }        }.start();    }}

    使用方法:

QrCodeUtil.createQRCode(pc_iv1, str, 300);

    3.增大点击热区:ExpandViewRectUtils

package com.example.p030_popbgqcode.utils;import android.graphics.Rect;import android.view.TouchDelegate;import android.view.View;public class ExpandViewRectUtils {    /**     * 增大反应热区     * @param view view     * @param top 增大上部热区     * @param bottom 增大下部热区     * @param left 增大左部热区     * @param right 增大右部热区     */    public static void expandViewTouchDelegate(final View view, final int top, final int bottom, final int left, final int right) {        ((View) view.getParent()).post(new Runnable() {            @Override            public void run() {                Rect bounds = new Rect();                view.setEnabled(true);                view.getHitRect(bounds);                bounds.top -= top;                bounds.bottom += bottom;                bounds.left -= left;                bounds.right += right;                TouchDelegate touchDelegate = new TouchDelegate(bounds, view);                if (View.class.isInstance(view.getParent())) {                    ((View) view.getParent()).setTouchDelegate(touchDelegate);                }            }        });    }    /**     * 还原View的触摸和点击响应范围,最小不小于View自身范围     *     * @param view     */    public static void restoreViewTouchDelegate(final View view) {        ((View) view.getParent()).post(new Runnable() {            @Override            public void run() {                Rect bounds = new Rect();                bounds.setEmpty();                TouchDelegate touchDelegate = new TouchDelegate(bounds, view);                if (View.class.isInstance(view.getParent())) {                    ((View) view.getParent()).setTouchDelegate(touchDelegate);                }            }        });    }}

    使用方法:

ExpandViewRectUtils.expandViewTouchDelegate(tv1, 10, 10, 10, 10);

    效果如下图:

    

    地址:https://github.com/geeklx/MyApplication/tree/master/p030_popbgqcode

    另附图:

    Android Studio - 第四十七期 毛玻璃效果以及动态生成二维码以及增大点击热区_第1张图片

更多相关文章

  1. 5.17学习内容 android判断软键盘状态、系统键盘监控、生成中间lo
  2. Android intent 传递数组对象序列化
  3. Android自动化工具Monkeyrunner使用(六) —— 根据ID查找对象
  4. Android 4.2 webview注入js对象时需要注意的问题
  5. android基础学习--->Android SharedPreferences存储对象和图片(An
  6. android Zxing二维码扫描 竖屏切换问题的解决
  7. Android Wear和二维码
  8. android 使用SharedPreferences保存对象

随机推荐

  1. android模拟器发送短信和打电话
  2. Android(安卓)4.0 真实视频泄露
  3. Android Studio 使用自己编译的framework
  4. 转android四种动画
  5. Android RecyclerView(和SnapHelper) 实
  6. Android中WebView使用html,且实现android
  7. Android(安卓)display架构分析二-SW架构
  8. android:XML文件报错!Incorrect line endin
  9. Android(安卓)Intent 使用整理
  10. 【Arcgis for android】相关教程收集自网