demo/app/assets/MotionRes/avatarResフォルダをご自身のプロジェクトにコピーします(Demoと同じ位置にします)。com.tencent.demo.avatarフォルダ下のすべてのクラスをプロジェクトにコピーします。com.tencent.demo.avatar.AvatarActivityクラスを参照し、次のコードを追加します<com.tencent.demo.avatar.view.AvatarPanelandroid:id="@+id/avatar_panel"android:layout_width="match_parent"android:layout_height="300dp"app:layout_constraintBottom_toBottomOf="parent" />
avatarPanel.setAvatarPanelCallBack(new AvatarPanelCallBack() {@Overridepublic 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);}}@Overridepublic void onItemValueChange(AvatarItem avatarItem) {updateConfig(avatarItem);}@Overridepublic 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);}}});
AvatarResManager.getInstance().getAvatarData(avatarResName, getAvatarConfig(), allData -> {avatarPanel.initView(allData);});
private void initXMagic() {if (mXmagicApi == null) {mXmagicApi = XmagicApiUtils.createXmagicApi(getApplicationContext(), null);AvatarResManager.getInstance().loadAvatarRes(mXmagicApi, avatarResName, getAvatarConfig());setCloseEye(true);//顔が検出されない場合は、スリープ/休止状態になりますsetAvatarPlaneType();} else {mXmagicApi.onResume();}}
/*** ユーザーの設定した属性またはデフォルトの属性値を保存します*/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();}}
/*** 背景の切り替え*/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);}}
フィードバック