效果图省略。。

activity_main.xml(仅仅有一个自己定义ListView)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.dampingdemo.MainActivity" > <com.example.dampingdemo.DampingListView1
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</com.example.dampingdemo.DampingListView1> </RelativeLayout>

MainActivity(ArrayListAdapter 为了简化代码)

package com.example.dampingdemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter; public class MainActivity extends Activity { private DampingListView1 dampingListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dampingListView = (DampingListView1) findViewById(R.id.listView); //data
String[] data = {"A","B","C","A","B","C","A","B","C","A","B","C","A","B","C","A","B","C","A","B","C","A","B","C"};
//获取适配器
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data );
//设置适配器
dampingListView.setAdapter(adapter);
}
}

DampingListView1(第一种方法)

package com.example.dampingdemo;

import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ExpandableListView;
import android.widget.ListView;
/**
* 1. 在View中添加了overSrollBy方法,用于记录x, y 轴上滚动 2. 在AbsListView的onTouchEvent中推断是否到达边界(顶部 或 底部) ,然后调用view.overScrollBy ,传入 mScrollY等參数 3. overScrollBy 终于赋值给View的mScrollX, mScrollY 两个变量 4. 在AbsListView中调用完overScrollBy之后,调用invalidate重绘
*
*/
public class DampingListView1 extends ListView {
private static final int MAX_Y_OVERSCROLL_DISTANCE = 200; private Context mContext;
private int mMaxYOverscrollDistance; public DampingListView1(Context context) {
super(context);
mContext = context;
initBounceListView();
} public DampingListView1(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
initBounceListView();
} public DampingListView1(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
initBounceListView();
} private void initBounceListView() { 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) {
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
scrollRangeX, scrollRangeY, maxOverScrollX,
mMaxYOverscrollDistance, isTouchEvent);
} }

+++++++++++++++++++++++++++或者另外一种方法+++++++++++++++++++++++++++++++++++++++

DampingListView

package com.example.dampingdemo;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ExpandableListView;
import android.widget.ListView; public class DampingListView extends ListView implements Runnable { // 手指点位置的Y坐标
private float mLastDownY = 0f;
// 移动距离
private int mDistance = 0;
private int mStep = 0;
// 是否移动过
private boolean mPositive = false; /**
* 构造器
*/
public DampingListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
} public DampingListView(Context context, AttributeSet attrs) {
super(context, attrs);
} public DampingListView(Context context) {
super(context);
} /**
* TouchEvent事件
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 系列事件,手指第一次按下时触发
if (mLastDownY == 0f && mDistance == 0) {
mLastDownY = event.getY();
return true;
}
break; case MotionEvent.ACTION_CANCEL:
break; case MotionEvent.ACTION_UP:
// 手指离开之后触发
if (mDistance != 0) {
mStep = 1;
mPositive = (mDistance >= 0);
// 就可以把你的Runnable对象添加到UI线程中执行。
this.post(this);
return true;
}
// 又一次赋值
mLastDownY = 0f;
mDistance = 0;
break; case MotionEvent.ACTION_MOVE: // 手指按下之后滑动触发
if (mLastDownY != 0f) {
mDistance = (int) (mLastDownY - event.getY());
if ((mDistance < 0 && getFirstVisiblePosition() == 0 && getChildAt(
0).getTop() == 0)
|| (mDistance > 0 && getLastVisiblePosition() == getCount() - 1)) {
// 第一个位置而且是想下拉,就滑动或者最后一个位置向上拉
// 这个推断的作用是在非顶端的部分不会有此滚动
mDistance /= 3; // 这里是为了降低滚动的距离
scrollTo(0, mDistance); // 滚动
return true;
}
}
// 置为0。有自己主动滑动的效果
mDistance = 0;
break;
}
return super.onTouchEvent(event);
} public void run() {
mDistance += mDistance > 0 ? -mStep : mStep;
scrollTo(0, mDistance);
// 下拉mPositive是false,上拉是true
if ((mPositive && mDistance <= 0) || (!mPositive && mDistance >= 0)) {
scrollTo(0, 0);
mDistance = 0;
mLastDownY = 0f;
return;
}
mStep += 1;
this.post(this);
}
}

ListView阻尼效果的更多相关文章

  1. Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位

     <Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位> Android本身的ListView拉到顶部或者底部会在顶部/底部边缘间隙出现一道"闪光&quo ...

  2. Android -------- BouncingJellyView 果冻视图(阻尼效果)

    分享一个不错的效果,分享给大家 BouncingJellyView 果冻视图,就像果冻一样伸缩弹跳,也叫阻尼效果.这个效果在MIUI上面到处都可以看到. 效果图: 使用 项目更目录bulid.grad ...

  3. 张高兴的 UWP 开发笔记:横向 ListView

    ListView 默认的排列方向是纵向 ( Orientation="Vertical" ) ,但如果我们需要横向显示的 ListView 怎么办? Blend for Visua ...

  4. Android—万能ListView适配器

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...

  5. Android—ListView条目背景为图片时,条目间距问题解决

    ListView是android开发中使用最普遍的控件了,可有的listView条目的内容颇为丰富,甚至为了美观,背景用指定图片,如下图:

  6. Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)

    昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...

  7. listview下拉刷新和上拉加载更多的多种实现方案

    listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局        android系统为listview提供了addfootview ...

  8. Android listview和gridview以及view的区别

    GridView 可以指定显示的条目的列数. listview一般显示的条目的列数都是一列 如果是列表(单列多行形式)的使用ListView,如果是多行多列网状形式的优先使用GridView andr ...

  9. mono for android Listview 里面按钮 view Button click 注册方法 并且传值给其他Activity 主要是context

    需求:为Listview的Item里面的按钮Button添加一个事件,单击按钮时通过事件传值并跳转到新的页面. 环境:mono 效果: 布局代码 主布局 <?xml version=" ...

随机推荐

  1. 基本数据类型(dict)

    1.定义 dict => {"key":'value',"a":1} 字典是无序的,字典是可变的 字典的键 => 可哈希(不可变),唯一 字典的值 ...

  2. [arc082e]ConvexScore

    题意: 给出直角坐标系中的$N$个点$(X_i,Y_i)$,定义由其中部分点构成的点集为“凸点集”当且仅当这些点恰好能构成一个凸多边形(内部没有其他点). 如图,点集$\{A,C,E\}$和$\{B, ...

  3. 学习参考《父与子的编程之旅python【第二版】》高清中文版PDF+高清英文版PDF+源代码

    对于初步接触编程语言的朋友,推荐看一看<父与子的编程之旅第2版>,对于完全编程零基础的很友好! 图文并茂,过多的文字堆垒很容易让人产生厌倦情绪,也更容易让人产生放弃的想法.使用了大量插图, ...

  4. 'mingw32-make' 不是内部或外部命令,也不是可运行的程序 或批处理文件。(的解决方案)

    问题如上. 解决方案:找到mingw32-make,方法是在计算中搜索 然后将其复制到C:Windows\System32下,需要管理员权限才能复制的情况下直接点继续.然后就可以了.

  5. 洛谷 P4147 玉蟾宫 (最大子矩形问题)

    这道题用到了悬线法,非常牛逼,可以看这个论文. https://blog.csdn.net/twtsa/article/details/8120269 #include<cstdio> # ...

  6. 平凡主丛上的Yang-Mills理论

    本文是复旦大学由丁青教授的暑期课程“Yang-Mills理论的几何及其应用”所作笔记,会有少许修正. 所需基础: 多元微积分学 微分方程(常微分方程,数学物理方程) 曲线曲面论(初等微分几何) 以下是 ...

  7. hdu5137 How Many Maos Does the Guanxi Worth(单源最短路径)

    题目链接:pid=5137">点击打开链接 题目描写叙述:如今有一张关系网.网中有n个结点标号为1-n.有m个关系,每一个关系之间有一个权值.问从2-n-1中随意去掉一个结点之后,从1 ...

  8. [WebGL入门]十五,为多边形涂抹颜色(顶点颜色的指定)

    注:文章译自http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外.鄙人webgl研究还不够深入.一些专业词语.假设翻译有误.欢迎大家指 ...

  9. d堆

    就是d叉堆,是二叉堆的简单推广(http://blog.csdn.net/buleriver/article/details/38469907) 对于一个d堆.也是能够使用数组表示.关键是怎样通过索引 ...

  10. Linux下查询CPU 缓存的工具

    在Linux下能够使用例如以下工具查询CPU缓存: 方式1: $ lscpu L1d cache: 32K <span style="white-space:pre"> ...