文档章节

ListView中重写overScrollBy()方法 实现拉出回弹结果

军歌
 军歌
发布于 2014/05/05 12:10
字数 1379
阅读 6021
收藏 6
点赞 1
评论 1

 第一项目组  道理解析 
      IOS上的bounce功能给人的感触感染很爽,当一个可以迁移转变的区域被拖到鸿沟时,它容许用户将内容拖过界,甩手后再弹回来,以一种很是棒的体式格式提示了用户鸿沟的存在,是IOS的一大特点。android2.3新增了overscroll功能,听名字就知道应当是bounce功能的翻版,但也许是出于专利方面的推敲,google的默认实现跟IOS有所不合,它只是在list拖到鸿沟处时做了一个发光的动画,小我感觉体验比IOS差远了。并且这个的发光在黑色靠山下固然结果不错,在其它靠山下可就难说了,是以很多人想要关掉它。 

      日前google上搜刮“android overscroll”,对此结果的先允很多,但关于其具体应用体式格式和实现,则很少涉及,偶有说起,也经常答非所问或貌同实异,反而误导了别人。于是我查阅了android相干源码,并做了一些测试,在此讲讲我的懂得。 

      起首是overscroll功能本身,在最顶层的View类供给了支撑,可经由过程setOverScrollMode函数把握其呈现前提。但其实View中并没有实现overscroll功能,它仅仅供给了一个帮助函数overScrollBy,该函数按照overScrollMode和内容是否须要迁移转变把握最大迁移转变局限,最后将策画成果传给onOverScrolled实现具体的overscroll功能,但此函数在View类中是全空的。

      overscroll功能真正的实现分别在ScrollView、AbsListView、HorizontalScrollView和WebView中各有一份,代码根蒂根基一样。以ScrollView为例,它在处理惩罚笔点移动消息时调用overScrollBy来迁移转变视图,然后重载了overScrollBy函数来实现具体功能,其地位策画经由过程OverScroller类实现。OverScroller作为一个策画引擎,应当是一个自力的模块,具体迁移转变结果和局限都不成能经由过程它来设置,我感觉没有须要细看。但迁移转变地位终极是它给出的,那相干数据必然要传递给它,回头看overScrollBy函数,它有两个把握overScroll出界局限的参数,几个实现里面都是取自ViewConfiguration.getScaledOverscrollDistance,而这个参数的值在我的源码中都是0,并且我没找到任何可以影响其成果的设置。 

      真悲催,绕了半天,android的默认实现里面底子没有给出overscroll功能,它只是供给了实现机制,要想用起来还得应用法度本身显式重写相干控件,估计还有一层隐含的意思,法令风险自大。在我的体系中一试,果真一个像素都不克不及拉出界。但那个闪光是怎么回事呢? 

      在处理惩罚笔点消息处,overScrollBy后面不远处有一段mEdgeGlowTop的操纵代码,看名字就像,用它一搜,相干机制就全熟悉打听了。mEdgeGlowTop在setOverScrollMode函数时创建,它应用的都是体系中固有的,甚至不克不及经由过程theme改变。它的实现道理也很简单,仅仅是两张png的合成,经由过程透明度的变更建造闪光的结果。更无语的是它既不克不及被应用法度接见,也不受任何把握,要封闭它的独一办法是setOverScrollMode(View.OVER_SCROLL_NEVER)。不然就重写onTouchEvent函数吧,想干啥都可以,只是得本身做。 

      谈到overScroll,很多文章都提到了ListView的setOverscrollHeader和setOverscrollFooter,很多人想经由过程这个来把握那个闪光结果。这两玩意不单可以经由过程函数设置,也可以在xml中指定,相当便利。但最后很多人发明没有任何感化,百思不得其解。其实这两张是用来作为overScroll拖过界时的靠山的,默认体系不克不及拖过界,天然永远都看不到,有些定制的体系中能拖出界几个像素,但也很丢脸清。 

                第二项目组  代码实现 
     1. 在View中增长了overSrollBy办法,用于记录x, y 轴上迁移转变。 

     2. 在AbsListView的onTouchEvent中断定是否达到鸿沟(顶部 或 底部) ,然后调用view.overScrollBy ,传入 mScrollY等参数 

     3. overScrollBy 终极赋值给View的mScrollX, mScrollY 两个变量 

     4. 在AbsListView中调用完overScrollBy之后,调用invalidate重绘 



自定义ListView 

public class BounceListView extends ListView{
    private static final int MAX_Y_OVERSCROLL_DISTANCE = 200;
     
    private Context mContext;
    private int mMaxYOverscrollDistance;
     
    public BounceListView(Context context){
        super(context);
        mContext = context;
        initBounceListView();
    }
     
    public BounceListView(Context context, AttributeSet attrs){
        super(context, attrs);
        mContext = context;
        initBounceListView();
    }
     
    public BounceListView(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
        mContext = context;
        initBounceListView();
    }
     
    private void initBounceListView(){
        //get the density of the screen and do some maths with it on the max overscroll distance
        //variable so that you get similar behaviors no matter what the screen size
         
        final DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
        final float density = metrics.density;
         
        mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANCE);
    }
     
    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent){ 
        //This is where the magic happens, we have replaced the incoming maxOverScrollY with our own custom variable mMaxYOverscrollDistance; 
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent);  
    }
     
}


    public class MainActivity extends Activity {  
      
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
              
            LinearLayout linearLayout = new LinearLayout(this);  
            linearLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));  
              
            setContentView(linearLayout);  
              
              
            BounceListView bounceListView = new BounceListView(this);  
              
            String[] data = new String[30];  
            for (int i = 0; i < data.length; i++) {  
                data[i] = "回弹结果 " + i;  
            }  
              
            ArrayAdapter<String> arrayAdapter =   
                    new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, data);  
              
            bounceListView.setAdapter(arrayAdapter);  
              
            linearLayout.addView(bounceListView);  
        }  
          
          
          
    }


© 著作权归作者所有

共有 人打赏支持
军歌
粉丝 9
博文 86
码字总数 43501
作品 0
深圳
程序员
加载中

评论(1)

hcoscina
hcoscina
您好。您这个自定义的ListView可以实现回弹的效果,现在我想自定义WebView实现回弹效果,想问您一下 mMaxYOverscrollDistance = (int) (density * MAX_Y_OVERSCROLL_DISTANC);中的MAX_Y_OVERSCROLL_DISTANC这个参数是什么意思啊?能不能跟我说一下啊!谢谢了!
Android新姿势:可以下拉/上拉回弹的ListView原理(续)

上一次自己根据原理写了个下拉ListView,结果现在才发现,其实谷歌的码神早已经做了相关的实现代码了!! 可是为什么直接用ListView看不到下拉效果呢? 其实这是因为版权的问题,这个下拉的效...

linin630 ⋅ 2014/11/18 ⋅ 0

Scroller和OverScroller

一、ViewDragHelper 二、OverScroller 参考ScrollView

GalaxyBruce ⋅ 2016/06/17 ⋅ 0

android 自定义ListView仿IOS"阻尼"效果

今天又在IOS上看到列表的"阻尼"效果,就是列表拉到表头或者表尾时,还可以继续往上或往下拉,松开手后,整个列表会弹回去,来看效果图: 整个实现重点在overScrollBy这个方法上,当你滚动lis...

贺路的路 ⋅ 2013/07/19 ⋅ 7

Android简易实战教程--第五十四话《视差特效》

查看更多进阶知识,可以关注我的公众号,微信搜索:Android小菜 这个简易实战教程系列专栏发现已经大半年没更新了啊,赶紧添点东西。 本文实现一个视差特效效果,动态效果如下: 代码十分简单...

qq_32059827 ⋅ 2017/10/26 ⋅ 0

android 想做有弹性的ListView,就是像qq那样的效果,用网上的方法有问题。。

这是重写overScrollBy的方法,但是这种方法,有时候会滚不回来 另外还有个问题,滚动到顶部和底部的阴影是怎么去掉的?

火龙神S ⋅ 2015/10/04 ⋅ 2

那些年不容错过的智能下拉刷新加载框架

一些值得学习的几个下拉刷新上拉加载开源库 功能齐全的AnimRefreshRecyclerView 根据列表的不同效果选择不同的布局管理器 根据不同的布局管理器设置分割线: 设置Header和Footer 手动刷新 An...

codeGoogle ⋅ 2017/09/26 ⋅ 0

一起撸个朋友圈吧(step1) ListView(上)篇

项目地址:https://github.com/razerdp/FriendCircle 一起撸个朋友圈吧这是本文所处文集,所有更新都会在这个文集里面哦,欢迎关注 下篇链接:http://www.jianshu.com/p/94e1e267b3b3 题目命...

⋅ 01/03 ⋅ 0

一起撸个朋友圈吧(step1) - ListView(上)篇

项目地址:github.com/razerdp/Fri… 下篇链接:http://www.jianshu.com/p/94e1e267b3b3 题目命名是不是很简单粗暴←_← 咳咳,进入正题,关于本项目什么的,在GitHub都写得清清楚楚了,我们...

WeiChaoFeng ⋅ 2017/12/14 ⋅ 0

Android面试题:Listview

今日,看到群里朋友发的一部分面试题,决定把这这些面试题的答案写下来,如下: 1、ListView怎么和ScrollView兼容? ok 2、ViewPager无限轮播图片 3、out of memory内存溢出怎么解决 4、三级...

微笑的江豚 ⋅ 2016/06/22 ⋅ 0

关于下拉刷新项目中所需要的功能(无痕过渡、loadingview出现方式、边界回弹)

PullRefreshLayout 首先吐槽一下现在流行的刷新库,一个字大,包涵个人很多集成到项目中不需要的类,也很难找到很满意的效果(无痕过渡,回弹的效果不够真实),所以自己自己动手丰衣足食,撸一...

北纬34点8度 ⋅ 2017/07/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

开启远程SSH

SSH默认没有开启账号密码登陆,需要再配置表中修改: vim /etc/ssh/sshd_configPermitRootLogin yes #是否可以使用root账户登陆PasswordAuthentication yes #是都开启密码登陆ser...

Kefy ⋅ 28分钟前 ⋅ 0

Zookeeper3.4.11+Hadoop2.7.6+Hbase2.0.0搭建分布式集群

有段时间没更新博客了,趁着最近有点时间,来完成之前关于集群部署方面的知识。今天主要讲一讲Zookeeper+Hadoop+Hbase分布式集群的搭建,在我前几篇的集群搭建的博客中已经分别讲过了Zookeep...

海岸线的曙光 ⋅ 35分钟前 ⋅ 0

js保留两位小数方法总结

本文是小编针对js保留两位小数这个大家经常遇到的经典问题整理了在各种情况下的函数写法以及遇到问题的分析,以下是全部内容: 一、我们首先从经典的“四舍五入”算法讲起 1、四舍五入的情况...

孟飞阳 ⋅ 53分钟前 ⋅ 0

python log

python log 处理方式 log_demo.py: 日志代码。 #! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "Q1mi""""logging配置"""import osimport logging.config# 定义三种......

inidcard ⋅ 今天 ⋅ 0

mysql 中的信息数据库以及 shell 查询 sql

Information_schema 是 MySQL 自带的信息数据库,里面的“表”保存着服务器当前的实时信息。它提供了访问数据库元数据的方式。 什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,...

blackfoxya ⋅ 今天 ⋅ 0

maven配置阿里云镜像享受飞的感觉

1.在maven目录下的conf/setting.xml中找到mirrors添加如下内容,对所有使用改maven打包的项目生效。 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.al......

kalnkaya ⋅ 今天 ⋅ 0

centos7下创建新用户并授权

1、创建新用户 创建一个用户名为:test adduser test 创建初始密码: passwd test 2、授予root权限 个人用户的权限只可以在/home/test下有完整权限,其他目录要看别人授权。而经常需要roo...

xixingzhe ⋅ 今天 ⋅ 0

求助:TiledMap如何旋转对象呢?

比如我要旋转一个梯子的角度,单纯在TiledMap旋转角度好像没有效果。那是要用代码来控制角度,还是说只能通过导入相对应的斜的图片才可以呢?

花谢自相惜 ⋅ 今天 ⋅ 0

Micronaut 之HelloWorld!

小试一下Micronaut,按照官方文档跑了一下helloworld 第一步克隆,按照官方文档是: git clone git@github.com:micronaut-projects/micronaut-core.git 结果怎么是这样?? 换个方法吧 git ...

桂哥 ⋅ 今天 ⋅ 0

pom文件

Aeroever ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部