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

简介:

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

    1.毛玻璃效果:BitmapUtils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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使用方法:

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

    2.动态生成二维码:QrCodeUtil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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<EncodeHintType, String> 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();
     }
}

    使用方法:

1
QrCodeUtil.createQRCode(pc_iv1, str,  300 );

    3.增大点击热区:ExpandViewRectUtils

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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);
                 }
             }
         });
     }
}

    使用方法:

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

    效果如下图:

    wKiom1mKwHLitb95ABMSEs3r4Uo345.gif

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

    另附图:

    wKioL1mKwXiQ6L8YAAhb04uYOUo142.png









本文转自 吴雨声 51CTO博客,原文链接:http://blog.51cto.com/liangxiao/1954841,如需转载请自行联系原作者

目录
相关文章
|
3月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
234 1
|
1月前
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
222 2
|
2月前
|
XML IDE 开发工具
🔧Android Studio高级技巧大公开!效率翻倍,编码不再枯燥无味!🛠️
【9月更文挑战第11天】在软件开发领域,Android Studio凭借其强大的功能成为Android开发者的首选IDE。本文将揭示一些提升开发效率的高级技巧,包括自定义代码模板、重构工具、高级调试技巧及多模块架构。通过对比传统方法,这些技巧不仅能简化编码流程,还能显著提高生产力。例如,自定义模板可一键插入常用代码块;重构工具能智能分析并安全执行代码更改;高级调试技巧如条件断点有助于快速定位问题;多模块架构则提升了大型项目的可维护性和团队协作效率。掌握这些技巧,将使你的开发之旅更加高效与愉悦。
64 5
|
3月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
55 1
|
3月前
|
Android开发
Android Studio: 解决Gradle sync failed 错误
本文介绍了解决Android Studio中出现的Gradle同步失败错误的步骤,包括从`gradle-wrapper.properties`文件中获取Gradle的下载链接,手动下载Gradle压缩包,并替换默认下载路径中的临时文件,然后重新触发Android Studio的"Try Again"来完成同步。
1305 0
Android Studio: 解决Gradle sync failed 错误
|
3月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
128 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
3月前
|
API 开发工具 Android开发
Android Studio:解决AOSP自编译framework.jar引用不到的问题
在Android Studio中解决AOSP自编译framework.jar引用问题的几种方法,包括使用相对路径、绝对路径和通过`${project.rootDir}`动态获取路径的方法,以避免硬编码路径带来的配置问题。
216 0
Android Studio:解决AOSP自编译framework.jar引用不到的问题
|
3月前
|
Java 网络安全 开发工具
UNITY与安卓⭐一、Android Studio初始设置
UNITY与安卓⭐一、Android Studio初始设置
|
3月前
|
Java 开发工具 Android开发
Android Studio利用Build.gradle导入Git commit ID、Git Branch、User等版本信息
本文介绍了在Android Studio项目中通过修改`build.gradle`脚本来自动获取并添加Git的commit ID、branch名称和用户信息到BuildConfig类中,从而实现在编译时将这些版本信息加入到APK中的方法。
71 0
|
3月前
|
IDE API 开发工具
与Android Gradle Plugin对应的Gradle版本和Android Studio版本
与Android Gradle Plugin对应的Gradle版本和Android Studio版本
402 0