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

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

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

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

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

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

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

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

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

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

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

相關(guān)帖子

沙發(fā)
發(fā)表于 2013-11-4 14:24 | 只看該作者 | 來(lái)自浙江
有遠(yuǎn)嗎嗎
板凳
發(fā)表于 2016-3-10 19:47 | 只看該作者 | 來(lái)自山東
很給力,ZNDS有你更精彩!

本版積分規(guī)則

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

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

GMT+8, 2024-10-20 16:34 , Processed in 0.071493 second(s), 15 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2024 ZNDS.Com

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