当前位置: 首页 > 编程笔记 >

Android ListView弹性效果的实现方法

郎宏逸
2023-03-14
本文向大家介绍Android ListView弹性效果的实现方法,包括了Android ListView弹性效果的实现方法的使用技巧和注意事项,需要的朋友参考一下

关于在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弹性效果的实现方法,整理出来,希望对大家有所帮助!

 类似资料:
  • 本文向大家介绍JS实现弹性菜单效果代码,包括了JS实现弹性菜单效果代码的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS实现弹性菜单效果代码。分享给大家供大家参考。具体如下: 这是一款JavaScript+CSS实现弹性菜单——纯属自己写着练习,无使用第三方的类库,我觉得是值得学习前端设计的朋友参考的,有兴趣的朋友可以把弹性的菜单背景换成一个漂亮的图片,这样更漂亮了。 运行效果截图如下:

  • 本文向大家介绍jQuery实现弹幕效果,包括了jQuery实现弹幕效果的使用技巧和注意事项,需要的朋友参考一下 效果如下: 代码如下: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 本文向大家介绍Android使用Scroller实现弹性滑动效果,包括了Android使用Scroller实现弹性滑动效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android使用Scroller实现弹性滑动展示的具体代码,供大家参考,具体内容如下 scrollTo、scrollBy View内部为了实现滑动提供了这两个方法,但是使用这两个方法滑动的效果是瞬间的不够平滑,如何

  • 本文向大家介绍java Swing实现弹窗效果,包括了java Swing实现弹窗效果的使用技巧和注意事项,需要的朋友参考一下 使用Swing实现的一个简单弹窗功能,基本容器的使用办法,代码如下: 执行结果如下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍jquery实现隐藏在左侧的弹性弹出菜单效果,包括了jquery实现隐藏在左侧的弹性弹出菜单效果的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jquery实现隐藏在左侧的弹性弹出菜单效果。分享给大家供大家参考。具体如下: 这是一款隐藏在左侧的弹性弹出菜单,从淘宝扣下来的,也可作为JavaScript缓冲动画的典型教程。本弹性菜单可扩展性强,实际上不光可以做成菜单,也可布局一

  • 本文向大家介绍jQuery实现背景弹性滚动的导航效果,包括了jQuery实现背景弹性滚动的导航效果的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery实现背景弹性滚动的导航效果。分享给大家供大家参考,具体如下: PS:这里再为大家推荐几款代码格式化、美化工具,相信大家在以后的开发过程中会用得到: 在线JavaScript代码美化、格式化工具: http://tools.jb51.n