Android

最近更新时间:2025-12-23 16:43:42

我的收藏
本文旨在介绍如何快速接入 TAVMagicUIKit SDK,提供一套包含完整 UI 的短视频编辑解决方案。

TAVEditorUIKit 组件

TAVEditorUIKit 是一套高度一体化的完整 UI 组件。

集成步骤

1. 在项目的build.gradle中添加 UIKit 依赖。
implementation 'com.yunxiao.tavmagic:tavmagicuikit:x.x.x'
2. 在布局中添加 TAVEditorUIKit。
<com.yunxiao.tavmagic.uikit.TAVEditorUIKit
android:id="@+id/editor_ui"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3. 初始化编辑器。
TAVEditorUIKit editor = findViewById(R.id.editor_ui);

// 初始化方式1:使用视频路径列表
List<String> videoPaths = Arrays.asList("path1.mp4", "path2.mp4");
editor.initWithClipPath(videoPaths);

// 初始化方式2:使用草稿
TAVDraft draft = loadDraft(); // 加载草稿
editor.initWithDraft(draft);
4. 处理生命周期。
@Override
protected void onResume() {
super.onResume();
editor.onResume(true); // true表示恢复播放
}

@Override
protected void onPause() {
super.onPause();
editor.onPause();
}

@Override
protected void onDestroy() {
super.onDestroy();
editor.onDestroy();
}

@Override
public void onBackPressed() {
if (!editor.onBackPressed()) {
super.onBackPressed();
}
}
5. 设置必要监听器。
// 设置权限提供器
editor.setPermissionProvider(new ITAVPermissionProvider() {
@Override
public boolean checkPermission(String permission) {
return ContextCompat.checkSelfPermission(MainActivity.this, permission)
== PackageManager.PERMISSION_GRANTED;
}
@Override
public void requestPermission(String permission, TAVConsumer<Boolean> callback) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{permission}, REQUEST_CODE);
}
});

屏幕适配方案

TAVMagicUIKit SDK 对外提供默认的屏幕适配方案,只需让 UIKit 所在的 Activity 继承 TAVMagicAdaptActivity 即可。如果业务侧已存在自定义的 BaseActivity,可将以下代码拷贝至 UIKit 所在的 Activity 中使用。
注意:
屏幕适配相关代码影响范围仅限调用的页面。
public class TAVMagicAdaptActivity extends AppCompatActivity {
private static final String TAG = "TAVMagicAdaptActivity";
private static final float TARGET_WIDTH_DP = 375;
private Context mCustomCtx;

@Override
protected void attachBaseContext(Context newBase) {
if (mCustomCtx == null) {
mCustomCtx = createCustomContext(newBase);
}
super.attachBaseContext(mCustomCtx);
}

private Context createCustomContext(Context context) {
final DisplayMetrics systemDM = Resources.getSystem().getDisplayMetrics();
final DisplayMetrics activityDM = context.getResources().getDisplayMetrics();
float targetDensity = activityDM.widthPixels / TARGET_WIDTH_DP;
float targetScaledDensity = targetDensity * (systemDM.scaledDensity / systemDM.density);
Configuration newConfig = new Configuration(context.getResources().getConfiguration());
Context adaptedContext = context.createConfigurationContext(newConfig);
DisplayMetrics newMetrics = adaptedContext.getResources().getDisplayMetrics();
newMetrics.density = targetDensity;
newMetrics.scaledDensity = targetScaledDensity;
return adaptedContext;
}

@Override
public Resources getResources() {
return (mCustomCtx != null && mCustomCtx.getResources() != null)
? mCustomCtx.getResources() : super.getResources();
}
}

封面选择器

TAVMagicUIKit SDK 内置默认封面选择器,支持从已完成编辑的视频内容中选取任意一帧作为封面。

启动配置

TAVCoverRequest
描述
封面生成请求参数模型。用于描述一次封面生成/截取的上下文来源(编辑器实例或草稿)、目标时间点、占位图、最长时长限制以及渲染分辨率等级等信息。
参数
字段名
类型
说明
editorKey
String
对应编辑器实例的唯一标识 Key,用于从当前运行中的编辑器中生成封面。
draft
TAVDraft
草稿对象,当基于草稿离线生成封面时使用。
position
long
打开封面选择器期望展示的视频时间点,单位:微秒(us)。
coverPlaceHolder
String
封面占位图路径(可选),用于正式封面生成前展示的占位图片。
maxDuration
long
当前封面请求对应的视频最大时长,单位:微秒(us)。用于裁剪封面选择器时长。
renderSizeLevel
int
渲染分辨率等级,默认值为 TAVEditorConstants.VIDEO_LEVEL_720P

选择结果

TAVCoverResult
描述
封面生成/选择结果的数据模型。用于描述某一时间点对应的封面缩略图信息,包括时间戳和本地缓存路径。
参数
字段名
类型
说明
position
long
封面对应的视频时间戳,单位:微秒(us)。
thumbPath
String
封面图在本地的缓存文件路径。

集成步骤

1. 封面选择器支持两种打开方式
使用正在编辑的实例打开。通过 TAVEditorUIKit fork 出来一个离屏实例用来导出或配置封面选择器。
String editorKey = mViewBinding.uiKit.forkOffscreenEditor();
使用草稿打开。通过草稿本地路径创建TAVDraft对象。
TAVDraft draft = TAVDraft.createFromJsonPath(draftDir + File.separator + "draft.json");
2. 在 Activity 的 onCreate 方法中初始化 TAVCoverSelector 启动器。
coverLauncher = TAVCoverSelector.registerForResult(this, result -> {
if (result != null) {
//此处处理封面选择器返回的选择结果TAVCoverResult
}
});
3. 打开封面选择页面。
// 通过草稿打开
// TAVCoverSelector.TAVCoverRequest request = TAVCoverSelector.TAVCoverRequest.fromDraft(draft);
// 通过编辑打开
TAVCoverSelector.TAVCoverRequest request = TAVCoverSelector.TAVCoverRequest.fromKey(editorKey);
request.coverPlaceHolder = mThumbPath;
request.renderSizeLevel = TAVEditorConstants.VIDEO_LEVEL_720P;
request.maxDuration = 20_000_000;
request.position = 10_000_000;
coverLauncher.launch(request);