今天我們來學習一個自動生成二維碼 的寫法。我們經常能見到各種二維碼,比如公衆号的二維碼,網址的,加好友的,支付的二維碼等等。其實每一個二維碼隻是利用圖檔的形式展示出來的,實際是一些字元串。而這個字元串可以通過我們識别二維碼的工具下顯示出來。所謂生成二維碼說白了就是将字元串用圖檔形式展現出來。。真正厲害的是識别的工具。當然,我目前隻會生成這樣的二維碼圖檔,讓我們一起來學習一下吧。
首先我們得先寫個布局。
activity_main.xml
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:paddingBottom="@dimen/activity_vertical_margin"
6 android:paddingLeft="@dimen/activity_horizontal_margin"
7 android:paddingRight="@dimen/activity_horizontal_margin"
8 android:paddingTop="@dimen/activity_vertical_margin"
9 tools:context="com.example.testzxing.MainActivity" >
10
11 <EditText
12 android:id="@+id/editText1"
13 android:layout_width="wrap_content"
14 android:layout_height="wrap_content"
15 android:layout_alignParentLeft="true"
16 android:layout_alignParentTop="true"
17 android:layout_marginLeft="38dp"
18 android:layout_marginTop="33dp"
19 android:ems="10" >
20
21 <requestFocus />
22 </EditText>
23
24 <Button
25 android:id="@+id/button1"
26 android:layout_width="wrap_content"
27 android:layout_height="wrap_content"
28 android:layout_alignRight="@+id/editText1"
29 android:layout_below="@+id/editText1"
30 android:layout_marginRight="20dp"
31 android:layout_marginTop="22dp"
32 android:text="Button" />
33
34 <ImageView
35 android:id="@+id/imageView1"
36 android:layout_width="wrap_content"
37 android:layout_height="wrap_content"
38 android:layout_alignLeft="@+id/editText1"
39 android:layout_below="@+id/button1"
40 android:layout_marginLeft="14dp"
41 android:layout_marginTop="47dp" />
42
43 </RelativeLayout>
然後在 MainActivity.class中寫功能代碼。注釋中寫得很清楚。
package com.example.testzxing;
import java.util.Hashtable;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
public class MainActivity extends Activity {
private EditText et1;
private Button btn1;
private ImageView iv1;
private static final int IMAGE_HALFWIDTH = 45;//圖檔寬度值大小
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1 = (EditText)findViewById(R.id.editText1);
btn1 = (Button)findViewById(R.id.button1);
iv1 = (ImageView)findViewById(R.id.imageView1);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//取出字元串
String toMakePic_string = et1.getText().toString().trim();
//二維碼中間的圖檔
Bitmap logo= BitmapFactory.decodeResource(getResources(),R.drawable.center);
try {
Bitmap bm=createCode(toMakePic_string,logo,BarcodeFormat.QR_CODE);
iv1.setImageBitmap(bm);
} catch (WriterException e) {
e.printStackTrace();
}
}
});
}
public Bitmap createCode(String string,Bitmap mBitmap, BarcodeFormat format)throws WriterException {
//Matrix,中文裡叫矩陣,在圖像處理方面,主要是用于平面的縮放、平移、旋轉等操作。
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 hst = new Hashtable();
hst.put(EncodeHintType.CHARACTER_SET, "UTF-8");//設定字元編碼
//生成二維碼矩陣資訊
BitMatrix matrix = writer.encode(string, format, 800, 800, 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);
// 通過像素數組生成bitmap
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}
}
這樣我們運作後就會這樣。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL1YDMxkDNyADMx0SO3EDMzgDM0EDOyITM2EDMy0yM1UzM2ATMvwlMxYTMwIzLcNTN1MjNwEzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
用能識别二維碼的工具就可以掃碼識别了。
當然如果單純這樣是不行。因為這裡要用一個很重要的jar 包,沒有就引用不了。生成不了代碼。
一定要加上這個 jar 包哦。
今天大概就這些内容,很簡單是不是,上面很多代碼都是牛人寫好的套路,是以我們引用便是,有能力了可以考慮寫自己的一套生成二維碼 的代碼。
最後多說一句,不要用二維碼幹壞事喲。我們是有水準的程式猿!!!
轉載于:https://www.cnblogs.com/heyhhz/p/6229290.html