自定义控件 二维码生成器控件的开发

package xuganwen.qrcreateview;

import java.util.Hashtable;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.os.Handler;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

public class QRCreateView extends ImageView{

    private String Url;
    private int QR_WIDTH=200;
    
    public QRCreateView(Context context){
        this(context, null);
    }

    private Handler handler=new Handler(){
        public void handleMessage(android.os.Message msg) {
            Bitmap bitmap=(Bitmap)msg.obj;
            QRCreateView.this.setImageBitmap(bitmap);
        };
    };
    
    public QRCreateView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray array=context.obtainStyledAttributes(attrs,R.styleable.MyImageView);
        CharSequence myUrl=array.getText(R.styleable.MyImageView_Url);
        if(myUrl==null||"".equals(myUrl)|| myUrl.length()<1){
            return ;
        }
        this.Url=(String) myUrl;
        createQRCode(this.Url);
    }
    
    public void createQRCode(String Url){
        Url=this.Url;
        Hashtable<EncodeHintType,String> hints=new Hashtable<EncodeHintType,String>();
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); 
        try {
            final BitMatrix bitMatrix=new QRCodeWriter().encode(Url, BarcodeFormat.QR_CODE,QR_WIDTH,QR_WIDTH,hints);
            final int[] pixels = new int[QR_WIDTH * QR_WIDTH];
           
                    for (int i=0;i<QR_WIDTH;i++){
                        for (int j=0;j<QR_WIDTH;j++){
                            if(bitMatrix.get(i,j)){
                                pixels[i*QR_WIDTH+j]=0xff000000;
                            }else{
                                pixels[i+QR_WIDTH+j]=0xffffffff;
                            }
                        }
                    }
            Bitmap bitmap=Bitmap.createBitmap(QR_WIDTH,QR_WIDTH, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels,0,QR_WIDTH,0,0,QR_WIDTH,QR_WIDTH);
            handler.obtainMessage(0, bitmap).sendToTarget();
        } catch (WriterException e) {
            e.printStackTrace();
        }
    }
    public void setUrl(String url){
        this.Url=url;
        createQRCode(url);
    }
    public void setQRWidth(int widthPX){
        this.QR_WIDTH=widthPX;
    }

}


attrs.xml文件
<?xml version="1.0" encoding="utf-8"?>
<resources>
    
    <declare-styleable name="MyImageView">
        <attr name="Url" format="reference|string"></attr>
    </declare-styleable>
</resources>

布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:myview="http://schemas.android.com/apk/res/xuganwen.qrcreateview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="xuganwen.qrcreateview.MainActivity" >

    <xuganwen.qrcreateview.QRCreateView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:id="@+id/image"
        />

</RelativeLayout>


你可能感兴趣的:(自定义控件 二维码生成器控件的开发)