转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53638896

前言

项目已开源到我的github: https://github.com/hejunlin2013/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要注意如下几点:

  • ViewDragHelper.Callback是连接ViewDragHelper与view之间的桥梁(这个view一般是指拥子view的容器即parentView);
  • ViewDragHelper的实例是通过静态工厂方法创建的;你能够指定拖动的方向;
  • ViewDragHelper可以检测到是否触及到边缘;
  • ViewDragHelper并不是直接作用于要被拖动的View,而是使其控制的视图容器中的子View可以被拖动,如果要指定某个子view的行为,需要在Callback中想办法;
  • ViewDragHelper的本质其实是分析onInterceptTouchEvent和onTouchEvent的MotionEvent参数,然后根据分析的结果去改变一个容器中被拖动子View的位置( 通过offsetTopAndBottom(int offset)和offsetLeftAndRight(int offset)方法 ),他能在触摸的时候判断当前拖动的是哪个子View;
  • 虽然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。这时视频开始播放起来,并且,我们也可以对其进行拖拽了。


本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53638896

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

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




本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53638896

总结下这个方法
在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的变化过程。

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易

DragVideo,一种在播放视频时,可以任意拖拽的方案相关推荐

  1. UC浏览器电脑版播放视频时出现崩溃怎么解决

    UC浏览器是一款功能强大的电脑浏览器.最近小编看到有用户反映播放视频的时候出现崩溃,这个该怎么解决呢?下面小编就来告诉你. UC浏览器电脑版播放视频时出现崩溃怎么解决 UC浏览器电脑版播放视频时出现崩 ...

  2. potplayer连续播放视频时保持原有屏幕大小不变

    右键|播放|播放设置 勾选仅在播放视频时调整一次尺寸|确定

  3. Chrome播放视频时只有声音没有画面

    问题 win7下Chrome在线播放视频时只有声音,没有画面 解决 打开Chrome,点击右上角菜单,选择设置 -> 高级 -> 系统,取消使用硬件加速模式(如果可用): 重启Chrome ...

  4. [RK3399][Android7.1] 调试笔记 --- 闪电浏览器全屏播放视频时黑屏

    Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 现象: 使用默认闪电浏览器全屏播放视频时黑屏, error log如下: 08-09 17:19:45 ...

  5. 【懒人系列】快手获取当前播放视频时长

    文章目录 前言 实现方法 总结 前言 上一篇文章我们留了个不大不小的问题:如何获取当前播放视频时长,进而视频播放完毕后自动翻页? 现在我们通过快手极速版App进行探讨和实现. 众所周知,Android ...

  6. php播放器隐藏播放地址,window_ASP中实现对MediaPlayer控件播放文件地址隐藏的解决方案,在播放视频时,直接查看页面 - phpStudy...

    ASP中实现对MediaPlayer控件播放文件地址隐藏的解决方案 在播放视频时,直接查看页面源文件可看到视频文件地址,MediaPlayer控件播放器将在页面上加上如下初始化语句: MediaPla ...

  7. 【opencv】10.播放视频 以及 设置任意键为暂停键

    1.imshow()显示图像帧时暂停键的用法 //严格按照下面这种方式和顺序不会有问题,例如在imshow后面直接跟cv::waitKey(1)后再char c=...会有问题. cv::namedW ...

  8. Unity3D两种方式播放视频

      Unity3D中播放游戏视频的方式有两种,第一种是在游戏对象中播放,就好比在游戏世界中创建一个Plane面对象,摄像机直直的照射在这个面上.第二种是在GUI层面上播放视频.播放视频其实和贴图非常相 ...

  9. sprd 11 播放视频时开启录屏,视频闪烁或提示正在加载问题

    1.首先是去掉了录屏时的弹框 2.录屏执行的是ScreenRecordDialog.java的方法;导致播放视频录屏时闪烁的问题原因就是启动Dialog的问题,即使dialog并没有show出来. 通 ...

  10. 使用xgplayer视频播放器播放视频时不显示总时长

    在项目中使用到了xgplayer来播放视频,官方演示是可以显示总时间的,但自己使用不显示 分析: 首先,打开控制台看看是不是没有总时长这个标签 找到原因了,不是没有总时长,而是把他显示成块级元素换行了 ...

最新文章

  1. Windows 2008 R2中的NAP新功能详解
  2. Dubbo 源码分析 - 集群容错之 Router
  3. 选择Bean 实例化策略
  4. 策略模式/Strategy
  5. Nginx 是如何实现高并发?常见的优化手段有哪些?
  6. Spring bean注入方式
  7. 69. (待补) (使用sqlite3)实现简单的管理系统 MVC 将链表作为内存数据模型,将sqlite3作为数据库,将终端作为交互界面。读数据库生成 链表,修改链表写入文件。...
  8. CSS按钮动画(二)
  9. 简单免费内网穿透教程,外网快速访问内网群晖/nas/树莓派
  10. 工业相机常见的数据传输接口方式
  11. 计算机1级考试试题ps,2016年计算机等级考试一级ps模拟练习题及答案
  12. 制图操作案例:在Pro画水墨画
  13. Android获取天气预报Demo
  14. 二维码制作方法有哪些?教你简单的二维码制作方法
  15. Vue.js面试题整理
  16. 【HTML作业】HTML设计--电影网站,影视网站
  17. 非阻塞recvfrom的设置
  18. android 实现AOP 使用Aspectj Kotlin版
  19. debian下切换内核
  20. originpro2021导入excel(.xls)

热门文章

  1. Springboot2.2.6中的RSocket使用, RSocket 进行反应式数据传输
  2. 算法笔记_面试题_4.树的遍历(前序/中序/后续遍历)
  3. OpnCV_(HoughCircles to find circles)霍夫变换检测圆形
  4. 机器学习精讲中7.1固定特征核中关于N维向量多项式特征映射的理解(二)
  5. C++学习笔记(一)——类和对象
  6. html5,css3, bootstraps
  7. mysql alter 增加修改表结构及约束
  8. spring boot全局统一异常处理
  9. Android 手把手教您自定义ViewGroup(一)
  10. 简单聊一下const