AwesomeQRCode第三方库GitHub地址:https://github.com/SumiMakito/AwesomeQRCode
一.添加依赖(最新版本是1.2.0)
dependencies {
implementation 'com.github.SumiMakito:AwesomeQRCode:1.2.0'
}
二.设置基础信息
private Color color;
private StillBackground Sbackground;
private BlendBackground Bbackground;
private GifBackground Gbackground;
private Logo logo;
private RenderOption renderOption;
private Bitmap bitmap;
//从mipmap资源拿图片,作为Logo和背景图(两者可以使用不同图片)
bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_colorful_logo, null);
//调色板颜色信息设置
color = new Color();
color.setLight(0xff000000);//用于空格
color.setDark(0xff000000);//用于非空格
color.setBackground(0xFFFFFFFF);//用于背景(将被背景图像覆盖,如果设置)
color.setAuto(false);//设置为true以自动从背景图像中挑选颜色(仅在背景图像存在时才有效)
//静止背景(静止图像作为背景)
Sbackground = new StillBackground();
Sbackground.setBitmap(bitmap); //背景图
Sbackground.setClippingRect(new Rect(0, 0, 100, 100)); //之前裁剪背景,
Sbackground.setAlpha(0.7f); //要绘制的背景的alpha
//要绘制的背景的alpha
Bbackground = new BlendBackground();
Bbackground.setBitmap(bitmap);//背景图
Bbackground.setClippingRect(new Rect(0, 0, 100, 100));
Bbackground.setAlpha(0.7f);
Bbackground.setBorderRadius(10); //用于混合角的半径
//一个gif背景(动画)
Gbackground = new GifBackground();
Gbackground.setInputFile(gifFile); //将gif图像的文件对象分配给该字段
Gbackground.setOutputFile(new File(pictureStorage, "output.gif")); //输出图像将保存到此文件对象中
Gbackground.setClippingRect(new Rect(0, 0, 200, 200));
Gbackground.setAlpha(0.7f);
//Logo信息设置
logo = new Logo();
logo.setBitmap(bitmap);
logo.setBorderRadius(10); //徽标角的半径
logo.setBorderWidth(10); //徽标周围添加边框的宽度
logo.setScale(0.3f); //在QR码中缩放徽标
logo.setClippingRect(new RectF(0, 0, 100, 100)); //在将徽标图像应用于QR码之前裁剪徽标图像,裁剪的不能大于bitmap宽高
//渲染
renderOption = new RenderOption();
renderOption.setContent("20190716");//要编码的内容
renderOption.setSize(800);//最终QR码图像的大小(不设置大小,直接填充控件大小)
renderOption.setBorderWidth(20);//QR码周围空白区域宽度
renderOption.setEcl(ErrorCorrectionLevel.M);//(可选)指定纠错级别
renderOption.setPatternScale(0.35f);//(可选)指定模式的比例
renderOption.setRoundedPatterns(true);//(可选)如果为true,则将块绘制为点
renderOption.setClearBorder(true);//如果设置为true,则不会在边框区域绘制背景
renderOption.setColor(color);//为QR码设置调色板
renderOption.setBackground(Sbackground);//设置背景
renderOption.setLogo(logo);//设置Logo
三.获取二维码Bitmap
try {
/**
* AwesomeQrRenderer.render(renderOption)可能会出现:
*java.lang.IllegalArgumentException: x + width must be <= bitmap.width()错误
* 宽度超出了你要截的图的宽度
* (因为renderOption.setBackground用的是Sbackground)
* 所以看Sbackground.setClippingRect(new Rect(0, 0, 100, 100));裁剪的大小跟bitmap宽高对比一下
* */
RenderResult result = AwesomeQrRenderer.render(renderOption);
if (null != result.getBitmap()) {//背景是位图
//awesomeCode是布局ImageView控件
awesomeCode.setImageBitmap(result.getBitmap());
} else if (result.getType() == RenderResult.OutputType.GIF) {//背景是Gbackground
awesomeCode.setImageBitmap(result.getBitmap());
} else {//出现问题
}
} catch (Exception e) {
e.printStackTrace();
}