Android 动态加载二维码视图生成快照的示例

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地址>>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-19 10:12:12

Android 动态加载二维码视图生成快照的示例的相关文章

java 二维码的生成与解析示例代码_java

二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1.  高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍. 2.  编码范围广 该条码可以把图片.声音.文字.签字.指纹等可以数字化的信息进行编码,用条码表示出来:可以表示多种语言文字:可表示图像数据. 3.  容错能力强,具有纠错功能 这使得二维条码因穿孔.污损等引起局部损坏时,照样可以正确

Android应用开发提高系列(5)——Android动态加载(下)——加载已安装APK中的类和资源

前言  Android动态加载(下)--加载已安装APK中的类和资源.   声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com  Android中文Wiki:http://wikidroid.sinaapp.com     正文 一.目标 注意被调用的APK在Android系统中是已经安装的.    上篇文章:Android应用开发提高系列(4)--Android动态加载(上)--加载

android webview打开支付宝二维码扫码支付页面

问题描述 android webview打开支付宝二维码扫码支付页面 做了一个支付宝支付的一个功能,后台传了一个支付宝扫二维码付款的url给我,我这用webview打开这个url. 之前还好好的能打开,最近突然有问题了.现在的情况是webview加载完成了页面显示出来了,但是仅仅只显示1秒钟,立马就跳到找不到网页 求大神告知原因阿!! 解决方案 是不是错误页面被缓存了 清缓存试试 解决方案二: 问下支付宝的官方人员. 解决方案三: 你好,请问你发布的支付宝二维码页面加载失败的问题解决了吗?我现在

Android应用开发提高系列(4)——Android动态加载(上)——加载未安装APK中的类

前言 近期做换肤功能,由于换肤程度较高,受限于平台本身,实现起来较复杂,暂时搁置了该功能,但也积累了一些经验,将分两篇文章来写这部分的内容,欢迎交流! 关键字:Android动态加载   声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com  Android中文Wiki:http://wikidroid.sinaapp.com   正文 一.前提 目的:动态加载SD卡中Apk的类. 注意

Android动态加载jar/dex

前言 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病.   声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com   Android中

Android基于google Zxing实现二维码的生成_Android

最近项目用到了二维码的生成与识别,之前没有接触这块,然后就上网搜了搜,发现有好多这方面的资源,特别是google Zxing对二维码的封装,实现的已经不错了,可以直接拿过来引用,下载了他们的源码后,只做了少少的改动,就是在Demo中增加了长按识别的功能,网上虽然也有长按识别的Demo,但好多下载下来却无法运行,然后总结了一下,加在了下面的Demo中.   下面来介绍这个Demo的主类 public class BarCodeTestActivity extends Activity { priv

Android基于google Zxing实现二维码的生成

最近项目用到了二维码的生成与识别,之前没有接触这块,然后就上网搜了搜,发现有好多这方面的资源,特别是google Zxing对二维码的封装,实现的已经不错了,可以直接拿过来引用,下载了他们的源码后,只做了少少的改动,就是在Demo中增加了长按识别的功能,网上虽然也有长按识别的Demo,但好多下载下来却无法运行,然后总结了一下,加在了下面的Demo中.   下面来介绍这个Demo的主类 public class BarCodeTestActivity extends Activity { priv

fragment 二维码-android fragment 集成扫描二维码功能

问题描述 android fragment 集成扫描二维码功能 我在一个activity里放了一个viewpager,viewpager里填充两个fragment, 其中一个fragment是扫描二维码的功能,扫描完以后会跳到另外一个页面,请做过的人提供一点思路,感谢! 解决方案 你用ZXing这个第三方的扫描sdk就可以了 解决方案二: ZXing识别出url,传值给另一个页面,页面中用webview显示. 解决方案三: http://download.csdn.net/detail/zhuo

android动态加载 jar包 问题

问题描述 android动态加载 jar包 问题 在动态加载jar包时,我在一个项目中生成jar包,用dx优化后,放入另一个项目中调用 为什么不成功呢?如果我把jar包那个项目和调用项目放在一个项目内,就能成功,为什么呢? 解决方案 http://blog.csdn.net/qq591840685/article/details/7866115