关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListView弹性效果的方法(基本上拿来就可以用),供大家参考:

弹性ListView

第一种方法:

import android.content.Context;

import android.content.res.Configuration;

import android.util.AttributeSet;

import android.util.DisplayMetrics;

import android.view.View;

import android.view.ViewConfiguration;

import android.widget.ListView;

import java.lang.reflect.Field;

import java.lang.reflect.Modifier;

/**

* Created by Noah on 2016/1/16.

*/

public class BounceListView extends ListView {

private static final float MAX_Y_OVERSCROLL_DISTANCE = 200;

private float mMaxYOverscrollDistance;

public BounceListView(Context context) {

this(context, null);

}

public BounceListView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public BounceListView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

initBounceListView();

}

private void initBounceListView(){

final DisplayMetrics metrics = getContext().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, (int)mMaxYOverscrollDistance, isTouchEvent);

}

/**

* 设置本App所有的ListView弹性粒度

* @param ctx

* @param size

* @return

*/

public boolean configGlobalMaxOverScrollDistance(Context ctx,int size)

{

try {

final DisplayMetrics metrics = ctx.getResources().getDisplayMetrics();

final float density = metrics.density;

int value = (int) (density * size);

mMaxYOverscrollDistance = value;

ViewConfiguration config = ViewConfiguration.get(ctx);

Field mOverscrollDistance = ViewConfiguration.class.getDeclaredField("mOverscrollDistance");

if(!mOverscrollDistance.isAccessible() || !Modifier.isPublic(mOverscrollDistance.getModifiers()))

{

mOverscrollDistance.setAccessible(true);

}

mOverscrollDistance.setInt(config,value);

} catch (Exception e) {

e.printStackTrace();

return false;

}

return true;

}

}

第二种比较简单,好容易理解,只是动态改变了ListView在Y轴上的可移动距离,代码如下:

import android.content.Context;

import android.util.AttributeSet;

import android.util.DisplayMetrics;

import android.widget.ListView;

/**

* 弹性ListView。

* @author E

*/

public class FlexiListView extends ListView{

//初始可拉动Y轴方向距离

private static final int MAX_Y_OVERSCROLL_DISTANCE = 100;

//上下文环境

private Context mContext;

//实际可上下拉动Y轴上的距离

private int mMaxYOverscrollDistance;

public FlexiListView(Context context){

super(context);

mContext = context;

initBounceListView();

}

public FlexiListView(Context context, AttributeSet attrs) {

super(context, attrs);

mContext = context;

initBounceListView();

}

public FlexiListView(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) {

//实现的本质就是在这里动态改变了maxOverScrollY的值

return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxYOverscrollDistance, isTouchEvent);

}

}

第三种方法,结合了手势来实现ListView的弹性效果,这里可以根据手势来进行更多的扩展,代码如下:

import android.content.Context;

import android.graphics.Rect;

import android.util.AttributeSet;

import android.view.GestureDetector;

import android.view.GestureDetector.OnGestureListener;

import android.view.MotionEvent;

import android.view.View;

import android.view.animation.TranslateAnimation;

import android.widget.ListView;

/**

* 具有弹性效果的ListView。主要是实现父类dispatchTouchEvent方法和OnGestureListener中onScroll方法。

* @author E

*/

public class FlexibleListView extends ListView implements OnGestureListener{

private Context context = null;

private boolean outBound = false;

private int distance;

private int firstOut;

public FlexibleListView(Context context, AttributeSet attrs) {

super(context, attrs);

this.context = context;

}

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

super(context, attrs, defStyle);

this.context = context;

}

public FlexibleListView(Context context) {

super(context);

this.context = context;

}

GestureDetector lisGestureDetector = new GestureDetector(context, this);

@Override

public boolean dispatchTouchEvent(MotionEvent event) {

int act = event.getAction();

if ((act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_CANCEL)

&& outBound) {

outBound = false;

// scroll back

}

if (!lisGestureDetector.onTouchEvent(event)) {

outBound = false;

} else {

outBound = true;

}

Rect rect = new Rect();

getLocalVisibleRect(rect);

TranslateAnimation am = new TranslateAnimation( 0, 0, -rect.top, 0);

am.setDuration(300);

startAnimation(am);

scrollTo(0, 0);

return super.dispatchTouchEvent(event);

}

@Override

public boolean onDown(MotionEvent e) {

return false;

}

@Override

public void onShowPress(MotionEvent e) {

}

@Override

public boolean onSingleTapUp(MotionEvent e) {

return false;

}

@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,

float distanceY) {

int firstPos = getFirstVisiblePosition();

int lastPos = getLastVisiblePosition();

int itemCount = getCount();

// outbound Top

if (outBound && firstPos != 0 && lastPos != (itemCount - 1)) {

scrollTo(0, 0);

return false;

}

View firstView = getChildAt(firstPos);

if (!outBound)

firstOut = (int) e2.getRawY();

if (firstView != null&& (outBound || (firstPos == 0

&& firstView.getTop() == 0 && distanceY < 0))) {

// Record the length of each slide

distance = firstOut - (int) e2.getRawY();

scrollTo(0, distance / 2);

return true;

}

// outbound Bottom

return false;

}

@Override

public void onLongPress(MotionEvent e) {

}

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

float velocityY) {

return false;

}

}

以上给大家分享了几种比较常用的方法,脚本之家小编整理出来的,希望对大家有所帮助。

android listview 自定义控件,Android 自定义弹性ListView控件实例代码(三种方法)相关推荐

  1. android获取该控件在屏幕,android获取屏幕宽高与获取控件宽高(三种方法)

    1.获取屏幕宽高 方法1: int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px ...

  2. php支付密码控件,Android高仿微信支付密码输入控件实例代码

    这篇文章主要为大家详细介绍了Android高仿微信支付密码输入控件的具体实现代码,供大家参考,具体内容如下 像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现 ...

  3. wxpython bind自定义_wxpython 支持python语法高亮的自定义文本框控件的代码

    在研发闲暇时间,把开发过程中比较重要的一些代码做个珍藏,下面的代码内容是关于wxpython 支持python语法高亮的自定义文本框控件的代码,应该是对大家也有用. import keyword im ...

  4. android stringbuilder清空,StringBuffer 清空StringBuffer的实例的三种方法

    @Test public void testStringbuffer(){ //StringBuffer类没有clear方法,不过可以通过下面两种方法来清空一个StringBuffer的实例: Str ...

  5. 深入学习SAP UI5框架代码系列之七:控件数据绑定的三种模式 - One Way, Two Way和OneTime实现原理比较

    这是Jerry 2021年的第 8 篇文章,也是汪子熙公众号总共第 279 篇原创文章. 系列目录 (0) SAP UI5应用开发人员了解UI5框架代码的意义 (1) SAP UI5 module懒加 ...

  6. C# 删除chart控件网格:两种方法

    C#winform程序 - 删除chart控件网格:两种方法 看网上说把网格线的颜色换成背景色,感觉不太正宗.... 于是探索了一下,喜欢的同鞋点个赞收藏一下呗! 1.编辑控件属性 (点击图片放大观看 ...

  7. Winform中实现自定义水晶按钮控件(附代码下载)

    场景 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建一个用户 ...

  8. C#自动实现Dll(OCX)控件注册的两种方法

    打印这篇文章 尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写.当需要用到Dll引用的时候 ...

  9. Android图片海报制作-自定义文字排版控件组件

    项目地址:https://github.com/coolstar1204/MakePoster 今天主要讲一下项目主要控件,文字排版控件组,实现类似QQ音乐歌词海报效果. 控件主要功能点 可设置背景图 ...

最新文章

  1. 地铁7号线路图_南京地铁S1号线机场线,都经过哪些地方?如何查询地铁换乘?查询站点信息?...
  2. Vue.js 系列教程 3:Vue-cli,生命周期钩子
  3. Android NDK-helloJNI
  4. uniapp H5页面嵌入微信小程序 ios 下 video组件 播放视频 设置 border-radius overflow:hidden 不生效
  5. 50款大数据分析神器 :你还在用Excel
  6. python 生成器_提高你的Python: 解释‘yield’和‘Generators(生成器)’
  7. 怎么查这个文件在linux下的哪个目录
  8. Handler源码解析2
  9. [USACO] Gold组刷题记录
  10. 如何追求高质量的代码?
  11. LVM逻辑卷磁盘管理
  12. Java常见异常总结
  13. 对比excel 轻松学python电子书_对比Excel,轻松学习Python数据分析
  14. 全国每年的考证时间大全
  15. 【方法论】时间管理矩阵(Time Management Matrix )-给事情排序,列好1234再执行吧!
  16. mysql按年级班级排序_一个sql语句的问题,按照如何按照年纪班级科目显示名次...
  17. 最新表情包小程序+前后端去授权版/最火表情包小程序源码
  18. 为什么必须了解云原生?!
  19. acrobat PDF删除部分_PDF文档压缩神器,Adobe Acrobat,两个步骤轻松实现PDF文档瘦身...
  20. Paper:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding用于语言理解的深度双向Tr

热门文章

  1. vue简单使用高德地图定位
  2. hive map格式转换为字符串_Hive学习之Hive数据类型 | 学步园
  3. 如何修复老照片,修复老照片寻回“青春记忆”
  4. C语言实现:输入一个数字判断其是否为素数
  5. CentOS7搭建Nacos Cluster
  6. phpadmin的安装与使用
  7. linux平台xpt2046驱动,XPT2046触摸屏实验过程详解与STM32代码解析
  8. spring cloud 配置 redis、定义redis工具类
  9. Gabor滤波进行目标图像纹理特征的提取
  10. oracle 字符转正规表达,oracle 字符串转成行