package com.quark.company.function; import java.io.UnsupportedEncodingException; import java.util.Hashtable; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.ColorDrawable; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageView; import android.widget.PopupWindow; 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 com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import com.qingmu.jianzhidaren.R; public class CodePopupWindow extends PopupWindow { private Button btn_cancel; private View mMenuView; private ImageView qrImgImageView; Bitmap mBitmap; public int status = 0; // 图片宽度的一般 private static final int IMAGE_HALFWIDTH = 50; public CodePopupWindow(Activity context, OnClickListener itemsOnClick,String code_url) throws WriterException { super(context); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mMenuView = inflater.inflate(R.layout.alert_dialog_code, null); qrImgImageView = (ImageView) mMenuView.findViewById(R.id.qiandao_code); // 生成二维码 // res= getResources();activity的方法上下文获取 mBitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.code_logo); // 缩放图片 Matrix m = new Matrix(); float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth(); float sy = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getHeight(); m.setScale(sx, sy); // 重新构造一个40*40的图片 mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), m, false); // mBitmap = EncodingHandler.createQRCode(url, 420);//生成二维码 WindowManager wm = (WindowManager)context .getSystemService(Context.WINDOW_SERVICE); Log.e("codeUrl", "返codeUrl来的数据" + code_url); try { int width = wm.getDefaultDisplay().getWidth();//屏幕 int height = wm.getDefaultDisplay().getHeight(); mBitmap = cretaeBitmap(new String(code_url.getBytes(), "ISO-8859-1"),width*1/3); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } qrImgImageView.setImageBitmap(mBitmap); btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel); // 取消按钮 btn_cancel.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 销毁弹出框 status= 1; dismiss(); } }); // 设置SelectPicPopupWindow的View this.setContentView(mMenuView); // 设置SelectPicPopupWindow弹出窗体的宽 this.setWidth(LayoutParams.FILL_PARENT); // 设置SelectPicPopupWindow弹出窗体的高 this.setHeight(LayoutParams.WRAP_CONTENT); // 设置SelectPicPopupWindow弹出窗体可点击 this.setFocusable(true); // 设置SelectPicPopupWindow弹出窗体动画效果 this.setAnimationStyle(R.style.AnimBottom); // 实例化一个ColorDrawable颜色为半透明 ColorDrawable dw = new ColorDrawable(0xb0000000); // 设置SelectPicPopupWindow弹出窗体的背景 this.setBackgroundDrawable(dw); // mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框 mMenuView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { int height = mMenuView.findViewById(R.id.pop_layout).getTop(); int y = (int) event.getY(); if (event.getAction() == MotionEvent.ACTION_UP) { if (y < height) { dismiss(); } } return true; } }); } /** * 生成二维码 * * @param 字符串 * @return Bitmap * @throws WriterException */ public Bitmap cretaeBitmap(String str, int widthAndHeight) throws WriterException { Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // hints.put(EncodeHintType.MARGIN, 1); // 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败 // BitMatrix matrix= new MultiFormatWriter().encode(str, // BarcodeFormat.QR_CODE, 300, 300); BitMatrix matrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight, hints); int width = matrix.getWidth(); int height = matrix.getHeight(); // 二维矩阵转为一维像素数组,也就是一直横着排了,logo位于中间 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; } else { // 无信息设置像素点为白色 pixels[y * width + x] = 0xffffffff; } } } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); // 通过像素数组生成bitmap bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; } }