Android 动态加载二维码视图生成快照的示例
作者:ganshenml 发布时间:2023-08-04 19:57:54
1.需求背景
需要实现一个动态加载但不显示出来的视图,且该视图上有个动态生成的二维码,最后用其去生成一张快照(也就是图片)。
(常见这种情况是来源于“图片分享”的功能需求,与普通图片分享不同在于,该快照图片是动态加载不显示的。)
2.需求功能拆解
动态二维码的实现
动态视图生成快照的实现
3.踩坑点提要
获取不到动态视图的bitmap
无法获取最新动态视图的bitmap
4.开发实现
动态加载的视图的布局文件代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/qrcodeContentLl"
android:background="#F0E68C"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="100dp"
android:text="二维码快照"
android:textSize="18sp"
android:textStyle="italic" />
<ImageView
android:id="@+id/qrcodeIv"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:scaleType="fitCenter" />
<!--<TextView-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_marginTop="800dp"-->
<!--android:text="ahahds"-->
<!--android:layout_gravity="center"/>-->
</LinearLayout>
大概样式如下:
(上面的线框是用来显示动态生成的二维码图片的)
a.动态二维码的实现
关于这块内容,网上有太多例子了,其实也不用详解。主要是利用Zxing提供的jar包来进行处理。需要看这块的详细代码可以去文章最后提供的GitHub地址查看,在此只提供下该jar包的资源下载(项目中若只涉及生成二维码模块,那么只要core核心jar包即可):点击下载>> core-3.3.0.jar
b.动态视图生成快照的实现
private void inflateAndShowCaptureView() {
if (hideView == null) {
hideView = LayoutInflater.from(this).inflate(R.layout.layout_quick_capture, null);
qrcodeIv = (ImageView) hideView.findViewById(R.id.qrcodeIv);
hideView.setDrawingCacheEnabled(true);//设置控件允许绘制缓存
hideView.measure(View.MeasureSpec.makeMeasureSpec(mainLayoutLl.getWidth(), View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
hideView.layout(0, 0, hideView.getMeasuredWidth(), hideView.getMeasuredHeight());
} else {
hideView.destroyDrawingCache();//要得到新的视图,就得销毁之前的缓存
}
showCaptureView();
}
private void showCaptureView() {
String content = contentEt.getText().toString().trim();
if (content == null || content.length() == 0) {
return;
}
if (qrcodeIv.getWidth() == 0) {
return;
}
Bitmap qrcodeBitmap = ZXingUtils.createQRImage(content, qrcodeIv.getWidth(), qrcodeIv.getHeight());
qrcodeIv.setImageBitmap(qrcodeBitmap);//先将生成的二维码显示在加载的视图上
Bitmap bitmap = hideView.getDrawingCache(); // 获取视图的绘制缓存(快照)
if (bitmap != null) {
showIv.setImageBitmap(bitmap);
}
}
1.首先获取到视图的bitmap是通过getDrawingCache()得到的。
若视图是在界面上直接显示出来的——>那么使用该方法直接获取bitmap是没有问题的;
若视图是动态加载且不显示出来,那么此时获取bitmap是null。
此处的解决办法就是手动给该视图布局:
hideView.measure(View.MeasureSpec.makeMeasureSpec(mainLayoutLl.getWidth(), View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
hideView.layout(0, 0, hideView.getMeasuredWidth(), hideView.getMeasuredHeight());
以下做点简单解释:
View.MeasureSpec.makeMeasureSpec(int size , int mode)中有两个参数,size和mode,第一组MeasureSpec中我将size设置为了当前显示页面的布局的宽度(也就是屏幕宽度),然后mode设置为EXACTLY——>所表示的意义是:给hideView中的子View指定了精确的宽度大小为当前屏幕的宽度。
mode有三种,EXACTLY,AT_MOST,UNSPECIFIED。在上面代码中,将高度的size指定为0,mode指定为 UNSPECIFIED 则表示——>整个动态加载的视图高度指定为:依据于最后子View确认的高度。
若将第一组MeasureSpec的相关参数也改为size = 0, mode = UNSPECIFIED,则两组图对比显示如下:
可以看到,动态生成的快照的宽度也变成了显示二维码的ImageView的宽度了。
扩展:如何在宽高均为size = 0 && mode= UNSPECIFIED 的情况下获取整个屏幕大小的视图呢?
——>用几个隐藏的组件埋在视图的四个边界,啊哈哈哈哈哈!
2.通过destroyDrawingCache()来删除之前的缓存。
最后,GitHub地址>>
来源:http://blog.csdn.net/ganshenml/article/details/78297543


猜你喜欢
- 在EditText输入数字的时候,通常我们需要限制小数点前后位数。比如金额输入一般我们需要限制小数点后面最多2位。我们可以通过 TextWa
- Spring发布了一个新工具Spring Native Beta,用于将现有的Spring Boot应用程序(用Java或Kotlin编写)
- Netty设置为Https访问SSLContextFactorypublic class SSLContextFactory {
- 一、引入pom<?xml version="1.0" encoding="UTF-8"?>
- Java 8中引入了CompletableFuture类,它是一种方便的异步编程工具,可以处理各种异步操作,如网络请求、文件IO和数据库操作
- 在学习了不少使用string处理字符串的方法后,对于这方面基础内容模块已经初步掌握。对于java面试时,字符串是比较基础和重点的模块,所以在
- 一.协程概述1.概念协程是Coroutine的中文简称,co表示协同、协作,routine表示程序。协程可以理解为多个互相协作的程序。协程是
- 1. xml文件中加入自定义 搜索view<com.etoury.etoury.ui.view.IconCenterEditText
- 前言总结java常见的锁区分各个锁机制以及如何使用使用方法锁名考察线程是否要锁住同步资源乐观锁和悲观锁锁住同步资源后,要不要阻塞不阻塞可以使
- 前言最近在刷java面试题偶然看到这类问题(try/finally中含有return时的执行顺序),觉得挺有意思于是小小的研究了一下,希望经
- 本文实例讲述了Java使用Preference类保存上一次记录的方法。分享给大家供大家参考。具体分析如下:在使用java中JFileChoo
- Activity非异常情况下的生命周期是指,用户正常参与UI交互的情况下,Activity所经过的生命周期的改变;一般情况下,Activit
- 对于clear与new Map的区别。我们首先来看一个例子,本例子是我在实际开发中遇到的,需求就是讲map放入到list中,说白了就是lis
- 使用Kotlin的Lambda表达式,我们可以抛弃回调接口的使用。只需设置希望后面会被调用的函数即可。示例如下新建一个Kotlin类clas
- 1、下载内嵌浏览器Jar包下载地址:点击下载2、项目下加入对应jar;然后右键:Add as Library...3、添加启动项目后事件效果
- 一、ArrayList类概述什么是集合:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变ArrayList集合的特点:底层是数组实
- 本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能。首先看效果图项目结构图接下来用代码重点学习
- 前言本节将介绍如何设置和使用MongoDB 驱动程序,通过 java实现与MongoDB服务端的通信功能,用户可以在此基础上进行各种Java
- 在使用spring boot进行打包的时候出现了一些问题,不是说找不到主类,就是说spring初始化时有些类没有加载。下面介绍一下如何解决。
- 本文实例形式展示了C#中异步调用的实现方法,并对其原理进行了较为深入的分析,现以教程的方式分享给大家供大家参考之用。具体如下:首先我们来看一