华为图像服务(HUAWEI Image Kit)是华为面向开发者提供的场景智能设计和场景动效服务。通过集成场景智能设计SDK和场景动效SDK,即可获取24种滤镜,9种图文智能排版、图像主题标签,贴纸花字,图片裁剪和给图片添加动效能力。

您将建立什么

在本篇Codelab中,您将使用已经创建好的Demo Project实现对华为图像服务的API调用,通过Demo Project您可以体验到:

您将会学到什么

硬件要求

软件要求

需要的知识点

Android基础开发能力

集成HUAWEI HMS Core能力,需要完成以下准备工作

具体操作,请按照《HUAWEI HMS Core集成准备》中详细说明来完成。

示例代码下载

源码下载

构建工程

步骤1:打开Android Studio。

步骤2:选择"File > Open > 示例工程解压路径",点击"OK"。

步骤3:添加HUAWEI agcp插件、配置仓库、依赖包、混淆脚本、权限(示例代码中已经配好,但后续您的工程需要参考配置)。

1. 在项目级"build.gradle"中配置Maven仓库路径及HUAWEI agcp插件

2. 在应用级"build.gradle"中配置依赖包

3. 配置混淆脚本

4. 在AndroidManifest.xml文件中配置权限

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

步骤4:选择Android Studio的"File > Sync Project with Gradle Files",同步工程。

测试验证

导入完成后,连接手机,打开USB调试模式。点击Android Studio的图标,运行Android Studio工程,打包生成APK,安装在测试手机上,运行如下图所示:

这是主界面,分别集成了图示5种能力,从上到下分别是滤镜,杂志排版,智能标签,贴纸花字,裁剪功能。点击各个按钮会跳转到相应的主界面。

点击"FILTER"按钮,跳转到滤镜界面:

  1. 点击"INIT_SERVICE",当返回码为"0"的时候为初始化成功。
  2. 点击"IMAGE",选择相册中的图片,目前测试图片支持格式为"JPG/JPEG/PNG/WEBP",图片会自动加载。
  3. 填写"filterType"(取值0-24,默认取值0),"intensity"(取值为0<=intensity<=1,默认取值为1),"compressRate"(取值为0<compressRate<=1,默认为1)。
  4. 填写完成后,点击"GET_RESULT"按钮,即可看到加了滤镜的图片。
  5. 最后点击"STOP_SERVICE",销毁图片,结束滤镜服务。

点击"SMARTLAYOUT"按钮,跳转到杂志排版界面:

  1. 点击"INIT_SERVICE",当返回码为"0"的时候为初始化成功。
  2. 点击"IMAGE",选择相册中的图片,目前测试图片支持格式为"JPG/JPEG/PNG"。
  3. 填写"title"、"description"、"anchor","copyRight",建议按照提示填写,超过长度会自动被裁剪。
  4. 填写"info"杂志排版样式参数,取值info1到info9。
  5. 填写完成后,点击"GET_RESULT"按钮,即可看到杂志排版图片样式。注意此服务需要手机联网。

点击"THEMETAG"按钮,跳转到智能标签界面:

  1. 点击"INIT_SERVICE",当返回码为"0"的时候为初始化成功。
  2. 点击"IMAGE",选择相册中的图片,目前测试图片支持格式为"JPG/JPEG/PNG"。
  3. 填写选择语言参数。
  4. 选择完成后,点击"GET_RESULT"按钮,即可返回智能标签的返回识别结果。注意此服务需要手机联网。

点击"STICKER"按钮,跳转到贴纸界面:

  1. 点击"IMAGE" 设置背景图,选择相册中的图片,目前测试图片支持格式为"JPG/JPEG/PNG"。
  2. 点击"STICKER1","STICKER2","STICKER3"添加贴纸。每次点击都会添加一张贴纸。
  3. 点击"EDITABLESTICKER1","EDITABLESTICKER2","EDITABLESTICKER3","EDITABLESTICKER4",添加可编辑字体的贴纸。
  4. 点击贴纸上文字,会弹出文字编辑框,修改自己想要的字体即可。
  5. 点击"REMOVE ALL STICKS",则移除已经添加的所有贴纸。

点击"CROP"按钮,跳转到图片选择页面,选择需要裁剪的图片,跳转到裁剪界面:

  1. 选择裁剪框的比例,默认为任意比例。
  2. "circular"和"rectangle"为裁剪框形状。
  3. 点击"ROTATE",则对图片进行90°旋转。
  4. 点击"FLIPH",则对图片进行水平方向镜像。
  5. 点击"FLIPV",则对图片进行竖直方向镜像。
  6. 点击"CROPIMAGE",则显示被裁剪好的图片。

高级演练

滤镜服务实现步骤

滤镜服务开发步骤如下,需要开发者提供图片和相关参数,得到相应的返回值。

步骤1:导入滤镜服务包。

import com.huawei.hms.image.vision.*; import com.huawei.hms.image.vision.bean.ImageVisionResult;

步骤2:获取服务实例。

// 获取ImageVisionImpl 对象 ImageVisionImpl imageVisionAPI = ImageVision.getInstance(this);

步骤3:服务初始化,调用setVisionCallBack时需要实现ImageVision.VisionCallBack接口,重写其中的onSuccess(int successCode)和onFailure(int errorCode)方法。初始化成功时会回调onSuccess方法,才会初始化滤镜服务。初始化失败时会回调onFailure方法,传回失败错误码。调用初始化接口时,只有通过校验,第三方应用才能使用滤镜服务,initCode必须为0,初始化成功。

imageVisionAPI.setVisionCallBack(new ImageVision.VisionCallBack() { @Override public void onSuccess(int successCode) { int initCode = imageVisionAPI.init(context, authJson); ... } @Override public void onFailure(int errorCode) { ... } });

入参authJson:

参数列表

类型

M/O(可选/必选)

说明

projectId

String

M

开发者在配置AppGallery Connect时得到的项目ID(agconnect-services.json文件中的product_id)。

appId

String

M

当前APP的APPID(agconnect-services.json文件中的app_id)。

authApiKey

String

M

鉴权使用的Apikey(agconnect-services.json文件中的api_key)。

clientSecret

String

M

客户端秘钥(agconnect-services.json文件中的client_secret)。

clientId

String

M

客户端ID(agconnect-services.json文件中的client_id)。

token

String

O

会话token,用于验证第三方APP身份,建议由第三方开发者的服务器通过clientId+ClientSecret从AGC获取。

步骤4:构建参数对象。

入参requestJson和imageBitmap:

参数列表

类型

M/O(必选/可选)

说明

requestJson

JSONObject

M

图片处理请求参数

imageBitmap

Bitmap

M

需要处理的图片(宽高比在1:3和3:1之间,宽高像素均不超过8000)

requestJson字段信息:

参数列表

类型

M/O(必选/可选)

说明

requestId

String

O

业务提供的请求ID。

taskJson

JSONObject

M

具体的业务请求信息。

authJson

JSONObject

M

鉴权参数。

滤镜的taskJson字段信息:

参数列表

类型

M/O(必选/可选)

说明

filterType

int

O

颜色映射的图片索引,索引范围0—24(0为原图)。

intensity

float

O

滤镜强度,取值范围[0,1.0],默认为1.0。

compressRate

Float

O

压缩率,取值范围(0,1.0],默认为1.0。

filterType映射表:

1

2

3

4

5

6

7

8

9

10

11

12

黑白

棕调

慵懒

小苍兰

富士

桃粉

海盐

薄荷

蒹葭

复古

棉花糖

青苔

13

14

15

16

17

18

19

20

21

22

23

24

日光

时光

雾霾蓝

向日葵

硬朗

古铜黄

黑白调

黄绿调

黄调

绿调

青调

紫调

authJson映射表:请参见步骤3中authJson表。

步骤5:滤镜服务获取结果。

开发者在调用滤镜接口时,需要输入待处理图片的Bitmap,并选择需要的滤镜效果。滤镜服务根据传入的参数对原始图片进行处理后,返回处理后图片的Bitmap。注意调取接口时,需要开启一个子线程去执行,不能在主线程执行。

// 获取visionResult返回值 new Thread(new Runnable() { @Override public void run() { ImageVisionResult visionResult = imageVisionAPI.getColorFilter(requestJson,imageBitmap); } }).start();

visionResult返回值:

参数列表

类型

M/O(必选/可选)

说明

resultCode

int

M

服务状态码。

responseJson

JsonObject

O

服务返回的结果。

image

Bitmap

O

处理后的图片数据,对于直接返回图片的API,通过该字段传递处理后的图片数据。

responseJson字段信息:

参数列表

类型

M/O(必选/可选)

说明

requestId

String

O

业务提供的请求id(如果请求时携带了就返回,没有携带就不返回)。

serviceId

String

M

调用的服务名。

步骤6:停止服务。

当不再需要滤镜效果时,调用该接口停止服务,stopCode为0时,执行成功。

if (null != imageVisionAPI) { int stopCode = imageVisionAPI.stop(); }

图文智能排版服务实现步骤

图文智能排版服务开发步骤如下,需要开发者提供图片和相关参数,得到相应的返回值。

步骤1:导入图文智能排版服务包。

import com.huawei.hms.image.vision.bean.ImageLayoutInfo ; import com.huawei.hms.image.vision.*;

步骤2:获取图文智能排版服务实例。

// 获取ImageVisionImpl 对象 ImageVisionImpl imageVisionAPI = ImageVision.getInstance(this);

步骤3:服务初始化,与滤镜服务一致,可参考开发步骤中的相关描述。

步骤4:构建参数对象。

参数列表

类型

M/O(必选/可选)

说明

requestJson

JSONObject

M

图片处理请求参数。

imageBitmap

Bitmap

M

需要制作图文智能排版的图片(宽高比9:16)。

requestJson字段信息:

参数列表

类型

M/O(必选/可选)

说明

requestId

String

O

业务提供的请求ID。

taskJson

JSONObject

M

具体的业务请求信息。

authJson

JSONObject

M

鉴权参数。

图文智能排版的taskJson字段信息:

参数列表

类型

M/O(必选/可选)

说明

title

String

M

文案标题,必填字段,不超过7个中文汉字(总字符数量不超过10个),如果超过字数限制会被强制截断。

description

String

M

文案内容,不超过44个中文汉字(总字符数量不超过66个),超过字数限制则进行截断,用‘...'代替。

copyRight

String

O

图片版权归属的个人/公司名称(建议不超过7个中文汉字,总字符数量不超过10个)超过字数限制则进行截断,用‘...'代替。

anchor

String

O

"详情"或"查看更多",建议4个中文汉字(总字符数不超过6个)超过字数限制则进行截断,用‘...'代替。

isNeedMask

boolean

O

是否需要蒙层。

styleList

JSONArrary

O

样式列表,默认[], 若为默认值,依据描述文本是否有换行符选择文本;若用户传入list,从用户给出的版式中选择。取值范围[‘info1', ‘info2', ..., ‘info9']。styleList中,info8为竖板排版,当前仅支持中文版式,不支持其他语言版式;info3为默认兜底版式;若用户输入info8且输入标签、文本描述有非中文语种,返回用户info3版式。

authJson映射表:请参见"滤镜服务实现步骤 -> 步骤3 -> authJson表"。

图文智能排版服务requestJson示例:

{ "requestId":"requestId", "taskJson":{"title":"轻奢新生代","description":"远离城市的喧嚣","copyRight":"华为杂志锁屏","isNeedMask":false,"anchor":"查看详情","styleList":["info1"]}, "authJson":{"projectId":"projectIdTest","appId":"appIdTest","authApiKey":"authApiKeyTest","clientSecret":"CSecretTest","clientId":"CIdTest","token":"tokenTest"} }

步骤5:图文智能排版服务获取结果。

开发者在调用图文智能排版接口时,需要输入待处理图片Bitmap并选择样式和需要添加的文字等(构建参数)。图文智能排版服务需要联网,如不联网,则默认反回info3样式。图文智能排版服务会返回ImageLayoutInfo封装类,根据封装类的参数进行view绘制(可以参考示例代码绘制方式)。注意因为接口涉及网络请求,需要开启子线程去调用接口。

// 获取ImageLayoutInfo返回值 new Thread(new Runnable() { @Override public void run() { ImageLayoutInfo imageLayoutInfo = imageVisionAPI.analyzeImageLayout(requestJson, imageBitmap); } }).start();

ImageLayoutInfo 返回值:

参数列表

类型

M/O(必选/可选)

说明

resultCode

int

M

返回结果码。

viewGroup

ViewGroup

O

返回的目标view。

maskView

View

O

返回蒙层view(无蒙层时为null)。

response

JSONObject

O

返回结果。

response字段:

参数列表

类型

M/O(必选/可选)

说明

locationX

int

O

返回view位于手机的起始位置X。

locatiinY

int

O

返回view位于手机的起始位置Y。

maskColor

int

O

返回蒙层的颜色值。

colorHeigh

int

O

返回蒙层的高度(无蒙层时为0)。

requestId

String

O

业务提供的请求ID(如果请求时携带了就返回,没有携带就不返回)。

serviceId

String

M

调用的服务名。

步骤6:停止服务。

当不再需要图文智能排版效果时,调用该接口停止服务,stopCode为0时,执行成功。

if (null != imageVisionAPI) { int stopCode = imageVisionAPI.stop(); }

图像主题标签服务实现步骤

图像主题标签服务开发步骤如下,需要开发者提供图片和相关参数,得到相应的返回值。

步骤1:导入图像主题标签服务包。

import com.huawei.hms.image.vision.*;

步骤2:获取图像主题标签服务实例。

// 获取ImageVisionImpl对象 ImageVisionImpl imageVisionAPI = ImageVision.getInstance(this);

步骤3:服务初始化,与滤镜服务一致,可参考开发步骤中的相关描述。

步骤4:构建参数对象。

参数列表

类型

M/O(必选/可选)

说明

requestJson

JSONObject

M

图片处理请求参数。

imageBitmap

Bitmap

M

需要识别的图片。

requestJson字段信息:

参数列表

类型

M/O(必选/可选)

说明

requestId

String

O

业务提供的请求ID。

taskJson

JSONObject

M

具体的业务请求信息。

authJson

JSONObject

M

鉴权参数。

图像主题标签的taskJson字段信息如下:

参数列表

类型

M/O(必选/可选)

说明

language

String

M

指定标签是中文还是英文, 取值为"cn"或者"en"。

needObjectList

boolean

O

指定是否需要先返回图片中的主体列表。

图像主题标签服务requestJson示例:

{ "requestId":"", "taskJson":{"language":"cn"}, "authJson":{"projectId":"projectIdTest","appId":"appIdTest","authApiKey":"authApiKeyTest","clientSecret":"CSecretTest","clientId":"CIdTest","token":"tokenTest"} }

步骤5:图像主题标签服务获取结果。

开发者在调用图像主题标签接口时,需要输入待处理图片Bitmap等(参见步骤4)。此功能需要联网,如不联网,则返回错误码。注意因为接口涉及网络请求,需要开启子线程去调用接口。

// 获取返回值 new Thread(new Runnable() { @Override public void run() { ImageVisionResult result = imageVisionAPI.analyzeImageThemeTag(requestJson, imageBitmap); } }).start();

result返回值:

参数列表

类型

M/O(必选/可选)

说明

resultCode

int

M

服务状态码。

response

JSONObject

O

服务返回的结果。

response返回值:

参数列表

类型

M/O(必选/可选)

说明

resultCode

int

M

返回结果码。

serviceId

String

O

返回服务Id。

requestId

String

O

返回请求Id。

tags

JSONArray

O

返回标签结果,见下表。

objectList

JSONArray

O

如果传入的needObjectList为true,则返回主体检测结果。

JSONArray tags:

参数列表

类型

M/O(必选/可选)

说明

tagName

String

O

标签名。

tagConfidence

float

O

置信度。

JSONArray objectList:

参数列表

类型

M/O(必选/可选)

说明

type

int

O

主体所属的类型。

possibility

Float

O

置信度。

box

JSONObject

O

主体位置信息。

JSONObject box:

参数列表

类型

M/O(必选/可选)

说明

width

double

O

主体区域宽度。

height

double

O

主体区域高度。

center_x

double

O

主体中心位置的横轴坐标。

center_y

double

O

主体中心位置的纵轴坐标。

步骤6:停止服务。

当不再需要主题标签效果时,调用该接口停止服务,stopCode为0时,执行成功。

if (null != imageVisionAPI) { int stopCode = imageVisionAPI.stop(); }

贴纸花字服务实现步骤

贴纸花字服务的所有接口的实现都是基于StickerLayout,是一个自定义View,import的包名为com.huawei.hms.image.vision.sticker.StickerLayout,直接可以集成在layout的XML中。

步骤1:获取到StickerLayout对象。

通过findViewById获取到StickerLayout对象后,可以调用具体的逻辑方法。

StickerLayout mStickerLayout = findViewById(R.id.sticker_container);

步骤2:提供资源文件。

贴纸定义规范,参见贴纸设计指导及规范

花字定义规范,参见花字设计指导及规范

步骤3:添加贴纸花字。

调用addSticker接口,添加贴纸花字,传入资源文件路径和文件名,如果返回码为0,则为添加成功,贴纸花字总数最多可以添加50个。

int resultCode = mStickerLayout.addSticker(rootPath, fileName);

请求接口参数描述:

参数列表

类型

M/O(必选/可选)

说明

rootPath

String

M

资源文件根目录。

fileName

String

M

如果是贴纸,需要指定的文件名,其他可以传null。

代码示例:

addSticker(rootPath + "贴纸1", "sticker_10_editable.png"); addSticker(rootPath + "花字4", null);

步骤4:更新花字的文本。

开发者可以对花字文本进行编辑,通过回调方法setStickerLayoutListener(new StickerLayout.StickerLayoutListener())
获取花字文本编辑对象textEditInfo,textEditInfo 调用setText,进行文字编辑,最后mStickerLayout调用updateStickerText方法进行更新。

//获取TextEditInfo对象 mStickerLayout.setStickerLayoutListener(new StickerLayout.StickerLayoutListener() { @Override public void onStickerLayoutClick() { } @Override public void onStickerTouch(int index) { } @Override public void onTextEdit(TextEditInfo textEditInfo) { StickerActivity.this.textEditInfo = textEditInfo; } @Override public void needDisallowInterceptTouchEvent(boolean isNeed) { } }); //更新花字文本为"花字测试"字样 textEditInfo.setText("花字测试"); mStickerLayout.updateStickerText(textEditInfo);

图片裁剪服务实现步骤

图片裁剪服务开发步骤如下。

编辑调整服务,图片裁剪服务的所有接口的实现都是基于CropLayoutView,是一个自定义View,import的包名为com.huawei.hms.image.vision.crop.CropLayoutView,可以直接集成在layout的XML中。

步骤1:获取到CropLayoutView对象。

通过findViewById获取到CropLayoutView 对象后,可以调用具体的逻辑方法。

CropLayoutView cropLayoutView = findViewById(R.id.cropImageView);

步骤2:设置需要裁剪的图片,设置完成后,就可以对view进行操作。

cropLayoutView.setImageBitmap(inputBm);

步骤3:调整好图片被裁剪的大小,获取裁剪后图片的bitmap格式。

Bitmap croppedImage = cropLayoutView.getCroppedImage();

示例代码下载

源码下载

构建工程

步骤1:打开Android Studio。

步骤2:选择"File > Open > 示例工程解压路径",点击"OK"。

步骤3:添加HUAWEI agcp插件、配置仓库、依赖包、混淆脚本、权限(示例代码中已经配好,但后续您的工程需要参考配置)。

1. 在项目级"build.gradle"中配置Maven仓库路径以及添加HUAWEI agcp插件

2. 在应用级"build.gradle"中配置依赖包

3. 配置混淆脚本

4. 在AndroidManifest.xml文件中配置权限

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

步骤4:选择Android Studio的"File > Sync Project with Gradle Files",同步工程。

测试验证

导入完成后,连接手机,打开USB调试模式。点击Android Studio的图标,运行Android Studio工程,打包生成APK,安装在测试手机上,运行如下图所示。

  1. 可通过右上角下拉菜单可选择不同的动效。
  2. 点击"播放"、"暂停"、"恢复"和"停止"可开启、暂停、恢复和停止基础动画。AlphaAnimation示例中演示了pauseAnimation(boolean isEnable)与动画name参数设置为"animation_flag_pause "和"animation_flag_forever"的效果,可点击"暂停"按钮体验。
  3. 文本框从左至右依次为"录制类型"、"视频录制压缩比"、"视频录制帧率"、"GIF录制压缩比"和"GIF录制帧率"。录制类型取值为{1,2,3},1表示录制视频,2表示录制GIF,3表示录制视频和GIF。当录制视频时需要填写视频录制压缩比和帧率,视频录制压缩比取值范围为[0.5-1],帧率取值范围为[5-20]。录制GIF时需要填写GIF录制压缩比和帧率,GIF录制压缩比取值范围为[0.1-0.5],帧率为[10-20]。填写完参数后,点击"开始录制",在"开始录制"按钮右侧会显示录制进度。点击"结束录制"可停止录制(录制时长达到15s后会自动停止录制,此时再点击结束录制无效)。
  4. 通过右上角下拉菜单选择"Marquee"示例,通过点击"跑马灯可见性"按钮,可控制跑马灯显示/不显示。

高级演练

上述示例Demo中已经创建默认的动效资源文件和配置文件。若您想自己设计动画效果,可根据场景动效xml规范说明文档设计动效,并将资源和配置文件存储到指定路径下。通过调用ImageRenderImpl接口函数展示动效。

步骤1:在manifest.xml脚本中设计动效,并将manifest.xml脚本与图片资源存储至指定路径。例如:

配置manifest.xml脚本

将资源置文件存储到指定路径

步骤2:导入场景动效服务包。

import com.huawei.hms.image.render.*;

步骤3:获取场景动效实例。如下面代码所示,通过调用getInstance(Context context, RenderCallBack callback)方法获取实例。在调用该方法时需要实现ImageRender.RenderCallBack接口,重写其中的onSuccess(ImageRenderImpl imageRender)和onFailure(int errorCode)方法。获取场景动效服务实例成功时会回调onSuccess方法,传回场景动效服务实例。获取场景动效服务实例失败时会回调onFailure方法,传回失败错误码。

ImageRenderImpl imageRenderAPI; // 获取ImageRender对象 ImageRender.getInstance(this, new ImageRender.RenderCallBack() { @Override public void onSuccess(ImageRenderImpl imageRender) { imageRenderAPI = imageRender; ... } @Override public void onFailure(int i) { ... } });

步骤4:初始化接口对象。初始化时需要传入待解析资源路径sourcePath(步骤1中资源存储路径,例如"sdcard/animation")和鉴权认证所需信息(json形式,例如:APIKey以及证书指纹等,参见"场景智能设计服务开发 -> 高级演练 -> 滤镜服务实现步骤 -> 步骤3 -> authJson表")。只有通过校验,第三方应用才能使用场景动效服务。

// 初始化ImageRender // getAuthJson()返回的是鉴权Json串 int initResult = imageRenderAPI.doInit(sourcePath, getAuthJson());

步骤5:获取view,并加入创建的layout中。建议显示场景动效的布局宽高与屏幕等宽等高,否则会出现view被截断的情况。目前支持2种获取视图方式。

步骤6:控制基础动画播放、暂停、恢复和停止。

1.调用接口函数playAnimation(),播放动画(该方法只作用于基础动效)。

// 播放动画 if (null != imageRenderAPI) { imageRenderAPI.playAnimation(); }

2.暂停动画(该方法只作用于基础动效)。

调用pauseAnimation(boolean isEnable)接口实现暂停所有基础动画,并开始播放暂停动画(需要与基础动画的name属性配合使用)。

例如,manifest.xml脚本中设置暂停动画。

<?xml version="1.0" encoding="utf-8"?> <Root screenWidth="1080"> <!--暂停动画,调用pauseAnimation(true)时开始播放--> <Image src="ty.png" x="0" y="0" w="500" h="500"> <AlphaAnimation name="animation_flag_pause"> <Alpha a="0" time="0"/> <Alpha a="255" time="500"/> <Alpha a="0" time="1000"/> </AlphaAnimation> </Image> <!--普通动画,调用pauseAnimation(true)时暂停播放--> <Image src="ty.png" x="500" y="0" w="500" h="500"> <AlphaAnimation> <Alpha a="0" time="0"/> <Alpha a="255" time="500"/> <Alpha a="0" time="1000"/> </AlphaAnimation> </Image> </Root>

调用接口。

// imageRender暂停renderView动画。传参为true时表示暂停所有基础动画,并开始播放暂停动画;传参为false时,表示暂停所有基础动画,并且不播放暂停动画。 if (null != imageRenderAPI) { imageRenderAPI.pauseAnimation(true); }

3.恢复动画。当开发者需要恢复暂停的基础动效时,调用该接口。

// imageRender恢复renderView动画。 if (null != imageRenderAPI) { imageRenderAPI.resumeAnimation(); }

4.调用接口函数stopAnimation(),停止动画(该方法只作用于基础动效)。

// 停止动画 if (null != imageRenderAPI) { imageRenderAPI.stopAnimation(); }

步骤7:开发者向Kit传递信息。

开发者可通过setKeyValueInfo(String key, Object ...value)方法向Image Kit传递信息。其中key为String类型,目前只支持"SetVariable"。value为java.lang.Object类型,可传入多个参数,目前单个参数支持String、int、boolean和float类型,多个参数只支持String类型。RenderObject为Image Kit返回给开发者的结果。

例如,manifest.xml脚本中Image的visibility参数通过变量#var控制。

<?xml version="1.0" encoding="utf-8"?> <Root screenWidth="1080"> <Var name="var" expression="0"/> <Image src="ty.png" x="0" y="0" w="500" h="500" visibility="#var"/> </Root>

在渲染过程中,通过调用setKeyValueInfo接口动态改变变量#var,达到控制图片可见性。

// 设置manifest脚本中名为"var"的变量值为1 String key = "SetVariable"; String name = "var"; String value = "1"; RenderObject renderObject = imageRenderAPI.setKeyValueInfo(key, name, value);

步骤8:录制动效。Image Kit提供GIF格式的动效录制。通过调用startRecordstopRecord控制动效录制的开始和结束。

通过调用startRecord开始录制动效,支持GIF格式。入参Json包括录制类型、压缩比和帧率信息。最终录制结果通过IStreamCallBack接口的回调方法返回。

int resultCode = imageRenderAPI.startRecord(json, new IStreamCallBack () { ... @Override void onRecordSuccess(HashMap<String ,Object> map) { ... String recordType = (String) hashMap.get("recordType"); byte[] videoBytes = (byte[]) hashMap.get("videoBytes"); byte[] gifBytes = (byte[]) hashMap.get("gifBytes"); try { if (recordType.equals("1")) { if (videoBytes != null) { saveFile(videoBytes, mp4Path); } } else if (recordType.equals("2")) { ... } else if (recordType.equals("3")) { ... } } catch (IOException e) { ... } ... } @Override void onRecordFailure(HashMap<String,Object> map) { ... } @Override void onProgress(int progress) { runOnUiThread(new Runnable() { @Override public void run() { textProgress.setText("progress:" + progress + "%"); } }); } }); private void saveFile (byte[] bytes, String path) throws IOException { FileOutputStream fos = new FileOutputStream(new File(path)); try { fos.write(bytes, 0, bytes.length); fos.close(); } catch (IOException e) { Log.e(TAG, e.getMessage()); } finally { try { fos.close(); } catch (IOException e) { Log.e(TAG, e.getMessage()); } } }

入参json:

参数

类型

M/O(必选/可选)

说明

recordType

int

M

录制类型,取值{1,2,3}。1表示录制视频;2表示录制GIF;3表示同时录制视频和GIF。

videoScale

double

O

视频压缩比,取值范围为[0.5-1],只保留1位小数。录制视频时该参数必选。

videoFps

int

O

视频帧率,取值范围为[5-20]。录制视频时该参数必选。

gifScale

double

O

GIF压缩比,取值范围为[0.1-0.5]。录制GIF时该参数必选。

gifFps

int

O

GIF的帧率,取值范围为[10-20]。录制GIF时该参数必选。

json示例:

{"recordType":3; video{ "videoScale":0.5 "videoFps":16 } gif{ "gifScale":0.3 "gifFps":16 } }

IStreamCallBack成功回调返回参数map:

参数

类型

说明

recordType

int

录制类型,取值{1,2,3}。1表示录制视频;2表示录制GIF;3表示同时录制视频和GIF。

videoBytes

byte[]

视频字节数组。

gifBytes

byte[]

GIF字节数组。

IStreamCallBack失败回调返回参数map:

参数

类型

说明

errorCode

int

错误码。

errorMessage

String

错误信息。

调用stopRecord接口,停止录制动效。如果录制时长大于15s未调用该接口,则自动停止录制,再调用该接口无作用。

int resultCode = imageRenderAPI.stopRecord();

步骤9:多Activity复用RenderView。

通过调用unBindRenderViewbindRenderView接口实现多Activity复用同一个RenderView。一般是在A页面getRenderView()获取到renderView实例,并且已经显示renderView的情况下,A页面跳转到B页面,可以在A的onPause()中进行解绑,B的onResum()中进行绑定,在B页面中不用进行初始化,renderView即可显示。

步骤10:当不再需要场景动效视图时,调用removeRenderView(),销毁资源。

// 销毁视图 if (null != imageRenderAPI) { imageRenderAPI.removeRenderView(); }

干得好,您已经成功完成了Codelab并学到了:

已复制代码