ZNDS智能电视网 推荐当贝市场

TV应用下载 / 资源分享区

软件下载 | 游戏 | 讨论 | 电视计算器

综合交流 / 评测 / 活动区

交流区 | 测硬件 | 网站活动 | Z币中心

新手入门 / 进阶 / 社区互助

新手 | 你问我答 | 免费刷机救砖 | ROM固件

查看: 17838|回复: 2
上一主题 下一主题
[案例]

android 自定义ScrollView实现反弹效果(以及解决和ListView之间的冲突)

[复制链接]
跳转到指定楼层
楼主
发表于 2013-8-28 16:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
16首先还是一贯作风,先看一些案例:(微信界面)                 
玩过微信的朋友想必很熟悉,其实就是界面可以拖拽,会有反弹效果,看起来很炫酷.(总之比拖拽没反应的死板要好.)下面我来一一讲解如何实现这样效果:原理:MyScrollView.java view plain   
注释已经很明确,我也不过多解释,如有不明请留言。效果:     
下拉效果,松开会自动回缩.   
   
效果图是我随便弄的,这个比较简单,下面我们看下如果自定义的ScrollView里面包含ViewGroup类的控件如何办?二:自定义ScrollView里面包含ListView.想必这种效果比较常见,用处也比较广.但是单存的用上面自定义的ScrollView是行不通的,滑动时候相当不灵敏,发生错乱.为何:因为Touch受到影响,因为要继续向下传递嘛.我们要对上面自定义稍做修改:MyScrollView.java view plain这个与上面那个稍有不同,我简单讲解下不同之处:   
我们要排除出ACTION_MOVE移动计算,因为第一次无法得知y坐标, 在MotionEvent.ACTION_DOWN中是获取不到, 因为此时是MyScrollView的touch事件传递到到了LIstView的孩子item上面.所以从第二次计算开始.(这里其实不应该这么搞,但是想不到更好的方法就只有这么搞了.如有好方法,记得share). 然而我们也要进行对第一次移动的距离deltaY进行初始化,就是第一次移动的时候让滑动距离归0. 之后的在进行记录执行相应的计算.哈哈,明白了吧.其实也不难,可是也花了我好些时间.看下效果图吧.效果图:                             
              原样                                      下拉会自动缩回                       上拉会自动缩回   
看着勉强凑合吧,重要的是实现.   
   
   
/********************************仔细品读想必对你有帮助*****************************************/在这里我额外补充一点,不管你是否遇到过,总之掌握了对你没有害处,为之,我可是花费了2个小时才发现错误在哪里,原因:自己很土鳖.呵呵,不瞎扯了.adapter.notifyDataSetChanged();这句话想必大家都不陌生, 作用:动态更新UI数据用的.用法简单说明:异步或开线程对数据源BaseAdapter里面的数据进行更新.然后在主线程中执行adapter.notifyDataSetChanged();(其实就是从新执行getView方法,自己可以调试try 一下.)但是我们这里用的不是单纯的ListView,而是自定义的ScrollView包裹着ListView,而ListView和ScrollView本来是冤家,想必现在大家都明白怎么解决,就是我setAdapter();后再次对ListView布局从新布局,这样有效的解决了二者的冲突.方法如下:(大家都看的明白,这里就不过多解释) view plain重点:我们在其中执行了adapter.notifyDataSetChanged();UI没有做出任何反映,这个为什么呢?牛逼人物我想一目了然就知道哪里,但是我却花了2个小时,原因:还是原理没搞懂.解释:我们首先解释下显示的效果原理:首先我们先把ListView show出来了,因为和ScrollView冲突然后我们又调用setListViewHeightBasedOnChildren();进行重新排版布局,才使得显示我们要的那种效果,之后我们对数据源做的修改,调用了adapter.notifyDataSetChanged();原理上应该显示出来了(此时数据源已经更新),因为此时我们setListViewHeightBasedOnChildren();只是显示我们修改数据之前,所以UI是不会更新的,所以要想更新,那么我们得从新调用一下setListViewHeightBasedOnChildren();根据最新的数据源绘图,这样就不会出错了。大家明白了吧,只要明白道理了,其实很简单.效果图就不展示了,想必大家都知道是what.   
   
上诉有一个小BUG,就是如果当数据超出一屏的话,你下拉的时候不松开,然后慢慢向上移动,你会发现跑得那是相当的快,如果想做成微信那种效果就是下拉的时候刷新,那么相当不好控制,原因其实很简单:当我们下拉的时候用的根本不是ScrollView的滑动.我们是通过对layout布局进行时时更新,此时的getScrollY()始终为0,但是你停止下拉的时候反而向上滑动的时候这个时候getScrollY()就不为0,原因为什么呢,因为我们下拉其实就是让布局向下移动了,抛开这里其实就相当于我滑动了,所以你上滑动的时候会ScrollView滑动会影响你,(自己可以测试看下log.)这就是bug原因,解决办法:我们只需要在滑动中添加: scrollBy(0, -deltaY);当超过一屏的时候ScrollView就会有自己的滑动,但是必须取消该滑动,因为我们有自己的滑动,作用:抵消ScrollView自带滑动.从而至运用对布局时时更新.问题解决了,不过又有一个扯淡的问题,我到底在瞎忙什么,直接用简单的布局文件不就行了,为何要用ScrollView呢,还有ScrollView这个东西和ListView冲突在加上对Touch事件的分发处理不是那么协调,NND,搞了一下午,现在头都大了.   
   
   

上一篇:在Ubuntu上下载、编译和安装Android最新源代码
下一篇:第二十六讲:Android中的GPS应用入门

相关帖子

沙发
发表于 2013-11-4 14:24 | 只看该作者
有远吗吗
回复 支持 反对

使用道具 举报

板凳
发表于 2016-3-10 19:47 | 只看该作者
很给力,ZNDS有你更精彩!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|新帖|标签|软件|Sitemap|ZNDS智能电视网 ( 苏ICP备2023012627号 )

网络信息服务信用承诺书 | 增值电信业务经营许可证:苏B2-20221768 丨 苏公网安备 32011402011373号

GMT+8, 2024-4-27 09:49 , Processed in 0.060618 second(s), 15 queries , Redis On.

Powered by Discuz!

监督举报:report#znds.com (请将#替换为@)

© 2007-2024 ZNDS.Com

快速回复 返回顶部 返回列表