我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么在Android中动态加载二维码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么在Android中动态加载二维码

这篇文章将为大家详细讲解有关怎么在Android中动态加载二维码,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1.需求背景

需要实现一个动态加载但不显示出来的视图,且该视图上有个动态生成的二维码,最后用其去生成一张快照(也就是图片)。
(常见这种情况是来源于“图片分享”的功能需求,与普通图片分享不同在于,该快照图片是动态加载不显示的。)

怎么在Android中动态加载二维码

2.需求功能拆解

  1. 动态二维码的实现

  2. 动态视图生成快照的实现

3.踩坑点提要

  1. 获取不到动态视图的bitmap

  2. 无法获取最新动态视图的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>

大概样式如下:

怎么在Android中动态加载二维码

(上面的线框是用来显示动态生成的二维码图片的)

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()得到的。

  1. 若视图是在界面上直接显示出来的——>那么使用该方法直接获取bitmap是没有问题的;

  2. 若视图是动态加载且不显示出来,那么此时获取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,则两组图对比显示如下:

怎么在Android中动态加载二维码

可以看到,动态生成的快照的宽度也变成了显示二维码的ImageView的宽度了。

扩展:如何在宽高均为size = 0 && mode= UNSPECIFIED 的情况下获取整个屏幕大小的视图呢?
——>用几个隐藏的组件埋在视图的四个边界,啊哈哈哈哈哈!

关于怎么在Android中动态加载二维码就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么在Android中动态加载二维码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么在Android中动态加载二维码

这篇文章将为大家详细讲解有关怎么在Android中动态加载二维码,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.需求背景需要实现一个动态加载但不显示出来的视图,且该视图上有个动态生成的二维
2023-05-30

怎么在Android中利用Listview动态加载数据

怎么在Android中利用Listview动态加载数据?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java代码:package org.developerworks.an
2023-05-30

phpqrcode怎么生成动态二维码

本篇内容主要讲解“phpqrcode怎么生成动态二维码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“phpqrcode怎么生成动态二维码”吧!参数设置:include_once phpqrcod
2023-06-04

C#中怎么加载动态库

这期内容当中小编将会给大家带来有关C#中怎么加载动态库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#语言有很多值得学习的地方,这里我们主要介绍C#实现加载动态库,包括介绍将 C 或 C++ 函数封装成
2023-06-17

C++中怎么动态分配二维数组

C++中怎么动态分配二维数组,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在C++语言中动态的一维数组是通过malloc动态分配空间来实现的,动态的二维数组也可以通过mallo
2023-06-17

Android中怎么利用Xfermode实现动态文字加载动画

这篇文章将为大家详细讲解有关Android中怎么利用Xfermode实现动态文字加载动画,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。第一步:我们要熟悉一下这个图16个图形结果,其实现在有1
2023-05-30

动态加载js文件代码怎么写

今天小编给大家分享一下动态加载js文件代码怎么写的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。具体代码如下:function
2023-07-04

Android在layout xml中如何使用ViewStub完成动态加载

这篇文章主要介绍了Android在layout xml中如何使用ViewStub完成动态加载,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Layout XML文件常见的两
2023-05-30

怎么在Android中加载长图

本篇文章为大家展示了怎么在Android中加载长图,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动
2023-06-14

Delphi中怎么动态加载TreeView信息

在Delphi中,可以使用TTreeNode的AddChild方法来动态加载TreeView信息。以下是一个简单的示例代码:procedure TForm1.Button1Click(Sender: TObject);varNode:
2023-10-21

python中怎么使用Pillow做动态图在图中生成二维码及图像处理

这篇文章主要讲解了“python中怎么使用Pillow做动态图在图中生成二维码及图像处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中怎么使用Pillow做动态图在图中生成二维
2023-06-29

在Android中动态添加Panel框架的实现代码

这里说是框架,说的大了点,其实没有那么复杂,只是一个容易扩展的基类而已。不过至少算是框架类的代码。 代码如下:package arui; import android.app.Activity; import android.os.Ha
2022-06-06

C#中怎么处理动态二维数组函数

这篇文章将为大家详细讲解有关C#中怎么处理动态二维数组函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。对于C#动态二维数组函数处理方案理解我们引入一个例子来看看生活中,有很多事物,仅仅用一
2023-06-17

Android中怎么实现二维码扫描功能

这期内容当中小编将会给大家带来有关Android中怎么实现二维码扫描功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 开发准备1.1 android studio 安装  这里就不
2023-06-04

dll文件怎么在JavaWeb项目中实现动态加载

本篇文章为大家展示了dll文件怎么在JavaWeb项目中实现动态加载,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。第一步 建立一个监听类建立监听类的作用是在应用中间件启动时自动执行加载程序。1)创建
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录