Avatarクイックアクセス

AvatarはTencent Effectの機能の一部であるため、接続の際はEffectのアクセスドキュメントを参照した上でAvatar素材をロードする必要があります。Effectを接続済みの場合は、下記のステップ1の内容を無視してください。
1. Tencent Effectのドキュメントに従って接続します。Tencent Effectの独立した統合をご参照ください。
2. 次の方法に従ってAvatar素材をロードします。

Avatar機能を使用するための具体的な手順

ステップ1:Demo内のファイルのコピー

1. 対応するdemoプロジェクトを公式サイトからダウンロードし、解凍します。
2. Demo内のdemo/app/assets/MotionRes/avatarResフォルダをご自身のプロジェクトにコピーします(Demoと同じ位置にします)。
3. Demo内のcom.tencent.demo.avatarフォルダ下のすべてのクラスをプロジェクトにコピーします。

ステップ2:重要コードの追加

Demo内のcom.tencent.demo.avatar.AvatarActivityクラスを参照し、次のコードを追加します
1. ページのxmlファイル内でパネル情報を設定します。
<com.tencent.demo.avatar.view.AvatarPanel
android:id="@+id/avatar_panel"
android:layout_width="match_parent"
android:layout_height="300dp"
app:layout_constraintBottom_toBottomOf="parent" />
2. ページ内でパネルオブジェクトを取得し、対応するデータコールバックインターフェースを設定します。
avatarPanel.setAvatarPanelCallBack(new AvatarPanelCallBack() {
@Override
public void onItemChecked(MainTab mainTab, AvatarItem avatarItem) {
if (avatarItem.avatarData == null && URLUtil.isNetworkUrl(avatarItem.downloadUrl)) { //ここは動的ダウンロードが必要であることを表します
downloadAvatarData(avatarItem, () -> updateConfig(avatarItem));
} else {
updateConfig(avatarItem);
List<AvatarData> bindAvatarData = AvatarResManager.getAvatarDataByBindData(avatarItem.bindData);
mXmagicApi.updateAvatar(bindAvatarData, AvatarActivity.this);
}
}

@Override
public void onItemValueChange(AvatarItem avatarItem) {
updateConfig(avatarItem);
}

@Override
public boolean onShowPage(AvatarPageInf avatarPageInf, SubTab subTab) {
if (subTab != null && subTab.items != null && subTab.items.size() > 0) {
AvatarItem avatarItem = subTab.items.get(0);
if (avatarItem.type == AvatarData.TYPE_SLIDER && avatarItem.avatarData == null && URLUtil.isNetworkUrl(avatarItem.downloadUrl)) { //ここは動的ダウンロードが必要であることを表します
downloadAvatarData(avatarItem, () -> {
if (avatarPageInf != null) {
avatarPageInf.refresh();
}
});
return false;
}
}
return true;
}

private void updateConfig(AvatarItem avatarItem) {
if (mXmagicApi != null && avatarItem != null) {
List<AvatarData> avatarConfigList = new ArrayList<>();
avatarConfigList.add(avatarItem.avatarData);
mXmagicApi.updateAvatar(avatarConfigList, AvatarActivity.this);
}
}
});
3. パネルデータを取得し、パネルに設定します。
AvatarResManager.getInstance().getAvatarData(avatarResName, getAvatarConfig(), allData -> {
avatarPanel.initView(allData);
});
4. xmagicApiオブジェクトを作成し、アバター制作リソースをロードします。
private void initXMagic() {
if (mXmagicApi == null) {
mXmagicApi = XmagicApiUtils.createXmagicApi(getApplicationContext(), null);
AvatarResManager.getInstance().loadAvatarRes(mXmagicApi, avatarResName, getAvatarConfig());
setCloseEye(true);//顔が検出されない場合は、スリープ/休止状態になります
setAvatarPlaneType();
} else {
mXmagicApi.onResume();
}
}
5. Avatar属性を保存します。Demo内のsaveAvatarConfigsメソッドを参照できます。
/**
* ユーザーの設定した属性またはデフォルトの属性値を保存します
*/
private void saveAvatarConfigs() {
if (mXmagicApi != null && avatarPanel != null) {
List<AvatarData> avatarDataList = AvatarResManager.getUsedAvatarData(avatarPanel.getMainTabList());
new Thread(() -> {
String content = XmagicApi.exportAvatarConfig(avatarDataList);
boolean result = FileUtil.writeContentToFile(AvatarResManager.getAvatarConfigsDir(), AvatarResManager.getAvatarConfigsFileName(avatarResName), content);
String tip = result ? "save avatar data successfully " : "Save avatar data failed";
runOnUiThread(() -> Toast.makeText(getApplicationContext(), tip, Toast.LENGTH_LONG).show());
}).start();
}
}
6. 背景の切り替えはDemo内のchangeAvatarBgTypeメソッドを参照します。
/**
* 背景の切り替え
*/
private void changeAvatarBgType() {
if (currentAvatarType == AvatarResManager.AvatarType.VIRTUAL_BG) {
currentAvatarType = AvatarResManager.AvatarType.REAL_BG;
} else {
currentAvatarType = AvatarResManager.AvatarType.VIRTUAL_BG;
}
saveCurrentAvatarType();
setAvatarPlaneType();
}

/**
* モデル背景タイプの設定
*/
private void setAvatarPlaneType() {
AvatarData avatarData = AvatarResManager
.getInstance().getAvatarPlaneTypeConfig(avatarResName, currentAvatarType);
if (mXmagicApi != null && avatarData != null) {
List<AvatarData> avatarDataList = new ArrayList<>();
avatarDataList.add(avatarData);
mXmagicApi.updateAvatar(avatarDataList, this);
}
}