鸿蒙应用开发:如何与组件库(Glide)衔接? 原创 精华

即构忠武
发布于 2021-9-27 15:12
浏览
14收藏

Android 发展到现在不仅提供了很多 API,还提供了很多第三方库。这降低了我们开发者的开发难度,提升了开发效率,让应用开发更加的简单高效。众所周知,HarmonyOS 除了提供 16000 多个 API 外也是支持组件库的调用的,那么鸿蒙应用开发是如何与第三方库衔接的呢?

加载一张图片是每个应用所需的功能,在 Android 平台提供的有 Glide、ImageLoader、Picasso,其中 Glide 最被开发者熟知,所以我就以 Glide 作为例子验证在 HaronyOS 开发中如何使用图片加载库。

以后要引入我厂即构 ZEGO Express SDK 鸿蒙版本的时候可以根据以下的依赖方式,开发过程中需要图片的加载,也可以借鉴以下的图片加载过程。

一、 组件库(Glide)的依赖方式


HarmonyOS 应用开发提供了三种常用的组件库引入方式,以下的三种依赖方式都是在 build.grade 中操作。

1. Maven 仓的依赖方式

以下验证过程的图片加载库 Glide 采用的就是这种方式。

步骤一:

allprojects {
    repositories {
        maven {
            url 'https://repo.huaweicloud.com/repository/maven/' 
        }
        jcenter()
        mavenCentral()
    }
}

步骤二:

dependencies {
 implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
 implementation 'io.openharmony.tpc.thirdlib:glide:1.1.2'
}

2. Module 的依赖方式

dependencies {
 implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
 implementation project(path: ':glidelibrary')
}

如果在setting.gradle 没有对该 glidelibrary 的配置,就要手动添加,如下。 

include ':entry', ':glidelibrary'

3. Har 包的依赖方式

dependencies {
 implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
}

二、 组件库(Glide)的使用

1. 配置

在开发前需要在 config.json 中做好配置的工作。

允许 HTTP 的请求:

"deviceConfig": {
  "default": {
    "network": {
      "cleartextTraffic": true
    }
  }
}

网络权限的设置:

"module": {
    "reqPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }                   
    ]
}

2. 加载图片

图片的来源可以是网络的图片、也可以是项目文件的图片。两种方式的加载方式如下,加载的图片来源于网络 load() 的选择 imagePath,本地图片就选择 imageResourceId。

调用方式:

Image image = (Image)findComponentById(ResourceTable.Id_img);
//Load Image from Internet(图片来源于 即构官网的网络图)
String imagePath = "https://www.zego.im/_nuxt/img/53992d2.png";
//Load Image from Resource Folder(本地图片)
int imageResourceId = ResourceTable.Media_zego_img;
Glide.with(this)
        .load(imagePath)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .skipMemoryCache(true)
        .into(image);

运行结果显示:
::: hljs-center

鸿蒙应用开发:如何与组件库(Glide)衔接?-鸿蒙开发者社区

:::

3. 加载GIF动图

加载的GIF 图可以是网络图片,也可以说本地图片。

调用方式:

DraweeView draweeView = (DraweeView) findComponentById(ResourceTable.Id_draweeView);
String imagePath = "load gif from network";
int imageResourceId = "load gif from native";
Glide.with(this)
        .asGif()
        .load(imageResourceId)
                .into(draweeView);

HarmonyOS 的Image 不支持gif 的加载,因为Image和Element是独立的,不能使用Element重绘。所以 Glide 要使用 gif 的能力就要使用 DraweeView 。

<com.bumptech.glide.load.resource.gif.drawableability.DraweeView
    ohos:id="$+id:draweeView"
    ohos:height="180vp"
    ohos:width="180vp"
    ohos:layout_alignment="center"/>

因为加载 gif 的过程,对系统的性能消耗是非常大的,所以在使用完的时候要及时释放资源,防止内存泄漏。

@Override
protected void onBackground() {
    super.onBackground();
    draweeView.stopGif();
}

4. 加载圆角图片

加载圆角图片,把圆角 raduis 传进来,就可以绘制圆角度。

public class GlideRoundTransform extends BitmapTransformation {

    private static float radius = 0f;

    public GlideRoundTransform(Context context) {
        this(context, 0);
    }

    public GlideRoundTransform(Context context, int dp) {
        super();
        this.radius = dp;
    }

    @Override
    protected PixelMap transform(@NonNls BitmapPool pool, @NonNls PixelMap toTransform, int outWidth, int outHeight) {
        int width = toTransform.getImageInfo().size.width;
        int height = toTransform.getImageInfo().size.height;

        PixelFormat config =
                toTransform.getImageInfo() != null ? toTransform.getImageInfo().pixelFormat : PixelFormat.ARGB_8888;
        PixelMap bitmap = pool.get(width, height, config);

        setCanvasBitmapDensity(toTransform, bitmap);

        Canvas canvas = new Canvas(new Texture(bitmap));
        canvas.drawPixelMapHolderRoundRectShape(new PixelMapHolder(toTransform), new RectFloat(0, 0, width, height), new RectFloat(0, 0, width, height), radius, radius);
        return bitmap;
    }

    @Override
    public void updateDiskCacheKey(MessageDigest messageDigest) {

    }

}

调用方式:

Image image = (Image) findComponentById(ResourceTable.Id_img);
RequestOptions myOptions = new RequestOptions().transform(new GlideRoundTransform(getContext(), 30));
Glide.with(this)
        .load(ResourceTable.Media_zego_img_round)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .skipMemoryCache(true)
        .fitCenter()
        .apply(myOptions)
        .into(image);

总结

通过对 Glide 的引入过程与实现过程,跟Android 第三方库引入与图片加载没有很大的区别。
举一反三,我们可以很轻松的引入其他的组件库,也可以通过 Glide 实现其他的图片加载效果。同时一起期待我厂 即构 ZEGO Express SDK 的鸿蒙版本吧。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-9-29 17:21:09修改
19
收藏 14
回复
举报
16条回复
按时间正序
/
按时间倒序
没有错的理由
没有错的理由

都是干货的文章👍 👍 👍 

2
回复
2021-9-27 15:35:09
mb60fe1f4cbc6c1
mb60fe1f4cbc6c1

跟android 的 Glide 有没有其他用法上的区别?

1
回复
2021-9-27 19:20:03
mb610bf54647033
mb610bf54647033

不错👍,受益匪浅

3
回复
2021-9-27 19:44:21
甜甜爱开发
甜甜爱开发

不错,强帖,期待大厂鸿蒙版本。

2
回复
2021-9-28 10:21:05
mb6140493a8c24c
mb6140493a8c24c

真的很棒的文章,支持一下

回复
2021-9-28 18:53:34
wx60b87e2b1aa86
wx60b87e2b1aa86

基础有点不够,感觉看的不是太懂

2
回复
2021-9-29 02:05:09
即构忠武
即构忠武 回复了 mb60fe1f4cbc6c1
跟android 的 Glide 有没有其他用法上的区别?

用法基本是一样的

回复
2021-9-30 10:09:22
即构忠武
即构忠武 回复了 mb6140493a8c24c
真的很棒的文章,支持一下

感谢支持

回复
2021-9-30 10:09:41
鸿联
鸿联

期待 支持

1
回复
2021-9-30 12:41:58
即构忠武
即构忠武 回复了 鸿联
期待 支持

感谢支持

回复
2021-10-11 14:40:08
爱吃土豆丝的打工人
爱吃土豆丝的打工人

因为语言基本上是支持的,glide加载图片或者GIF图片时,通常使用保留缓存的写法。

1
回复
2021-10-12 09:16:11
vsrrrrrb
vsrrrrrb

支持,期待更多第三方库类出现。。。

回复
2021-10-18 21:18:55
wx603862b132457
wx603862b132457

我一个ListContainer 的item有三张图片。 两张图片设置圆角一张不设置圆角,为什么设置圆角的一张显示圆角,一张还是原图?

回复
2021-10-22 10:47:49
wx603862b132457
wx603862b132457 回复了 爱吃土豆丝的打工人
因为语言基本上是支持的,glide加载图片或者GIF图片时,通常使用保留缓存的写法。

你把.load删了你不要路径了呀

回复
2021-10-22 10:49:02
爱吃土豆丝的打工人
爱吃土豆丝的打工人 回复了 wx603862b132457
你把.load删了你不要路径了呀

额   圈错位置了  应该是load下面的两行

回复
2021-10-22 11:04:15
吃个桃桃
吃个桃桃 回复了 爱吃土豆丝的打工人
因为语言基本上是支持的,glide加载图片或者GIF图片时,通常使用保留缓存的写法。

框错了 往下移一格

回复
2022-1-5 11:43:42
回复
    相关推荐