所谓阻尼效果,什么是阻尼效果,好吧,我不知道怎么去描述它,看图吧,真相一看就懂(参看附件gif图)

此效果在iphone上非常常见,当列表滑动到顶部或者底部,没有内容时,列表跟随手指移动一定距离,android自身的listview是滑动到顶部或者底部时,会有一层淡淡的颜色,个人比较喜欢后者,但常常在项目中会有类似于前者的需求。仿爱疯,你懂的。

好了,这里我们在说一下可能需要主要到的地方:

1.手指滑动,listview中的item跟随手指滚动(如何做到?)

2.item移动的距离小于手指滑动的距离(这个好办)

3.手指抬起之后,listview自动滚回到顶部位置(怎么办呢?)

这里我还是在代码里面来说吧:

activity_main.xml

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:padding="@dimen/padding_medium"

android:text="listview阻尼效果"

android:id="@+id/textview"

android:textSize="18sp"

tools:context=".MainActivity"/>

android:id="@+id/list"

android:layout_width="fill_parent"

android:layout_marginTop="10dp"

android:layout_below="@+id/textview"

android:layout_height="wrap_content"/>

PullListView.java

package com.example.pulllistview;

import android.content.Context;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.widget.ListView;

/**自定义阻尼效果列表**/

public class PullListView extends ListView implements Runnable {

private float mLastDownY=0f;

private int mDistance=0;

private int mStep=0;

private boolean mPositive=false;

private String Tag="PullListview";

public PullListView (Context context, AttributeSet attrs) {

super(context, attrs);

}

public PullListView (Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

public PullListView (Context context) {

super(context);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN: //手指按下时触发

Log.d(Tag,"ActionDown");

if (mLastDownY== 0f &&mDistance== 0) {

mLastDownY=event.getY();

Log.d(Tag,"mLastDownY赋值"+mLastDownY);

return true;

}

break;

case MotionEvent.ACTION_CANCEL:

break;

case MotionEvent.ACTION_UP: //手指抬起之后触发

Log.d(Tag,"ActionUP");

if (mDistance != 0) {

System.out.println("---post");

mStep=1;

mPositive= (mDistance>= 0);

this.post(this);

return true;

}

mLastDownY=0f;

mDistance=0;

break;

case MotionEvent.ACTION_MOVE:  //手指按下之后滑动触发

Log.d(Tag,"ActionMove");

if (mLastDownY != 0f) {

mDistance= (int) (mLastDownY - event.getY());

Log.d(Tag,"mLastDownY不为0,view跟随滑动"+"mDistance"+mDistance);

if ((mDistance <0&& getFirstVisiblePosition() == 0 &&

getChildAt(0).getTop() == 0) || (mDistance>0 &&

getLastVisiblePosition() == getCount() - 1)) {

//第一个位置并且是想下拉,就滑动或者最后一个位置向上拉

//这个判断的作用是在非顶端的部分不会有此滚动

mDistance /= 2; //这里是为了减少滚动的距离

scrollTo(0, mDistance); //滚动

return true;

}

}

mDistance=0;

break;

}

return super.onTouchEvent(event);

}

public void run() {

Log.d(Tag,"ActionUP调用post");

mDistance += mDistance >0 ? -mStep : mStep;

scrollTo(0, mDistance);

if ((mPositive && mDistance <= 0) || (!mPositive && mDistance>= 0)) {

scrollTo(0, 0);

mDistance=0;

mLastDownY=0f;

Log.d(Tag,"post中置0");

return;

}

mStep += 1;

// this.postDelayed(this, 10);

this.post(this);

}

}

MainActivtiy.java

package com.example.pulllistview;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.widget.ArrayAdapter;

public class MainActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

PullListView listview= (PullListView)findViewById(R.id.list);

listview.setAdapter(new ArrayAdapter(this,

android.R.layout.simple_list_item_checked,getData()));

}

private ListgetData(){

Listdata=newArrayList();

data.add("阻尼效果测试数据1");

data.add("阻尼效果测试数据2");

data.add("阻尼效果测试数据3");

data.add("阻尼效果测试数据4");

data.add("阻尼效果测试数据5");

data.add("阻尼效果测试数据6");

data.add("阻尼效果测试数据7");

data.add("阻尼效果测试数据8");

data.add("阻尼效果测试数据9");

data.add("阻尼效果测试数据10");

data.add("阻尼效果测试数据11");

data.add("阻尼效果测试数据12");

data.add("阻尼效果测试数据13");

return data;

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.activity_main, menu);

return true;

}

}

此处再提供另一种方法,但需要leve 为2.3及之后的才能使用,原因之前的sdk尚未此方法。该方法非常简单,还是看源码先.

BounceListView.java

package com.example.pulllistview;

import android.content.Context;

import android.util.AttributeSet;

import android.util.DisplayMetrics;

import android.widget.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

distancevariable 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 owncustom variable mMaxYOverscrollDistance;

return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX,

scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent);

}

}

android listview阻尼效果,自定义阻尼效果listview相关推荐

  1. Android开发:自定义GridView/ListView数据源

    http://mobile.51cto.com/android-259861.htm 在开发中,我们常常会遇到比较复杂的GridView/ListView的布局,重新实现BaseAdapter不但能帮 ...

  2. 【Android开发】自定义ListView,使用通用适配器,并实现ListView上的每一项和每一项上的按钮等控件同时监听

    ListView在Android开发中是比较常用的系统组件,但是有时候我们除了需要做ListView上每一行的点击监听事件之外,如果每一行上还有其他需要监听的控件例如Button.CheckBox等, ...

  3. android 在自定义的listview(有刷新加载项)列表中,数据过少时不能铺满整个屏幕时,header和footer同时显示问题...

    android  在自定义的listview(有刷新加载项)列表中,数据过少时,当刷新时,加载项也会显示,这是很头疼的一个问题,查阅了一些资料,总结了一个比较不错的方法: 原来代码: 1 @Overr ...

  4. android listview 美化,Android界面美化 -- 自定义ListView分割线

    ListView默认的分割线 ListView会在item之间添加一个默认的分割线.在XML中添加一个ListView,其对应的属性如下. 可以看到ListView默认样式中设置了一个Divider, ...

  5. 自定义类似于listView中Item背景

    自定义类似于listView中Item背景 文章分类:移动开发 方法一. drawable/listitem_bk.xml Xml代码  <?xml version="1.0" ...

  6. ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.

    本篇主要功能. 通过xml pull解析得到数据,然后通过自定义的Adapter绑定数据源,ListView绑定适配器,并且实现Item项的点击事件以及子View控件的点击事件. 一.实体类. Boo ...

  7. 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

    基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...

  8. android listview边框颜色,Android实现带有边框的ListView和item的方法

    本文实例讲述了Android实现带有边框的ListView和item的方法.分享给大家供大家参考,具体如下: 想为ListView和item四周添加边框有两种方法: 1.贴一张带有边框效果的背景图 2 ...

  9. android 两列菜单,【Android】实战开发之ListView同一个item显示2列的实现方法(仿2列商品列表)...

    Android实战开发中,ListView控件用途十分广泛,各种自定义控件多种多样.当项目要求实现一个2列的商品列表形式的界面,我们首先肯定想到用ListView,然后我们可以使用百度的自定义List ...

  10. [Android精品源码] Android 仿美团网,探索ListView的A-Z字母排序功能实现选择城市

    Material Design中文版Code4APPPHP100UI4APP 开启辅助访问设为首页收藏本站快捷导航切换到宽版切换风格 石刚 | |我的 |签到打卡 |设置 |消息 |提醒(2) |退出 ...

最新文章

  1. plsql连接不上64位oracle,plsql develope连接64位Oracle 11g出错解决方案(图)
  2. poj1321 DFS
  3. MongoDB shell 操作
  4. JAVA第一个GUI程序---计算器
  5. 【转载】 详细介绍Flex中操作XML
  6. 再砸67亿!本硕博都给钱!该市带头抢人!
  7. 记录一次conda环境报错的解决ImportError:: Library not loaded: @rpath/libffi.7.dylib
  8. volley三种基本请求图片的方式与Lru的基本使用:正常的加载+含有Lru缓存的加载+Volley控件networkImageview的使用...
  9. 获取两个字符串中最大相同子串
  10. Illustrator 教程,如何在 Illustrator 中更改图稿颜色?
  11. BeetlSql中的Mapper
  12. Linux内核kernel panic机制浅析
  13. 【转】大地测量系统和参考框架
  14. c++动态存储空间分配
  15. python爬取海量精美高清漂酿纯真可爱善良小姐姐壁纸(老司机福利)
  16. MySQL - 语句优化
  17. IAR因版本不兼容打不开工程文件解决(Broken options、ICC8051、XLINK)
  18. 再见 Logstash,是时候拥抱下一代开源日志收集系统 Fluentd 了
  19. 从零开始搭建Node.js, Express, Ejs, Mongodb服务器
  20. ubuntu 硬盘情况占用分析

热门文章

  1. 20155322 2016-2017-2 《Java程序设计》第8周学习总结
  2. HDU4585 Shaolin(treap)
  3. vue路由报错Avoided redundant navigation
  4. 贪心算法解决汽车加油问题
  5. vue+原生js实现从excel复制内容粘贴至table中展示
  6. 信息收集总结(基本信息搜集思路)
  7. 【转载】【PC】解决访问小米路由器外接硬盘需要密码/无密码访问小米路由器共享盘
  8. 工业锅炉计算机控制系统框图,锅炉控制(汇总).ppt
  9. 计算机在线使用高级,2017高会《职称计算机》Internet应用:Internet高级选项
  10. 蓝牙定位网关-蓝牙网关通过三角定位获取蓝牙设备的位置