標籤:android ring super http center lis googl image text
今天我們來學習一個自動產生二維碼 的寫法。我們經常能見到各種二維碼,比如公眾號的二維碼,網址的,加好友的,支付的二維碼等等。其實每一個二維碼只是利用圖片的形式展示出來的,實際是一些字串。而這個字串可以通過我們識別二維碼的工具下顯示出來。所謂產生二維碼說白了就是將字串用圖片形式展現出來。。真正厲害的是識別的工具。當然,我目前只會產生這樣的二維碼圖片,讓我們一起來學習一下吧。
首先我們得先寫個布局。
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 <EditText12 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 <Button25 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 <ImageView35 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; }}
這樣我們運行後就會這樣。
用能識別二維碼的工具就可以掃碼識別了。
當然如果單純這樣是不行。因為這裡要用一個很重要的jar 包,沒有就引用不了。產生不了代碼。
一定要加上這個 jar 包哦。
今天大概就這些內容,很簡單是不是,上面很多代碼都是牛人寫好的套路,所以我們引用便是,有能力了可以考慮寫自己的一套產生二維碼 的代碼。
最後多說一句,不要用二維碼幹壞事喲。我們是有水平的程式猿!!!
Android_demo之產生二維碼