碎步二:zxing核心包生成条形码和二维码

        最近闲得无趣,于是写点技术知识放到博客上,希望以后对自己有所帮助。随着时代的发展,二维码已经悄悄的被时代所认可,不管是个人或者公司,二维码受到很多人的认可,如今在互联网上二维码几乎随处可见。废话不多说,下面进入主题。

        首先展示一下效果图:

         http://

        本应用引入的是android提供的zxing2.2的核心包zxing-2.2-core.jar

步骤一:将下载的jar包文件复制到libs文件夹下,myeclipse会自动加载


步骤二:编写界面的布局文件main.xml,代码如下:

<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"
    >
    <TextView
        android:id="@+id/tips_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentTop="true"
        android:layout_margin="15dp"
        android:textColor="#000000"
        android:textSize="20sp"
        android:text="@string/tips" />
    <EditText 
        android:id="@+id/input_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/input_content"
        android:layout_margin="10dp"
        android:layout_below="@id/tips_tv"/>
    <LinearLayout
        android:id="@+id/select_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/input_et"
        android:layout_margin="15dp"
        android:orientation="horizontal">
        <Button 
            android:id="@+id/btn_one"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:text="@string/one_code"
            />
        <Button 
            android:id="@+id/btn_two"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:text="@string/two_code"
            />
    </LinearLayout>
    <ImageView 
        android:id="@+id/qr_code"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:src="@drawable/ic_launcher"
        android:contentDescription="@string/image_content_description"
        android:layout_below="@id/select_btn"
        android:layout_margin="20dp"
        />
</RelativeLayout>

效果图:


步骤三:编写布局文件对应的主Activity,MainActivity.java文件,代码如下:

package com.zyz.qrcodetest;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
/**
 * 思路:
 * 1、初始化界面和控件
 * 2、添加按钮监听事件
 * 3、用户输入合法性验证
 * 4、调用生成条形码或二维码的方法
 * 5、界面显示生成的图片
 */
public class MainActivity extends Activity {
	//用户输入的需要转换的字符输入框
	private EditText inputET;
	//条形码和二维码按钮
	private Button btnOne,btnTwo;
	//生成的条形码或二维码的图片
	private ImageView qrCode;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//设置界面无标题
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.main);
		//初始化界面,实例化对象
		initView();
		//给相应的控件添加监听器
		addListener();
	}

	private void addListener() {
		/**
		 * 设置条形码按钮监听器
		 */
		btnOne.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//该变量用于保存用户输入的字符串
				String url = inputET.getText().toString().trim();
				//判断用户输入的字符串是否包含中文
				for(int i = 0;i<url.length();i++){
					int c = url.charAt(i);
					//若包含中文,提示用户条形码不能包含中文,同时结束该操作
					if(19968<=c && c<40623){
						//提示用户
						Toast.makeText(MainActivity.this, "不能包含中文", Toast.LENGTH_SHORT).show();
						return;
					}
				}
				//生成的条形码图片
				Bitmap image = null;
				try {
					//当用户输入的url不为空时
					if(url != null && !"".equals(url)){
						//将用户输入的url作为参数,调用创建条形码的方法,生成条形码图片
						image = createOneQRCode(url);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
				
				if(image != null){
					//将生成的条形码显示到界面的图片中
					qrCode.setImageBitmap(image);
				}
			}
		});
		/**
		 * 设置二维码按钮的监听器
		 */
		btnTwo.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//用户输入的需要生成二维码的url字符串
				String url = inputET.getText().toString().trim();
				//声明生成的二维码图片
				Bitmap image = null;
				
				try {
					//当用户输入的字符串url不为空时
					if(url != null && !"".equals(url)){
						//将用户输入的url作为参数,调用创建二维码的方法
						image = createTwoQRCode(url);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
				//若生成的二维码不为空,即生成二维码成功
				if(image != null){
					//将生成的二维码显示给用户
					qrCode.setImageBitmap(image);
				}
			}
		});
	}

	/**
	 * 初始化界面和控件
	 */
	private void initView() {
		inputET = (EditText)findViewById(R.id.input_et);
		btnOne = (Button)findViewById(R.id.btn_one);
		btnTwo = (Button)findViewById(R.id.btn_two);
		qrCode = (ImageView)findViewById(R.id.qr_code);
	}
	
	/**
	 * 创建条形码的方法
	 * @return
	 * @throws Exception 
	 */
	public Bitmap createOneQRCode(String content) throws Exception {
		// 生成一维条码,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
		BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.CODE_128, 500, 200);
		//矩阵的宽度
		int width = matrix.getWidth();
		//矩阵的高度
		int height = matrix.getHeight();
		//矩阵像素数组
		int[] pixels =  new int[width * height];
		//双重循环遍历每一个矩阵点
		for(int y = 0;y<height;y++){
			for(int x = 0;x<width;x++){
				if(matrix.get(x, y)){
					//设置矩阵像素点的值
					pixels[y * width +x] = 0xff000000;
				}
			}
		}
		//根据颜色数组来创建位图
		/**
		 * 此函数创建位图的过程可以简单概括为为:更加width和height创建空位图,
		 * 然后用指定的颜色数组colors来从左到右从上至下一次填充颜色。
		 * config是一个枚举,可以用它来指定位图“质量”。
		 */
		Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
		// 通过像素数组生成bitmap,具体参考api
		bm.setPixels(pixels, 0, width, 0, 0, width, height);
		//将生成的条形码返回给调用者
		return bm;
	}
	
	/**
	 * 创建二维码的方法
	 * @return
	 * @throws Exception 
	 */
	public Bitmap createTwoQRCode(String content) throws Exception {
		// 生成二维码,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
		BitMatrix matrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, 300, 300);
		//矩阵的宽度
		int width = matrix.getWidth();
		//矩阵的高度
		int height = matrix.getHeight();
		//矩阵像素数组
		int[] pixels = new int[width * height];
		//双重循环遍历每一个矩阵点
		for(int y = 0;y<height;y++){
			for(int x = 0;x<width;x++){
				if(matrix.get(x, y)){
					//设置矩阵像素点的值
					pixels[y * width +x] = 0xff000000;
				}
			}
		}
		//根据颜色数组来创建位图
		/**
		* 此函数创建位图的过程可以简单概括为为:更加width和height创建空位图,
		* 然后用指定的颜色数组colors来从左到右从上至下一次填充颜色。
		* config是一个枚举,可以用它来指定位图“质量”。
		*/
		Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
		// 通过像素数组生成bitmap,具体参考api
		bm.setPixels(pixels, 0, width, 0, 0, width, height);
		//将生成的条形码返回给调用者
		return bm;
	}
	
	/**
	 * 重写创建菜单项方法
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		//添加一个退出的菜单项
		menu.add(0, 0, 0, "退出");
		return super.onCreateOptionsMenu(menu);
	}
	/**
	 * 重写菜单项点击事件处理方法
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case 0:
			//结束退出
			this.finish();
			break;
		}
		return super.onOptionsItemSelected(item);
	}
}

至此程序基本完成,下面是strings.xml文件过得内容:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">QRCodeTest</string>
    <string name="action_settings">Settings</string>
    <string name="tips">请输入你要生成的内容:</string>
    <string name="input_content">输入你需要转换的内容</string>
    <string name="one_code">一维码</string>
    <string name="two_code">二维码</string>
    <string name="image_content_description">生成的图片</string>
</resources>

步骤四:测试


至此,本文章结束。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值