当前位置: 移动技术网 > 移动技术>移动开发>Android > Android DragVideo实现播放视频时任意拖拽的方法

Android DragVideo实现播放视频时任意拖拽的方法

2019年07月24日  | 移动技术网移动技术  | 我要评论
android dragvideo实现播放视频时任意拖拽 dragvideo a method to drag the video when playing video

android dragvideo实现播放视频时任意拖拽

dragvideo

a method to drag the video when playing video

一种在播放视频时,能够拖拽的方案

为什么有这个工程

经常在爱奇艺网站上看电影,看到如果滑动掩盖了播放窗口后,就后在最下面有一个小播放界面。并且这个播放界面,是可以任意拖拽的。感觉很酷

这里写图片描述

既然web端能实现,就想了想在移动端设备上,是否也能实现这个效果,于是就有了…

效果图:


这里写图片描述 ——————> 这里写图片描述

实现思路:1、播放视频的view选择textureview

2、listview下方盖上自定义viewdraghelper,当在播放视频时,通过自定义viewdraghelper进行拖动textureview

3、进行渐变处理,让两个view的文字能够交替显示

4、当textureview到达右下方时,控制在水平方向上拖动,到达左边界时,如果再滑动,就销毁textureview代码分析:

关于viewdraghelper要注意如下几点:

1.viewdraghelper.callback是连接viewdraghelper与view之间的桥梁(这个view一般是指拥子view的容器即parentview)。

2.viewdraghelper的实例是通过静态工厂方法创建的;你能够指定拖动的方向;viewdraghelper可以检测到是否触及到边缘;

3.viewdraghelper并不是直接作用于要被拖动的view,而是使其控制的视图容器中的子view可以被拖动,如果要指定某个子view的行为,需要在callback中想办法;

4.viewdraghelper的本质其实是分析onintercepttouchevent和ontouchevent的motionevent参数,然后根据分析的结果去改变一个容器中被拖动子view的位置( 通过offsettopandbottom(int offset)和offsetleftandright(int offset)方法 ),他能在触摸的时候判断当前拖动的是哪个子view;

5.虽然viewdraghelper的实例方法.viewdraghelper create(viewgroup forparent, callback cb) 可以指定一个被viewdraghelper处理拖动事件的对象,但viewdraghelper类的设计决定了其适用于被包含在一个自定义viewgroup之中,而不是对任意一个布局上的视图容器使用viewdraghelper。

1.自定义的customviewdraghelper的初始化

viewdraghelper一般用在一个自定义viewgroup的内部,比如下面自定义了一个直接继承于viewgroup的类dragvideoview,dragvideoview内部有一个mdraghelper作为成员变量:

这里写图片描述

创建一个带有回调接口的viewdraghelper,这里是用myhelpercallback,这些都是一些基本使用方法
拖动行为的处理已在注释中给出

这里写图片描述
这里写图片描述
这里写图片描述

当在mainactivity调用viewdraghelper的setcallback方法时,以上回调就能作用了。当点击节目列表页(第一个显示listview的界面)的item时,调用playvideo()方法,方面内部通过dragvideoview.show方法,就开始显示dragvideoview。这时视频开始播放起来,并且,我们也可以对其进行拖拽了。

这里写图片描述 

那么在拖动的过程中,我们要在dragvideoview中重写ontouchevent方法,如下

这里写图片描述

以上方法最后,我们调用了,mdraghelper.processtouchevent(event);也就是我们自定义的customviewdraghelper类,这个方法没有改动,就是viewdraghelper的processtouchevent方法。

这里写图片描述
这里写图片描述
这里写图片描述 

总结下这个方法

在processtouchevent中对action_down、action_move和action_up事件进行了处理:

1.在action_down中调用回调接口中的trycaptureview方法,看当前touch的view是否允许拖动

2.在action_move中,view的坐标发生改变,调用回调接口中的onviewpositionchanged方法,根据坐标信息对view进行layout,通过viewhelper这个类中的setscalex、setscaley方法,实现在拖动的过程中view在xy坐标上进行相应比例的缩放;

3.在action_up后调用回调接口中的onviewreleased方法,此方法中一个重要的任务是在action_up事件后,实现view的自动滑动,这里主要是使用了viewdraghelper中smoothslideviewto方法

这里写图片描述

接着到达forcesettlecapturedviewat方法

这里写图片描述

上面start了viewdraghelper中的mscroller,在滑动过程中,通过重写computescroll方法,可用用viewcompat.postinvalidateonanimation(this)方法重绘view

这里写图片描述

最后由于拖拽过程中的显示视频的textureview会不断变化,通过设置textureview.surfacetexturelistener,来监听当前textureview的变化过程。

这里写图片描述

项目下载地址:

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网