Android

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

我的收藏

功能概览

TAVWidgetContentView 是所有挂件(贴纸、画中画等组件,后文全部统称挂件)手势操作的视图,挂件选中、取消选中、拖动、拖移位置拦截、旋转角度拦截等操作都可以在该类中进行。

相关接口类

接口类名
描述
TAVEditor
SDK 操作入口类。
TAVWidgetContentView
SDK 手势操作封装基类。

挂件编辑过程

当手势点击某个挂件时,TAVWidgetContentView会调用ITAVWidgetEditViewFactory中的方法去创建挂件编辑视图,目前内置的基础编辑视图有两种:
贴纸基础编辑视图:TAVStickerEditView
画中画基础编辑视图:TAVPipEditView
挂件边框和操作按钮的绘制都在相应的 EditView 进行绘制,可以通过继承相应的 EditView 对不同挂件绘制不同的编辑框。

主要接口介绍

接口名
描述
ITAVWidgetEventListener
挂件操作的事件接口,挂件激活、取消激活、拖动、点击等事件都会在该接口回调。
ITAVWidgetTouchOutsideListener
没有点中任何挂件的回调。
ITAVWidgetEditViewFactory
创建自定义挂件编辑视图的工厂。
ITAVWidgetMoveLimitProvider
挂件移动策略提供者。

主要方法介绍

方法名
描述
setTouchable
设置是否可以进行手势操作。
setNoFocusGestureEnabled
设置是否可以直接拖动挂件,无需先选中挂件。
setWidgetType
设置可以操作的挂件类型。
setMoveRegionRect
设置挂件拖动区域。
activeWidget
激活指定挂件。
resignCurrentActive
取消激活当前激活的挂件。
addWidgetEventListener
添加挂件操作事件监听。
setWidgetTouchOutsideListener
设置没有点到挂件的回调。
setEditViewFactory
设置自定义的挂件编辑视图工厂。如果认为 SDK 内部默认的编辑视图不足以满足业务需求,可以自行实现创建编辑视图。
setSyncWithRender
设置操作挂件是否与渲染同步。
setMoveLimitProvider
设置挂件移动的限制策略,可为每个挂件指定移动限制方式和移动限制区域。

设置自定义的贴纸编辑视图

1. 先自行实现贴纸编辑视图。
public class MyStickerEditView extends TAVStickerEditView {
... 自己的逻辑
// 如果需要获取挂件在View中的顶点位置,可以使用 getVertexPoints 方法获得
}
2. 然后为 TAVWidgetContentView 设置挂件编辑视图工厂:
public class MyWidgetContentView extends TAVWidgetContentView {
public MyWidgetContentView(Context context) {
super(context);
setEditViewFactory(new ITAVWidgetEditViewFactory() {
@Override
public TAVStickerEditView createStickerEditView(TAVSticker sticker) {
return new MyStickerEditView(context, sticker);
}
...
})
}
}
3. 在 TAVEditor initWithPreview 的时候传入自定义的 TAVWidgetContentView:
TAVEditor editor = TAVEditorFactory.createEditor();
TAVEditorConstants.PreviewParam param = new TAVEditorConstants.PreviewParam();
param.videoView = FrameLayout;
// 传入自定义的TAVWidgetContentView
param.contentView = new MyWidgetContentView(context);
param.loopPlay = true;
param.autoPlay = true;
editor.initWithPreview(param);

监听挂件手势事件

public class MyWidgetContentView extends TAVWidgetContentView {
public MyWidgetContentView(Context context) {
super(context);
// 添加挂件事件监听
addWidgetEventListener(new ITAVWidgetEventListener() {
@Override
public void onWidgetClick(TAVWidget widget, MotionEvent event) {
// 挂件被点击
}

@Override
public void onWidgetTouchBegin(TAVWidget widget, MotionEvent event) {
// 挂件开始拖动
}

@Override
public void onWidgetTouchEnd(TAVWidget widget, MotionEvent event) {
// 挂件拖动结束
}

@Override
public void onWidgetAdjust(TAVWidget widget, TAVWidgetOperationMode operationMode) {
// 挂件正在拖动
}

@Override
public void onWidgetActive(TAVWidget widget) {
// 挂件被激活编辑
}

@Override
public void onWidgetResign(TAVWidget widget) {
// 挂件被取消激活
}
});
}
}

高级操作

需要重写 TAVWidgetContentView 相关方法。

自定义 TAVWidgetContentView 展示逻辑

@Override
protected boolean shouldShowEditView() {
// 增加自己的展示判断逻辑
return super.shouldShowEditView();
}

@Override
protected void updateWidgetEditViewVisibility() {
if (null != currentEditView && null != currentWidget) {
final boolean shouldShow = shouldShowEditView();
// 根据展示条件修改TAVWidgetEditView可见性
}
}

操作拦截

TAVWidgetContentView 提供了下列接口实现对挂件的拦截:
接口名
描述
positionInterceptor
挂件位置拦截。
rotateInterceptor
挂件旋转角度拦截。
scaleInterceptor
挂件缩放拦截。
示例代码展示了通过重写positionInterceptor方法来实现移动时的位置吸附效果:
@Override
protected PointF positionInterceptor(float x, float y) {
PointF translation = new PointF(x, y);
PointF[] previewPoints = currentEditView.computeVertexPoints(translation);
float previewCenterX = (previewPoints[0].x + previewPoints[2].x) / 2f;
float previewCenterY = (previewPoints[0].y + previewPoints[2].y) / 2f;
float viewCenterX = getWidth() / 2f;
float viewCenterY = getHeight() / 2f;
float deltaX = viewCenterX - previewCenterX;
float deltaY = viewCenterY - previewCenterY;
// 小于10像素吸附
if (Math.abs(deltaX) <= 10) {
translation.x += deltaX;
}
if (Math.abs(deltaY) <= 10) {
translation.y += deltaY;
}
return translation;
}