• 一文教你如何使用Scan Kit快速生成带有logo的个性化二维码


    前言

    今天我们来实现一个小功能,通过使用扫码SDK来生成一个带有logo的个性化的二维码,话不多说,直接开始吧!

    1、添加依赖

    1.1、配置HMS Core SDK的Maven仓地址

    打开项目工程根目录下的build.gradle文件,在其中添加Maven仓的依赖,这项配置根据Gradle插件版本的不同配置的代码也有所不同,大家根据自己Android Studio中Gradle插件的版本自行选择,可以参考下面官方的依赖配置文档:

    文档中心 | 华为开发者联盟

    我项目中使用的是Gradle6.5的版本,因此配置代码如下:

    1. buildscript {
    2. repositories {
    3. google()
    4. jcenter()
    5. // 配置HMS Core SDK的Maven仓地址。
    6. maven {url 'https://developer.huawei.com/repo/'}
    7. }
    8. dependencies {
    9. classpath 'com.android.tools.build:gradle:4.1.3'
    10. // 增加AGC插件配置,请您参见AGC插件依赖关系选择合适的AGC插件版本。
    11. classpath 'com.huawei.agconnect:agcp:1.6.0.300'
    12. }
    13. }
    14. allprojects {
    15. repositories {
    16. google()
    17. jcenter()
    18. // 配置HMS Core SDK的Maven仓地址。
    19. maven {url 'https://developer.huawei.com/repo/'}
    20. }
    21. }

    1.2、添加编译依赖

    打开应用级的build.gradle文件,即app module下的build.gradle文件,在dependencies闭包中添加以下依赖:

    1. dependencies{
    2. implementation 'com.huawei.hms:scan:2.7.0.302'
    3. }

    1.3、添加agc插件配置

    这一步也是在app module下的build.gradle文件中,在文件头部声明下一行添加如下配置:

    1. apply plugin: 'com.android.application'
    2. apply plugin: 'com.huawei.agconnect'

    OK,通过以上步骤我们就完成了Scan Kit的引入工作,接下来,让我们一起通过代码实战来生成一个个性化的二维码吧!

    2、代码实战

    需求:通过扫码SDK生成一个中间logo是圆形带边框的个性化的二维码,根据这个需求我们可以通过以下几个步骤来完成。

    2.1、自定义圆形带边框的ImageView

    第一步:我们来实现一个自定义的ImageView,在这个ImageView内部通过裁剪和绘制让它实现圆形带边框的效果,代码如下:

    1. /**
    2. * CircleImageView
    3. * 圆形带边框图片
    4. *
    5. * @since 2022/09/15
    6. */
    7. public class CircleImageView extends AppCompatImageView {
    8. public CircleImageView(Context context) {
    9. this(context, null);
    10. }
    11. public CircleImageView(Context context, AttributeSet attrs) {
    12. this(context, attrs, 0);
    13. }
    14. public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
    15. super(context, attrs, defStyle);
    16. }
    17. private int bWidth = 10;// 边框宽度
    18. private int bColor = Color.WHITE;// 边框颜色
    19. // 通过构造方法,可以在外部调用处设置边框宽度和颜色
    20. public void setBorderWidth(int width, int color) {
    21. bWidth = width;
    22. bColor = color;
    23. }
    24. @Override
    25. public void setImageBitmap(Bitmap bm) {
    26. int d = Math.min(bm.getWidth(), bm.getHeight());// 圆直径
    27. Bitmap dest = Bitmap.createBitmap(d, d, bm.getConfig());// 创建副本
    28. // 画边框
    29. Canvas c = new Canvas(dest);
    30. Paint paint = new Paint();
    31. paint.setColor(bColor); // 边框颜色
    32. paint.setAntiAlias(true);// 设置抗锯齿
    33. c.drawCircle(d / 2, d / 2, d / 2, paint);
    34. // 画圆
    35. Path path = new Path();
    36. path.addCircle(d / 2, d / 2, d / 2 - bWidth, Path.Direction.CW);
    37. c.clipPath(path); // 裁剪区域
    38. Matrix matrix = new Matrix();// 不缩放
    39. c.drawBitmap(bm, matrix, paint);// 把图画上去
    40. super.setImageBitmap(dest);
    41. }
    42. }

    2.2、创建页面布局文件

    这里创建一个activity_qrcode_create.xml文件,内部就一个ImageView控件,代码如下:

    1. "1.0" encoding="utf-8"?>
    2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent">
    6. <androidx.appcompat.widget.AppCompatImageView
    7. android:id="@+id/barcode_image"
    8. android:layout_width="wrap_content"
    9. android:layout_height="wrap_content"
    10. app:layout_constraintBottom_toBottomOf="parent"
    11. app:layout_constraintEnd_toEndOf="parent"
    12. app:layout_constraintStart_toStartOf="parent"
    13. app:layout_constraintTop_toTopOf="parent" />
    14. androidx.constraintlayout.widget.ConstraintLayout>

    3、创建生成二维码页面Activity

    这里创建一个QRCodeCreateActivity.java文件,在这里面我们需要做以下几件事情:

    ①、我们先准备一张图片,我这里是准备了一张372x372的PNG格式的图片,图片名称是icon_logo.PNG,我们把它先放在res/drawable-xxhdpi这个目录下;

    ②、我们通过以下代码使用BitmapFactory解析得到icon_logo的Bitmap对象:

    BitmapFactory.decodeResource(this.getResources(), R.drawable.icon_logo);

    ③、通过上面自定义的CircleImageView调用setImageBitmap()方法将②中解析到的Bitmap对象设置进去:

    CircleImageView circleImageView = new CircleImageView(this);

    circleImageView.setBorderWidth(20, getResources().getColor(R.color.colorPrimary));

    circleImageView.setImageBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.icon_logo));

    ④、通过CircleImageView的Drawable对象得到它的Bitmap对象:

    Bitmap logo = ((BitmapDrawable) circleImageView.getDrawable()).getBitmap();

    ⑤、调用HmsBuildBitmapOption.creator()对象的setQRLogoBitmap将④中的logo这个Bitmap对象设置进去:

    HmsBuildBitmapOption options = new HmsBuildBitmapOption.Creator()

    .setQRLogoBitmap(logo)

    .create();

    整个页面的完整代码如下所示:

    1. /**
    2. * QRCodeCreateActivity
    3. * 生成个性化二维码页面
    4. *
    5. * @since 2022/09/15
    6. */
    7. public class QRCodeCreateActivity extends Activity {
    8. @Override
    9. protected void onCreate(@Nullable Bundle savedInstanceState) {
    10. super.onCreate(savedInstanceState);
    11. setContentView(R.layout.activity_qrcode_create);
    12. AppCompatImageView resultView = findViewById(R.id.barcode_image);
    13. createQRCode(resultView);
    14. }
    15. // 生成个性化二维码
    16. private void createQRCode(AppCompatImageView imageView) {
    17. String content = "个性化的二维码";
    18. int type = HmsScan.QRCODE_SCAN_TYPE;
    19. int width = 600;
    20. int height = 600;
    21. CircleImageView circleImageView = new CircleImageView(this);
    22. circleImageView.setBorderWidth(20, getResources().getColor(R.color.colorPrimary));
    23. circleImageView.setImageBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.icon_logo));
    24. Bitmap logo = ((BitmapDrawable) circleImageView.getDrawable()).getBitmap();
    25. HmsBuildBitmapOption options = new HmsBuildBitmapOption.Creator()
    26. .setQRLogoBitmap(logo)
    27. .create();
    28. try {
    29. // 如果未设置HmsBuildBitmapOption对象,生成二维码参数options置null。
    30. Bitmap qrBitmap = ScanUtil.buildBitmap(content, type, width, height, options);
    31. imageView.setImageBitmap(qrBitmap);
    32. } catch (Exception e) {
    33. Log.e("buildBitmap", e.getClass().getSimpleName());
    34. }
    35. }
    36. }

    最后来看一下实现的效果吧,如下图所示:

    cke_15872.png

    OK,以上就是今天我们通过使用Scan Kit来实现个性化二维码的全部内容啦!

     欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

  • 相关阅读:
    Nginx虚拟主机与域名解析
    幼儿园核酸预约登记小程序实战开发(上篇)
    Python学习 第四章 面向对象设计
    上周热点回顾(5.8-5.14)
    pytorch深度学习入门
    笔记1.2 计算机网络结构
    element-ui plus 文件上传组件,设置单选,并支持替换和回显
    Gitlab部署管理
    http和https请求总结
    (2022版)一套教程搞定k8s安装到实战 | Volumes
  • 原文地址:https://blog.csdn.net/weixin_44708240/article/details/126965614