Android DragVideo實(shí)現(xiàn)播放視頻時(shí)任意拖拽的方法
Android DragVideo實(shí)現(xiàn)播放視頻時(shí)任意拖拽
DragVideo
A Method to Drag the Video When Playing Video
一種在播放視頻時(shí),能夠拖拽的方案
為什么有這個(gè)工程
經(jīng)常在愛(ài)奇藝網(wǎng)站上看電影,看到如果滑動(dòng)掩蓋了播放窗口后,就后在最下面有一個(gè)小播放界面。并且這個(gè)播放界面,是可以任意拖拽的。感覺(jué)很酷
既然web端能實(shí)現(xiàn),就想了想在移動(dòng)端設(shè)備上,是否也能實(shí)現(xiàn)這個(gè)效果,于是就有了…
效果圖:


實(shí)現(xiàn)思路:1、播放視頻的view選擇TextureView
2、ListView下方蓋上自定義ViewDragHelper,當(dāng)在播放視頻時(shí),通過(guò)自定義ViewDragHelper進(jìn)行拖動(dòng)TextureView
3、進(jìn)行漸變處理,讓兩個(gè)view的文字能夠交替顯示
4、當(dāng)TextureView到達(dá)右下方時(shí),控制在水平方向上拖動(dòng),到達(dá)左邊界時(shí),如果再滑動(dòng),就銷毀TextureView代碼分析:
關(guān)于ViewDragHelper要注意如下幾點(diǎn):
1.ViewDragHelper.Callback是連接ViewDragHelper與view之間的橋梁(這個(gè)view一般是指擁子view的容器即parentView)。
2.ViewDragHelper的實(shí)例是通過(guò)靜態(tài)工廠方法創(chuàng)建的;你能夠指定拖動(dòng)的方向;ViewDragHelper可以檢測(cè)到是否觸及到邊緣;
3.ViewDragHelper并不是直接作用于要被拖動(dòng)的View,而是使其控制的視圖容器中的子View可以被拖動(dòng),如果要指定某個(gè)子view的行為,需要在Callback中想辦法;
4.ViewDragHelper的本質(zhì)其實(shí)是分析onInterceptTouchEvent和onTouchEvent的MotionEvent參數(shù),然后根據(jù)分析的結(jié)果去改變一個(gè)容器中被拖動(dòng)子View的位置( 通過(guò)offsetTopAndBottom(int offset)和offsetLeftAndRight(int offset)方法 ),他能在觸摸的時(shí)候判斷當(dāng)前拖動(dòng)的是哪個(gè)子View;
5.雖然ViewDragHelper的實(shí)例方法.ViewDragHelper create(ViewGroup forParent, Callback cb) 可以指定一個(gè)被ViewDragHelper處理拖動(dòng)事件的對(duì)象,但ViewDragHelper類的設(shè)計(jì)決定了其適用于被包含在一個(gè)自定義ViewGroup之中,而不是對(duì)任意一個(gè)布局上的視圖容器使用ViewDragHelper。
1.自定義的CustomViewDragHelper的初始化
ViewDragHelper一般用在一個(gè)自定義ViewGroup的內(nèi)部,比如下面自定義了一個(gè)直接繼承于ViewGroup的類DragvideoView,DragvideoView內(nèi)部有一個(gè)mDragHelper作為成員變量:
創(chuàng)建一個(gè)帶有回調(diào)接口的ViewDragHelper,這里是用MyHelperCallback,這些都是一些基本使用方法
拖動(dòng)行為的處理已在注釋中給出
當(dāng)在MainActivity調(diào)用ViewDragHelper的setCallback方法時(shí),以上回調(diào)就能作用了。當(dāng)點(diǎn)擊節(jié)目列表頁(yè)(第一個(gè)顯示listview的界面)的item時(shí),調(diào)用playVideo()方法,方面內(nèi)部通過(guò)DragVideoView.show方法,就開(kāi)始顯示DragVideoView。這時(shí)視頻開(kāi)始播放起來(lái),并且,我們也可以對(duì)其進(jìn)行拖拽了。
那么在拖動(dòng)的過(guò)程中,我們要在DragVideoView中重寫onTouchEvent方法,如下
以上方法最后,我們調(diào)用了,mDragHelper.processTouchEvent(event);也就是我們自定義的CustomViewDragHelper類,這個(gè)方法沒(méi)有改動(dòng),就是ViewDragHelper的processTouchEvent方法。
總結(jié)下這個(gè)方法
在processTouchEvent中對(duì)ACTION_DOWN、ACTION_MOVE和ACTION_UP事件進(jìn)行了處理:
1.在ACTION_DOWN中調(diào)用回調(diào)接口中的tryCaptureView方法,看當(dāng)前touch的view是否允許拖動(dòng)
2.在ACTION_MOVE中,view的坐標(biāo)發(fā)生改變,調(diào)用回調(diào)接口中的onViewPositionChanged方法,根據(jù)坐標(biāo)信息對(duì)view進(jìn)行l(wèi)ayout,通過(guò)ViewHelper這個(gè)類中的setScaleX、setScaleY方法,實(shí)現(xiàn)在拖動(dòng)的過(guò)程中view在XY坐標(biāo)上進(jìn)行相應(yīng)比例的縮放;
3.在ACTION_UP后調(diào)用回調(diào)接口中的onViewReleased方法,此方法中一個(gè)重要的任務(wù)是在ACTION_UP事件后,實(shí)現(xiàn)view的自動(dòng)滑動(dòng),這里主要是使用了ViewDragHelper中smoothSlideViewTo方法
接著到達(dá)forceSettleCapturedViewAt方法
上面start了ViewDragHelper中的mScroller,在滑動(dòng)過(guò)程中,通過(guò)重寫computeScroll方法,可用用ViewCompat.postInvalidateOnAnimation(this)方法重繪view
最后由于拖拽過(guò)程中的顯示視頻的TextureView會(huì)不斷變化,通過(guò)設(shè)置TextureView.SurfaceTextureListener,來(lái)監(jiān)聽(tīng)當(dāng)前TextureView的變化過(guò)程。
項(xiàng)目下載地址:http://xiazai.jb51.net/201612/yuanma/DragVideo-master(jb51.net).rar
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- android使用surfaceview+MediaPlayer播放視頻
- Android ViewPager中顯示圖片與播放視頻的填坑記錄
- Android中使用TextureView播放視頻
- Android編程實(shí)現(xiàn)播放視頻時(shí)切換全屏并隱藏狀態(tài)欄的方法
- Android仿搜狐視頻、微視等列表播放視頻功能
- Android編程實(shí)現(xiàn)播放視頻的方法示例
- Android多媒體教程之播放視頻的四種方法
- Android 播放視頻常見(jiàn)問(wèn)題小結(jié)
- Android仿新浪微博/QQ空間滑動(dòng)自動(dòng)播放視頻功能
- android surfaceView實(shí)現(xiàn)播放視頻功能
相關(guān)文章
Android標(biāo)題欄上添加多個(gè)Menu按鈕的實(shí)例
這篇文章主要介紹了Android標(biāo)題欄上添加多個(gè)Menu按鈕的實(shí)例的相關(guān)資料,這里提供簡(jiǎn)單實(shí)例說(shuō)明如何添加多個(gè)menu按鈕的方法,需要的朋友可以參考下2017-09-09Android App界面的ListView布局實(shí)戰(zhàn)演練
這篇文章主要介紹了Android App界面的ListView布局方法,文中分了三種情況通過(guò)實(shí)例來(lái)講解,ListView適用于功能最簡(jiǎn)單的應(yīng)用程序UI布局,需要的朋友可以參考下2016-04-04Android Notification的多種用法總結(jié)
這篇文章主要介紹了Android Notification的多種用法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-06-06Android數(shù)據(jù)加密之異或加密算法的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Android數(shù)據(jù)加密之異或加密算法的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10Android中home鍵和back鍵區(qū)別實(shí)例分析
這篇文章主要介紹了Android中home鍵和back鍵區(qū)別,以實(shí)例形式較為詳細(xì)的分析并總結(jié)了home鍵和back鍵區(qū)別及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09解決EditText不顯示光標(biāo)的三種方法(總結(jié))
下面小編就為大家?guī)?lái)一篇解決EditText不顯示光標(biāo)的三種方法(總結(jié))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Android開(kāi)發(fā)之DOM解析xml文件的方法
這篇文章主要介紹了Android開(kāi)發(fā)之DOM解析xml文件的方法,涉及Android中DOM工廠對(duì)象的創(chuàng)建,文檔的獲取及節(jié)點(diǎn)的遍歷技巧,需要的朋友可以參考下2015-12-12點(diǎn)擊微信內(nèi)網(wǎng)頁(yè)a標(biāo)簽直接跳轉(zhuǎn)打開(kāi)淘寶APP的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于如何實(shí)現(xiàn)點(diǎn)擊微信內(nèi)網(wǎng)頁(yè)a標(biāo)簽直接跳轉(zhuǎn)打開(kāi)淘寶APP的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-11-11