功能概览
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() {@Overridepublic 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;// 传入自定义的TAVWidgetContentViewparam.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() {@Overridepublic void onWidgetClick(TAVWidget widget, MotionEvent event) {// 挂件被点击}@Overridepublic void onWidgetTouchBegin(TAVWidget widget, MotionEvent event) {// 挂件开始拖动}@Overridepublic void onWidgetTouchEnd(TAVWidget widget, MotionEvent event) {// 挂件拖动结束}@Overridepublic void onWidgetAdjust(TAVWidget widget, TAVWidgetOperationMode operationMode) {// 挂件正在拖动}@Overridepublic void onWidgetActive(TAVWidget widget) {// 挂件被激活编辑}@Overridepublic void onWidgetResign(TAVWidget widget) {// 挂件被取消激活}});}}
高级操作
需要重写 TAVWidgetContentView 相关方法。
自定义 TAVWidgetContentView 展示逻辑
@Overrideprotected boolean shouldShowEditView() {// 增加自己的展示判断逻辑return super.shouldShowEditView();}@Overrideprotected void updateWidgetEditViewVisibility() {if (null != currentEditView && null != currentWidget) {final boolean shouldShow = shouldShowEditView();// 根据展示条件修改TAVWidgetEditView可见性}}
操作拦截
TAVWidgetContentView 提供了下列接口实现对挂件的拦截:
接口名 | 描述 |
positionInterceptor | 挂件位置拦截。 |
rotateInterceptor | 挂件旋转角度拦截。 |
scaleInterceptor | 挂件缩放拦截。 |
示例代码展示了通过重写
positionInterceptor方法来实现移动时的位置吸附效果:@Overrideprotected 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;}