Android_demo之產生二維碼

來源:互聯網
上載者:User

標籤: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之產生二維碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.