欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

Android培訓(xùn)心得之實(shí)現(xiàn)可拖拽的GridView

2016-02-25 11:26:31 1328瀏覽

        之前扣丁學(xué)堂Android培訓(xùn)心得中上一篇文章《Android培訓(xùn)視頻之自定義GridView控件實(shí)現(xiàn)》讓很多讀者迫不及待的動(dòng)手嘗試了自定義GridView控件實(shí)現(xiàn),好吧,接下來就帶大家根據(jù)思路來實(shí)現(xiàn)可拖拽的GridView,新建一個(gè)項(xiàng)目就叫DragGridView新建一個(gè)類DragGridView繼承GridView,先來看看DragGridView的代碼,然后在根據(jù)代碼進(jìn)行相關(guān)的講解。

Android培訓(xùn)心得之實(shí)現(xiàn)可拖拽的GridView

        Android培訓(xùn)心得之實(shí)現(xiàn)可拖拽的GridView:

        首先看DragGridView的事件分發(fā)方法,不了解Android事件分發(fā)的可以先去了解下,Android事件分發(fā)對(duì)于自定義控件很重要,簡(jiǎn)單說下,當(dāng)我們點(diǎn)擊DragGridView的Item,先會(huì)去執(zhí)行dispatchTouchEvent()方法將事件分發(fā)下去,所以我們要重寫dispatchTouchEvent()方法在手指按下的時(shí)候根據(jù)pointToPosition()方法來獲取我們按下的item的position,根據(jù)getChildAt()方法來獲取該position上面所對(duì)應(yīng)的View, 并且開啟長(zhǎng)按的定時(shí)器,默認(rèn)時(shí)間為1000毫秒,如果在1000毫秒內(nèi)手指抬起或者手指在屏幕上滑動(dòng)出了該item,則取消長(zhǎng)按定時(shí)器,否則就表示可以進(jìn)行拖拽,手機(jī)友好的震動(dòng)一下,隱藏我們長(zhǎng)按的Item,屏幕調(diào)用createDragImage()方法來創(chuàng)建我們長(zhǎng)按的item的鏡像,創(chuàng)建Item的鏡像使用的是WindowManager類,該類可以創(chuàng)建一個(gè)窗體顯示在Activity之上,

        再此之前大家先要理解這幾個(gè)距離,理解這幾個(gè)距離之前要首先知道getRawX(),getRawY()和getX(),getY()的區(qū)別,getRawX(),getRawY()是相對(duì)于屏幕的原點(diǎn)的距離,而getX(),getY()是相對(duì)于控件左上方的點(diǎn)的距離,為了方便大家理解我用Word簡(jiǎn)單的畫了下圖,畫得不好,大家將就的看下,紅色框框?yàn)槲覀兊腉ridView

        mPoint2ItemTop 手指按下的點(diǎn)到該Item的上邊緣的距離,mPoint2ItemLeft 手指按下的點(diǎn)到該Item的左邊緣的距離,mOffset2Top DragGridView的上邊緣到屏幕上邊緣的距離,這個(gè)距離包裹狀態(tài)欄,標(biāo)題欄,或者一些DragGridView上面的布局的高度,這個(gè)很重要我們現(xiàn)實(shí)Item鏡像需要用到mOffset2Left DragGridView的左邊緣到屏幕左邊緣的距離,我這個(gè)Demo的這個(gè)距離為0,因?yàn)槲以O(shè)置DragGridView的寬度為充滿屏幕,但是我們要考慮假如DragGridView與屏幕左邊緣設(shè)置了間隙或者左邊有其他的布局的情形,mDownScrollBorder 這個(gè)距離表示當(dāng)DragGridView的item過多的時(shí)候,手機(jī)一屏顯示不完全,我們拖動(dòng)Item鏡像到這個(gè)高度的時(shí)候,DragGridView自動(dòng)向下滾動(dòng),mUpScrollBorder 這個(gè)和mDownScrollBorder相反,當(dāng)我們大于這個(gè)高度的時(shí)候,DragGridView自動(dòng)向上滾動(dòng)。

        理解了這六個(gè)距離,我們就來看看創(chuàng)建Item鏡像的方法里面,其他的我不多說,首先設(shè)置format為PixelFormat.TRANSLUCENT,表示除了我們顯示圖片和文字的其他地方為透明,之后就是x,y這兩個(gè)距離的計(jì)算,計(jì)算的是item的左上角的坐標(biāo),理解了上面這六個(gè)距離我們很容易得出x,y的坐標(biāo),可是你會(huì)發(fā)現(xiàn)y的坐標(biāo)減去了狀態(tài)欄的高度,這點(diǎn)大家需要注意下,另外我們需要獲取item的繪制緩存的Bitmap對(duì)象,然后將Bitmap設(shè)置到一個(gè)ImageView上面,為什么要這么做呢?如果調(diào)用addView()方法將item 直接添加到WindowManager里面,會(huì)有異常產(chǎn)生,因?yàn)閕tem已經(jīng)有了自己歸屬的父容器DragGridView,所有我們這里使用一個(gè)ImageView來代替item添加到WindowManager里面上面已經(jīng)完成了開始拖拽的準(zhǔn)備工作,要想拖動(dòng)鏡像我們還需要重寫onTouchEvent()方法,獲取移動(dòng)的X,Y的坐標(biāo),利用WindowManager的updateViewLayout方法就能對(duì)鏡像進(jìn)行拖動(dòng),拖動(dòng)的鏡像的時(shí)候?yàn)榱擞懈玫挠脩趔w驗(yàn),我們還要做item的實(shí)時(shí)交換效果,我們利用手指移動(dòng)的X,Y坐標(biāo),利用pointToPosition()來獲取拖拽到的position,然后將之前的item顯示出來,將拖拽到的item進(jìn)行隱藏,這樣子就完成了item在界面上面的交換.

        數(shù)據(jù)交換在本文中沒有詳細(xì)操作,只提供了回調(diào)接口OnChanageListener,我們只需要自己實(shí)現(xiàn)數(shù)據(jù)的交換邏輯然后刷新DragGridView即可,我們還需要實(shí)現(xiàn)DragGridView的自動(dòng)向上滾動(dòng)或者向下滾動(dòng),使用Handler和mScrollRunnable利用smoothScrollToPositionFromTop()來實(shí)現(xiàn)DragGridView滾動(dòng),具體的實(shí)現(xiàn)大家可以看扣丁學(xué)堂Android培訓(xùn)心得中講師對(duì)于此類代碼的詳細(xì)講解。

查看更多關(guān)于“Android培訓(xùn)資訊”的相關(guān)文章>>

標(biāo)簽:

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國(guó)免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號(hào)中關(guān)村智誠(chéng)科創(chuàng)大廈4層
京ICP備2021002079號(hào)-2   Copyright ? 2017 - 2022
返回頂部 返回頂部