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



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

Android本身的ListView拉到顶部或者底部会在顶部/底部边缘间隙出现一道“闪光”效果,暗示ListView已经到顶/底,不能再动了。

这是Android原生的ListView拉到顶部/底部的一种交互设计。交互设计的可选方案很多。Android 5.0将ListView的这个交互设计改变成“一片荡漾的光晕”。

在众多的交互设计方案中,其中一种交互设计是这样的:当ListView拉到顶部或者底部时候,ListView会像橡皮筋一样,ListView呈现阻尼效果,当用户释放ListView后,ListView自动的像橡皮筋一样弹性的回弹到顶部/底部复位。

Android上实现上述这种交互效果,重写ListView的方法overScrollBy()可以实现。

现给出一个示例,一步一步实现。

首先,我需要写一个ZhangPhilListView继承自Android的ListView:

package zhangphil.listview;

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.widget.ListView;

public class ZhangPhilListView extends ListView {

	// 这个值控制可以把ListView拉出偏离顶部或底部的距离。
	private static final int MAX_OVERSCROLL_Y = 200;

	private Context mContext;
	private int newMaxOverScrollY;

	public ZhangPhilListView(Context context) {
		super(context);
		this.mContext = context;
		init();
	}

	public ZhangPhilListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.mContext = context;
		init();
	}

	/*
	 * public ZhangPhilListView(Context context, AttributeSet attrs, int
	 * defStyle) { super(context, attrs, defStyle); this.mContext = context;
	 * init(); }
	 */

	private void init() {
		DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
		float density = metrics.density;
		newMaxOverScrollY = (int) (density * MAX_OVERSCROLL_Y);
	}

	// 最关键的地方。
	//支持到SDK8需要增加@SuppressLint("NewApi")。
	@SuppressLint("NewApi")
	@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, newMaxOverScrollY,
				isTouchEvent);
	}
}

然后在我的布局文件activity_main.xml中直接像使用Android的ListView一样使用它:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <zhangphil.listview.ZhangPhilListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

测试:

package zhangphil.listview;

import android.support.v7.app.ActionBarActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.os.Bundle;

public class MainActivity extends ActionBarActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		ListView lv = (ListView) findViewById(R.id.listView);

		// 测试数据集。
		String[] data = new String[50];
		for (int i = 0; i < data.length; i++) {
			data[i] = i + "";
		}

		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_list_item_1, android.R.id.text1, data);
		lv.setAdapter(adapter);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 04:05:55

Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位的相关文章

Android下拉刷新底部操作栏的隐藏问题

最近自己编写下拉刷新的时候,发现了一个问题,就是有一个需求是这样的:要求页面中是一个Tab切换界面,一个界面有底部操作栏,不可下拉刷新,另一个界面没有底部操作栏,但可以下拉刷新. 按照平常的做法,我在xml文件中使用了RelativeLayout,声明下拉刷新组件的layout_above为底部操作栏,然后在测试的时候发现一个奇怪的现象:如果一开始设置底部操作栏可见,在另一个运行下拉刷新的界面在下拉的时候就会出现和底部操作栏同样位置,同样大小,但颜色采用系统默认的布局,如果设置为不可见,则不会出

Android View滚动、拉伸到顶/底部弹性回弹复位

 <Android View滚动.拉伸到顶/底部弹性回弹复位> 我在上一篇文章介绍了如何实现一个Android ListView拉到顶/底部后,像橡皮筋一样弹性回弹复位(<Android ListView拉到顶/底部,像橡皮筋一样弹性回弹复位>,文章链接地址: http://blog.csdn.net/zhangphil/article/details/47311155 ).事实上,Android凡是由ScrollView包裹的控件,均可实现滚动到顶/底部,弹性回弹复位的交互设

Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类

Android公共库--图片缓存 网络缓存 下拉及底部更多ListView 公共类 转载自http://www.trinea.cn/android/android-common-lib/ 介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存.网络缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工具类(网络.下载.shell.文件.json等等). TrineaAndroidCommon已开源,地

【Java/Android性能优 7】Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类

本文转自:http://www.trinea.cn/android/android-common-lib/ 介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存.网络缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工具类(网络.下载.shell.文件.json等等). TrineaAndroidCommon已开源,地址为[email protected],欢迎Star或Fork^_* 示例APK

Android上拉加载更多ListView——PulmListView

思路 今天带大家实现一个上拉加载更多的ListView.GitHub传送门:PulmListView, 欢迎大家fork&&star. 先带大家理一下思路, 如果我们要实现一个上拉加载更多的ListView, 我们需要实现的功能包括: 一个自定义的ListView, 并且该ListView能够判断当前是否已经处于最底部. 一个自定义的FooterView, 用于在ListView加载更多的过程中进行UI展示. 关联FooterView和ListView, 包括加载时机判断.FooterVi

Android下拉刷新库,利用viewdraghelper实现,集成了下拉刷新,底部加载更多,数据初始加载显示loading等功能

项目Github地址:https://github.com/sddyljsx/pulltorefresh Android下拉刷新库,利用viewdraghelper实现. 集成了下拉刷新,底部加载更多,以及刚进入加载数据的loadview.包括了listview与gridview的改写. 效果1: 效果2: 效果3: 效果4: 效果5: 使用说明: imageList=(ListView)findViewById(R.id.image_list); imageAdapter=new ImageA

Android ListView下拉/上拉刷新:设计原理与实现

 <Android ListView下拉/上拉刷新:设计原理与实现> Android上ListView的第三方开源的下拉刷新框架很多,应用场景很多很普遍,几乎成为现在APP的通用设计典范,甚至谷歌官方都索性在Android SDK层面支持下拉刷新,我之前写了一篇文章<Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新>专门介绍过(链接地址:http://blog.csdn.net/zhangphil/article/details/4696537

Android listview下拉刷新 上拉加载

转载自:http://blog.csdn.net/bboyfeiyu Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能 http://blog.csdn.net/guolin_blog/article/details/9255575 打造通用的Android下拉刷新组件(适用于ListView.GridView等各类View)  http://blog.csdn.net/bboyfeiyu/article/details/39718861 Android打造(ListView.Gr

Android 下拉刷新上拉加载 多种应用场景 超级大放送(上)

转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉加载,网上的Demo太多太多了,这里不是介绍怎么去实现下拉刷新上拉加载,而是针对下拉刷新上拉加载常用的一些应用场景就行了一些总结,包含了下拉刷新上拉加载过程中遇到的一些手势冲突问题的解决方法(只能算是抛砖引玉). 去年9月的时候,那时自己正在独立做Android项目.记得刚刚写完那个ListView列表页面(木有下拉刷新,上拉加载)