天天看點

Android_demo之生成二維碼

今天我們來學習一個自動生成二維碼 的寫法。我們經常能見到各種二維碼,比如公衆号的二維碼,網址的,加好友的,支付的二維碼等等。其實每一個二維碼隻是利用圖檔的形式展示出來的,實際是一些字元串。而這個字元串可以通過我們識别二維碼的工具下顯示出來。所謂生成二維碼說白了就是将字元串用圖檔形式展現出來。。真正厲害的是識别的工具。當然,我目前隻會生成這樣的二維碼圖檔,讓我們一起來學習一下吧。

首先我們得先寫個布局。

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;
    }

}      

這樣我們運作後就會這樣。

Android_demo之生成二維碼
Android_demo之生成二維碼

用能識别二維碼的工具就可以掃碼識别了。

當然如果單純這樣是不行。因為這裡要用一個很重要的jar 包,沒有就引用不了。生成不了代碼。

Android_demo之生成二維碼

一定要加上這個 jar 包哦。

今天大概就這些内容,很簡單是不是,上面很多代碼都是牛人寫好的套路,是以我們引用便是,有能力了可以考慮寫自己的一套生成二維碼 的代碼。

最後多說一句,不要用二維碼幹壞事喲。我們是有水準的程式猿!!!

轉載于:https://www.cnblogs.com/heyhhz/p/6229290.html