Android ListView弹性效果的实现方法

作者:lijiao 时间:2023-08-07 19:06:40 

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

第一种比较简单,好容易理解,只是动态改变了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,弹性
0
投稿

猜你喜欢

  • MyBatisPlus代码生成器的使用示例

    2022-04-28 07:52:42
  • Android Navigation TabBar控件实现多彩标签栏

    2022-06-29 10:00:40
  • Android自定义View多种效果解析

    2022-05-26 06:59:46
  • 使用jdk1.8实现将list根据指定的值去分组的操作

    2022-10-04 18:12:48
  • Android开发学习笔记之通过API接口将LaTex数学函数表达式转化为图片形式

    2023-02-28 06:50:24
  • Spring Aop 如何获取参数名参数值

    2022-09-08 17:00:41
  • java中的各种修饰符作用及范围

    2022-02-10 01:03:54
  • Android实现拍照添加时间水印

    2023-10-02 14:23:51
  • WPF实现动画效果

    2023-06-26 17:49:44
  • C#词法分析器之构造NFA详解

    2022-04-10 02:11:43
  • Java Spring WEB应用实例化如何实现

    2022-05-20 04:26:35
  • Java 实现FTP服务实例详解

    2023-06-18 10:45:25
  • Java编程探索之泛型擦除实例解析

    2022-08-30 02:13:35
  • Android实现倒计时的按钮的示例代码

    2021-10-17 14:45:11
  • java 对称加密算法实现详解

    2021-07-29 22:34:57
  • Spring与Struts整合之让Spring管理控制器操作示例

    2022-08-22 12:53:46
  • C# 扩展方法小结

    2022-12-25 22:43:34
  • Android异步回调中的UI同步性问题分析

    2022-07-31 14:10:51
  • Unity3d 使用Gizmos画一个圆圈

    2022-05-22 05:10:52
  • Java MongoDB数据库连接方法梳理

    2023-11-25 01:01:20
  • asp之家 软件编程 m.aspxhome.com