首頁 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計算器

綜合交流 / 評測 / 活動區(qū)

交流區(qū) | 測硬件 | 網(wǎng)站活動 | Z幣中心

新手入門 / 進(jìn)階 / 社區(qū)互助

新手 | 你問我答 | 免費刷機(jī)救磚 | ROM固件

查看: 20290|回復(fù): 2
上一主題 下一主題
[案例]

android 自定義ScrollView實現(xiàn)反彈效果(以及解決和ListView之間的沖突)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式 | 未知
16首先還是一貫作風(fēng),先看一些案例:(微信界面)                 
玩過微信的朋友想必很熟悉,其實就是界面可以拖拽,會有反彈效果,看起來很炫酷.(總之比拖拽沒反應(yīng)的死板要好.)下面我來一一講解如何實現(xiàn)這樣效果:原理:MyScrollView.java view plain   
注釋已經(jīng)很明確,我也不過多解釋,如有不明請留言。效果:     
下拉效果,松開會自動回縮.   
   
效果圖是我隨便弄的,這個比較簡單,下面我們看下如果自定義的ScrollView里面包含ViewGroup類的控件如何辦?二:自定義ScrollView里面包含ListView.想必這種效果比較常見,用處也比較廣.但是單存的用上面自定義的ScrollView是行不通的,滑動時候相當(dāng)不靈敏,發(fā)生錯亂.為何:因為Touch受到影響,因為要繼續(xù)向下傳遞嘛.我們要對上面自定義稍做修改:MyScrollView.java view plain這個與上面那個稍有不同,我簡單講解下不同之處:   
我們要排除出ACTION_MOVE移動計算,因為第一次無法得知y坐標(biāo), 在MotionEvent.ACTION_DOWN中是獲取不到, 因為此時是MyScrollView的touch事件傳遞到到了LIstView的孩子item上面.所以從第二次計算開始.(這里其實不應(yīng)該這么搞,但是想不到更好的方法就只有這么搞了.如有好方法,記得share). 然而我們也要進(jìn)行對第一次移動的距離deltaY進(jìn)行初始化,就是第一次移動的時候讓滑動距離歸0. 之后的在進(jìn)行記錄執(zhí)行相應(yīng)的計算.哈哈,明白了吧.其實也不難,可是也花了我好些時間.看下效果圖吧.效果圖:                             
              原樣                                      下拉會自動縮回                       上拉會自動縮回   
看著勉強(qiáng)湊合吧,重要的是實現(xiàn).   
   
   
/********************************仔細(xì)品讀想必對你有幫助*****************************************/在這里我額外補(bǔ)充一點,不管你是否遇到過,總之掌握了對你沒有害處,為之,我可是花費了2個小時才發(fā)現(xiàn)錯誤在哪里,原因:自己很土鱉.呵呵,不瞎扯了.adapter.notifyDataSetChanged();這句話想必大家都不陌生, 作用:動態(tài)更新UI數(shù)據(jù)用的.用法簡單說明:異步或開線程對數(shù)據(jù)源BaseAdapter里面的數(shù)據(jù)進(jìn)行更新.然后在主線程中執(zhí)行adapter.notifyDataSetChanged();(其實就是從新執(zhí)行g(shù)etView方法,自己可以調(diào)試try 一下.)但是我們這里用的不是單純的ListView,而是自定義的ScrollView包裹著ListView,而ListView和ScrollView本來是冤家,想必現(xiàn)在大家都明白怎么解決,就是我setAdapter();后再次對ListView布局從新布局,這樣有效的解決了二者的沖突.方法如下:(大家都看的明白,這里就不過多解釋) view plain重點:我們在其中執(zhí)行了adapter.notifyDataSetChanged();UI沒有做出任何反映,這個為什么呢?牛逼人物我想一目了然就知道哪里,但是我卻花了2個小時,原因:還是原理沒搞懂.解釋:我們首先解釋下顯示的效果原理:首先我們先把ListView show出來了,因為和ScrollView沖突然后我們又調(diào)用setListViewHeightBasedOnChildren();進(jìn)行重新排版布局,才使得顯示我們要的那種效果,之后我們對數(shù)據(jù)源做的修改,調(diào)用了adapter.notifyDataSetChanged();原理上應(yīng)該顯示出來了(此時數(shù)據(jù)源已經(jīng)更新),因為此時我們setListViewHeightBasedOnChildren();只是顯示我們修改數(shù)據(jù)之前,所以UI是不會更新的,所以要想更新,那么我們得從新調(diào)用一下setListViewHeightBasedOnChildren();根據(jù)最新的數(shù)據(jù)源繪圖,這樣就不會出錯了。大家明白了吧,只要明白道理了,其實很簡單.效果圖就不展示了,想必大家都知道是what.   
   
上訴有一個小BUG,就是如果當(dāng)數(shù)據(jù)超出一屏的話,你下拉的時候不松開,然后慢慢向上移動,你會發(fā)現(xiàn)跑得那是相當(dāng)?shù)目?如果想做成微信那種效果就是下拉的時候刷新,那么相當(dāng)不好控制,原因其實很簡單:當(dāng)我們下拉的時候用的根本不是ScrollView的滑動.我們是通過對layout布局進(jìn)行時時更新,此時的getScrollY()始終為0,但是你停止下拉的時候反而向上滑動的時候這個時候getScrollY()就不為0,原因為什么呢,因為我們下拉其實就是讓布局向下移動了,拋開這里其實就相當(dāng)于我滑動了,所以你上滑動的時候會ScrollView滑動會影響你,(自己可以測試看下log.)這就是bug原因,解決辦法:我們只需要在滑動中添加: scrollBy(0, -deltaY);當(dāng)超過一屏的時候ScrollView就會有自己的滑動,但是必須取消該滑動,因為我們有自己的滑動,作用:抵消ScrollView自帶滑動.從而至運用對布局時時更新.問題解決了,不過又有一個扯淡的問題,我到底在瞎忙什么,直接用簡單的布局文件不就行了,為何要用ScrollView呢,還有ScrollView這個東西和ListView沖突在加上對Touch事件的分發(fā)處理不是那么協(xié)調(diào),NND,搞了一下午,現(xiàn)在頭都大了.   
   
   

上一篇:在Ubuntu上下載、編譯和安裝Android最新源代碼
下一篇:第二十六講:Android中的GPS應(yīng)用入門

相關(guān)帖子

沙發(fā)
發(fā)表于 2013-11-4 14:24 | 只看該作者 | 來自浙江
有遠(yuǎn)嗎嗎
回復(fù) 支持 反對

使用道具 舉報

板凳
發(fā)表于 2016-3-10 19:47 | 只看該作者 | 來自山東
很給力,ZNDS有你更精彩!
回復(fù) 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號 )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號

GMT+8, 2024-12-28 03:41 , Processed in 0.067289 second(s), 15 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報:report#znds.com (請將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表