Android二维码之创建

  由于微信的推出二维码走进了我们的生活,并且越来越多的人们正在发挥着自己的想象力去使用它,来方便我们的生活,我曾经听说过一个笑话,当我们死后,墓碑上不再有墓志铭,而会出现一个记录你一生信息的二维码,当人们走到你们的墓碑前,掏出手机扫一扫就可以看到你一生的丰功伟绩。这是不是很有意思,我都认这会在不久的将来成为现实,哈哈,玩笑说完了,下面我们来一起学习一下如何在Android开发中让二维码为我们服务。

  本篇我将会带领朋友们实现一个记录个人基本信息的二维码设计思路,对于搞过算法的大牛们,这里要让你们失望了,对于二维码生成的算法,本人才疏学浅尚且无法为大家分享,本篇事例的实现我们将借助core.jar实现,对于这个jar包的下载,我为大家提供一个链接,方便大家学习使用:http://pan.baidu.com/s/1bnGZoF9

  准备好我们的jar包后,我们开始今天的设计,第一步:创建工程,导入jar包

  在我们的集成开发环境中,创建一个Android工程项目,为我们今天事例的设计做铺垫。创建好工程后,将我们刚刚下载好的jar包导入到我们的工程中,Ctrl+c我们的jar包,在我们的工程目录下找到libs文件夹Ctrl+v,然后呢?就是通过集成开发环境将我们的jar包导入到工程。

  

  第二步:创建我们的布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"android:id="@+id/ll"><!-- 用于展示我们创建的二维码 --><ImageViewandroid:id="@+id/imgCode"android:layout_width="100dip"android:layout_height="100dip"android:layout_gravity="center_horizontal" /><!-- 公司 --><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="公司" /><EditTextandroid:id="@+id/etCompany"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="选填" /></LinearLayout><!-- 电话 --><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="电话" /><EditTextandroid:id="@+id/etPhone"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="选填" /></LinearLayout><!-- 邮箱 --><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="邮箱" /><EditTextandroid:id="@+id/etEmail"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="选填" /></LinearLayout><!-- 网址 --><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="网址" /><EditTextandroid:id="@+id/etWeb"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="http://" /></LinearLayout><Button  android:id="@+id/but" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="生成二维码"/></LinearLayout></RelativeLayout>

  第三步:编辑我们Activity:

public class MainActivity extends Activity {private EditText etCompany;private EditText etPhone;private EditText etEmail;private EditText etWeb;private Bitmap logo;private static final int IMAGE_HALFWIDTH = 40;//宽度值,影响中间图片大小
    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获得资源图片,可改成获取本地图片或拍照获取图片logo=BitmapFactory.decodeResource(super.getResources(), R.drawable.ic_launcher);etCompany =(EditText) findViewById(R.id.etCompany);etPhone=(EditText) findViewById(R.id.etPhone);etEmail =(EditText) findViewById(R.id.etEmail);etWeb =(EditText) findViewById(R.id.etWeb); findViewById(R.id.but).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String company=etCompany.getText().toString().trim() ;String phone =etPhone .getText().toString().trim() ; String email = etEmail.getText().toString().trim() ;String web = etWeb.getText().toString().trim() ; //二维码中包含的文本信息String contents= "BEGIN:VCARD\nVERSION:3.0\nORG:"+company+"\nTEL:"+phone+"\nURL:"+web+"\nEMAIL:"+email+"\nEND:VCARD";try {//调用方法createCode生成二维码Bitmap bm=createCode(contents, logo, BarcodeFormat.QR_CODE);ImageView img=(ImageView)findViewById(R.id.imgCode) ;//将二维码在界面中显示
                img.setImageBitmap(bm);} catch (WriterException e) {e.printStackTrace();} }});}/*** 生成二维码* @param string 二维码中包含的文本信息* @param mBitmap logo图片* @param format  编码格式* @return Bitmap 位图* @throws WriterException*/public Bitmap createCode(String string,Bitmap mBitmap, BarcodeFormat format)throws WriterException {Matrix m = new Matrix();float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth();float sy = (float) 2 * IMAGE_HALFWIDTH/ mBitmap.getHeight();m.setScale(sx, sy);//设置缩放信息//将logo图片按martix设置的信息缩放mBitmap = Bitmap.createBitmap(mBitmap, 0, 0,mBitmap.getWidth(), mBitmap.getHeight(), m, false);MultiFormatWriter writer = new MultiFormatWriter();//
        Hashtable<EncodeHintType, String> hst = new Hashtable<EncodeHintType, String>();hst.put(EncodeHintType.CHARACTER_SET, "UTF-8");//设置字符编码BitMatrix matrix = writer.encode(string, format, 400, 400, hst);//生成二维码矩阵信息int width = matrix.getWidth();//矩阵高度int height = matrix.getHeight();//矩阵宽度int halfW = width / 2;int halfH = height / 2;int[] pixels = new int[width * height];//定义数组长度为矩阵高度*矩阵宽度,用于记录矩阵中像素信息for (int y = 0; y < height; y++) {//从行开始迭代矩阵for (int x = 0; x < width; x++) {//迭代列if (x > halfW - IMAGE_HALFWIDTH && x < halfW + IMAGE_HALFWIDTH&& y > halfH - IMAGE_HALFWIDTH&& y < halfH + IMAGE_HALFWIDTH) {//次处位置用于存放图片信息pixels[y * width + x] = mBitmap.getPixel(x - halfW+ IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH);//记录图片每个像素信息} else {if (matrix.get(x, y)) {//如果有黑块点,记录信息pixels[y * width + x] = 0xff000000;//记录黑块信息
                    }}}}Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);// 通过像素数组生成bitmapbitmap.setPixels(pixels, 0, width, 0, 0, width, height);return bitmap;}}

  上面的代码注释已经非常详细,这里我再简单说几句,这部分代码分为上下两部分,上部分都是我们经常使用的,下部分则是我们二维码创建的重点。ok到这里我们的效果就实现了,最后上一张效果图:

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

n个台阶,一个人每次最多走m步,算法实现

今天去公司面试做到这个面试题&#xff0c;想了半天还是想到了用递归&#xff0c;回来重新调整一下代码 public class Climb { private int step; public int total; public Climb(int step) { this.step step; } public void climb(int left){ …

如何开展软件架构之概念架构

如何开展软件架构之概念架构 到目前为止&#xff0c;我们已经完成了需求的分析过程&#xff0c;总结来说&#xff0c;主要的步聚是 一&#xff09;需求结构化&#xff0c; 二&#xff09;分析约束影响 三&#xff09;重点关注质量需求。 那么接下来的阶段则是系统的概念架构了&…

【51单片机快速入门指南】6.1:LCD1602的八线、四线控制及自定义符号,完美兼容Proteus仿真

目录硬知识显示特性接口定义操作时序写操作时序读操作时序寄存器忙标志位BF地址计数器&#xff08;AC&#xff09;显示数据寄存器&#xff08;DDRAM&#xff09;CGROMCGRAM指令清屏指令光标归位指令进入模式设置指令显示开关控制指令设定显示屏或光标移动方向指令功能设定指令设…

在MAC OS 下配置python + Flask ,并支持pyCharm编辑器

https://www.cnblogs.com/lgphp/p/3841098.html 在MAC OS 下配置python Flask ,并支持pyCharm编辑器 flask是一个micro framework &#xff0c;伸缩性很强。可以部署到openshift 的PAAS里。这个框架上手非常快。喜欢的可以试试。 若实在MAC里&#xff0c;python已经默认安装了…

Nginx (LNMP+https)

单向认证与双向认证的概念 什么是单向认证 单项认证就是比如你有个密码用户名然后和服务器上的用户信息进行比对一致的话你们就可以建立连接. 什么是双向认证 SSL的双向认证就是客户端要获取服务端的证书&#xff0c;检查下服务端是不是我可以信任的主机&#xff0c;否则我就认…

MySql简介及概念

关系型数据库系统&#xff1a;建立在关系模型上的数据库系统。 关系模型:当将日常生活中的实体&#xff08;学生&#xff09;&#xff0c;和实体的属性&#xff08;学生的学号&#xff0c;姓名&#xff09;保存数据中时&#xff0c;该如何处理该实体结构。1、数据结构可以规定&…

【51单片机快速入门指南】6.2:SPI 、八线、四线控制 LCD12864 屏幕及Proteus的仿真(支持中文汉字)

目录硬知识LCD12864简介主控芯片ST7920的功能是&#xff1a;驱动芯片ST7921的功能是&#xff1a;引脚功能时序并行通信串行通信指令存储结构操作取模软件的配置示例程序st7920.cst7920.h测试程序显示图片图片1实验现象图片2实验现象显示字符英文实验现象中文实验现象Proteus的仿…

百度推送老是不成功,没有提醒查找原因

AndroidManifest.xml中配置&#xff1a; <!-- 在百度开发者中心查询应用的API Key, MainUIActivity的onCreate方法中记得启动 --><meta-data android:name"api_key" android:value"48YiX3RgcCYmv9aaTcr3uTVK" /> 继承FrontiaApplication publi…

如何让body背景图自适应浏览器窗口大小

html {height:100%; } body {padding:0;margin:0;background:url(images/Starry.jpg) no-repeat;background-size:100% 100%;position:absolute; } https://blog.csdn.net/annaluo/article/details/78280251

【转】java中定义二维数组的几种写法

原文链接 注&#xff1a;以下的 type[][] var 也可以这样申明 type var[][] type为数组的类型&#xff0c;var为变量名 写法一&#xff1a;行列固定的数组 //定义二维数组写法1 class Test {public static void main(String[] args){float[][] numthree; //定义一个flo…

一款jq的计时器

举例子&#xff1a; http://files.cnblogs.com/Alandre/201201031633347950.rar转载于:https://www.cnblogs.com/Alandre/p/3224204.html

【51单片机快速入门指南】仿真实例:幅值可调、频率可调的函数发生器(方波、三角波、正弦波)(1~10kHz)

目录效果设计思路STC89C52 Windows 10 20H2 Proteus 8 Frofessional v8.9 SP2 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 51函数发生器&#xff0c;附工程源码和Proteus仿真文件 效果 0 ~ 5V &#xff0c;50Hz的正弦波&#xff1a; 1 ~ 4V&…

VisualSvn Server介绍

1 、VisualSvn Server VisualSvn Server是免费的&#xff0c;而VisualSvn是收费的。VisualSvn是Svn的客户端&#xff0c;和Visual Studio集成在一起&#xff0c;但是不免费&#xff0c;使用AnkhSvn&#xff08;VS2008插件&#xff09;来代替VisualSvn。使用 VisualSvn Server是…

jsp中页面元素

1.html代码 2.指令&#xff08;page..&#xff09; 3.小脚本&#xff08;<% %>&#xff09; 4.表达式&#xff08;<% %>&#xff09; 5.声明&#xff08;<%! %>&#xff09; 6.注释&#xff08;解释说明&#xff09;转载于:https://www.cnblo…

wordpress 主题教程-笔记

前言&#xff1a;代码参考 &#xff0c;如无特别说明&#xff0c;下面所说的文件&#xff0c;都在 主题目录下。 https://blog.wpjam.com/m/wp-theme-lesson-3-starting-indexphp/ https://github.com/laughing2/wp-theme-tutorial 主题制作步骤 1. 制作好 前端页面 2. 在…

转载 - 最近对问题

之前看过&#xff0c;可是当时没有细看&#xff0c;今天在网上搜了一下&#xff0c;看了一下别人的思路&#xff0c;毕竟这也是一类问题的经典。过一段时间再将自己对其认识总结。现在先转载别人的思路。 出处&#xff1a;http://blog.csdn.net/sd6264456/article/details/9318…

【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取

目录硬知识DS18B20介绍时序初始化时序写时序读时序命令ROM 操作命令ROM 搜索举例存贮器操作命令示例程序DS18B20.cDS18B20.h测试程序定时器中断服务函数单传感器时ID的获取 main.c单传感器读取温度和读取特定ID传感器的温度多路传感器读取普中51-单核-A2 STC89C52 Keil uVisio…

css怎么把背景图片拉伸至100%

div再加上属性&#xff0c; -moz-background-size:100% 100%; background-size:100% 100%; 这样设置后再看网页就会发现背景图片拉伸至100%了。 https://jingyan.baidu.com/article/ceb9fb10a6f68d8cad2ba017.html

SQL多行转多列

--★转换结果如上图 1、首先创建表&#xff1a; CREATE TABLE [成绩表]( [编号] [int]IDENTITY(1,1) NOT NULL, [姓名] [varchar](50)NULL, [语文] [numeric](5, 2)NULL, [数学] [numeric](5, 2)NULL, [英语] [numeric](5, 2)NULL ) ON [PRIMARY] 2、插入测试数据 INSERT INTO …

面向对象程序设计的术语

面向对象程序设计中的术语主要包括类、对象、封装、继承、多态性和消息传递。面向对象的思想通过这些术语得到了具体的体现。 类&#xff1a;是对具有相同类型的对象的抽象。一个对象所包含的数据和代码可以通过类来构造。对象&#xff1a;是运行期的基本实体&#xff0c;它是一…