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

(0)

相关推荐

  • Android使用Handler实现View弹性滑动

    弹性滑动原理 将一次大的滑动非为若干次小的滑动,并在一个时间段内完成.更好的用户体验 实现方式很多种,包括用Scroller,动画,延时策略. 使用Handler实现弹性滑动 效果可以看到按钮Button向滑动.注意这里是将View的内容改变. 你可以试一试将Button外层的RelitiveLayout去掉,把id放在Button下.发现是Button的文字滑动 <RelativeLayout xmlns:android="http://schemas.android.com/apk/r

  • Android自定义View实现弹性小球效果

    照例先看效果图 自定义代码示例 public class BezierView extends View { Paint paint;//画笔 Path path;//路径 int radius = 50;//圆的半径 int time = 100;//计数时长 int index; int offsetIndex; float viewX, viewY;//图形中心点坐标 float width;//屏幕宽度 float partWidth;//屏幕宽度的1/4 int paddingLeft

  • Android 自定义弹性ListView控件实例代码(三种方法)

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

  • Android SpringAnimation弹性动画解析

    也许你想在Android上实现这种反弹的动画效果.Android Support Library 25.3.0引入了Dynamic-animation增强动画,里面提供了几个类用于使动画呈现实现真实的物理效果. 你会想,自己的动画里加上 BounceInterpolator或OvershootInterpolator 插值器也能达到这种效果,然而实际上达不到.当然你也可以自己写插值器,如果你不嫌麻烦的话. SpringAnimation弹性动画实现方法 gradle引入,最低支持API16 de

  • Android ListView弹性效果的实现方法

    关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListView弹性效果的方法(基本上拿来就可以用),供大家参考: 第一种比较简单,好容易理解,只是动态改变了ListView在Y轴上的可移动距离,代码如下: import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; impor

  • Android ListView之setEmptyView正确使用方法

    Android ListView之setEmptyView正确使用方法 我们知道ListView组件提供了一个空数据是的视图设置方法setEmptyView,该方法存在一个诟病,就是空视图和listview组件要在一个Parent中,这个就不在此细说,下面说另一个问题,原因其实和前面那个问题同出一辙. 假如emptyView和listview在布局中,已经属于同一个parent,设置EmptyView的代码如下 private void setEmptyView(){ emptyTv.setTe

  • Android卫星菜单效果的实现方法

    Android小白第一次写博客,心情无比激动.下面给大家展示一下卫星菜单的实现. 1.简单介绍卫星菜单 在应用程序中,有很多展示菜单的方式,但其功能都是大同小异,这样一来,菜单的美观以及展示方式就显的尤为重要,卫星菜单就是很不错的一种.下面是本案例的gif图: 2.学习本案例需要的知识点 (1)动画 (2)自定义ViewGroup (3)自定义属性 a.attr.xml b.在布局中使用自定义属性 c.在代码中获取自定义属性值 3.首先分析我们的卫星菜单需要那些自定义属性并书写代码 首先,菜单可

  • Android listview的滑动冲突解决方法

    Android listview的滑动冲突解决方法 在Android开发的过程中,有时候会遇到子控件和父控件都要滑动的情况,尤其是当子控件为listview的时候.就比如在一个ScrollView里有一个listview,这种情况较常见,就会出现这种滑动冲突的情况.这种情况也比较常见,有时候就是这样,没法,但是,了解事件分发的我们知道应该怎么处理这样的事情 有两点需要注意: 一般来说,view的onTouchEvent返回true,即消耗点击事件,viewgroup的onInterceptTou

  • Android ListView异步加载图片方法详解

    本文实例讲述了Android ListView异步加载图片方法.分享给大家供大家参考,具体如下: 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,可能是在listview快速滑动屏幕的时候划过的item太多 而且每次调用getView方法后就会异步的在过去某个时间内用han

  • Android ListView列表视图的使用方法

    前言 当你要将某个从数据库或者文件中获得相当大的数据,在界面中向用户展示的时候,由于定义一个个视图比较麻烦,Android中提供了类似于数组的控件–ListView. 使用方法: 假设我们要转的数据是一个Person对象数组 package cn.zhuangzhihuang.mylist; public class Person { private String name; private String tel; public Person(String name, String tel) {

  • Android编程记录ListView标记行状态的方法

    本文实例讲述了Android编程记录ListView标记行状态的方法.分享给大家供大家参考,具体如下: 小Demo无什么特别之处,最特别的就是尽量少用notifyDataSetChanged,开销太大了,当然使用是会省不少工的,不过有时候还是会遇到别的问题的,项目经验表示会有这个可能性的,废话不多少了,直接上关键代码. @Override public void onItemClick(AdapterView<?> adapterView, View view, int pos, long a

  • Android ListView自动显示隐藏布局的实现方法

    借助View的OnTouchListener接口来监听listView的滑动,通过比较与上次坐标的大小,判断滑动方向,并通过滑动方向来判断是否需显示或者隐藏对应的布局,并且带有动画效果. 1.自动显示隐藏Toolbar 首先给listView增加一个HeaderView,避免第一个Item被Toolbar遮挡. View header=new View(this); header.setLayoutParams(new AbsListView.LayoutParams( AbsListView.

  • Android 为ListView添加分段标头的方法

    效果图: 我记得github上有一个类似的效果github类似效果 说一下实现这个效果的思路:在列表项中嵌入分段标头,然后根据需要显示或者隐藏分段标头,创建一个特殊的TextView,让其叠加在列表的顶部,当列表滚动到一个新的分段时,就更新其内容 创建列表布局 创建一个xml,随列表滚动的分段标头和列表顶部的固定分段标头复用这个布局文件 header.xml <?xml version="1.0" encoding="utf-8"?> <TextV

随机推荐