设为首页收藏本站

SKY外语、计算机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3789|回复: 0
打印 上一主题 下一主题

[代码分享] 自定义ListView下拉弹起效果

[复制链接]

29

主题

0

好友

92

积分

注册会员

Rank: 2

性别
保密
跳转到指定楼层
楼主
发表于 2013-6-11 21:53:38 |只看该作者 |倒序浏览
本帖最后由 sky_yx 于 2015-12-30 14:07 编辑

    在实现ListView下拉弹起效果,最重要的是如何监听到ListView的底部及顶部,AbstractListViewtrackMotionScroll(int,int)方法中,分析出ListView是如何判断滑动到底部及顶部的方法。
private boolean isHeader(int deltay) {
  int firstTop = getChildAt(0).getTop();
  int effectivePaddingTop = getListPaddingTop();
  int spaceAbove = effectivePaddingTop - firstTop;
  return getFirstVisiblePosition() == 0&&spaceAbove<=0&&deltay<0;
}

private boolean isButtom(int deltay) {
   int lastBottom = getChildAt(getChildCount() - 1).getBottom();
   int effectivePaddingBottom = getListPaddingBottom();
   return getLastVisiblePosition() == (getCount() - 1)&&lastBottom<=(getHeight()-effectivePaddingBottom)&&deltay>0;
}
通过以上两个方法可以判断ListView是否滑动到底部及顶部。
但是为了实现弹起效果,必须用到scrollBy()和scrollTo()两个方法。具体实现代码如下:
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView;
import android.widget.Scroller;

public class MyListView extends ListView {
private Context mContext;
private Scroller mScroller;
private int mLastMotionY = 0;

public MyListView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  // TODO Auto-generated constructor stub
}

public MyListView(Context context, AttributeSet attrs) {
  super(context, attrs);
  this.mContext = context;
  mScroller = new Scroller(mContext);
}

public MyListView(Context context) {
  super(context);
  // TODO Auto-generated constructor stub
}

@Override
public void computeScroll() {
   scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
   postInvalidate();
  }
}

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
  // TODO Auto-generated method stub
  int y = (int) event.getY();
  switch (event.getAction()) {
  case MotionEvent.ACTION_DOWN:
   if (mScroller != null) {
    if (!mScroller.isFinished()) {
     mScroller.abortAnimation();
    }
   }
   mLastMotionY = y;
   break;
  case MotionEvent.ACTION_MOVE:
   int deltay = (int) (mLastMotionY - y);
   mLastMotionY = y;
   if (isButtom(deltay)) {
    setVerticalScrollBarEnabled(false);
    scrollBy(0, deltay);
    return true;
   }
   if (isHeader(deltay)) {
    setVerticalScrollBarEnabled(false);
    scrollBy(0, deltay);
    return true;
   }
   break;
  case MotionEvent.ACTION_UP:
   mLastMotionY = 0;
   if (getScrollY()!=0) {
    mScroller.startScroll(0, getScrollY(), 0, -getScrollY(), 1000);
    invalidate();
    return true;
   }
   break;
  default:
   break;
  }
  return super.dispatchTouchEvent(event);
}

private boolean isHeader(int deltay) {
  int firstTop = getChildAt(0).getTop();
  int effectivePaddingTop = getListPaddingTop();
  int spaceAbove = effectivePaddingTop - firstTop;
  return getFirstVisiblePosition() == 0&&spaceAbove<=0&&deltay<0;
}

private boolean isButtom(int deltay) {
   int lastBottom = getChildAt(getChildCount() - 1).getBottom();
   int effectivePaddingBottom = getListPaddingBottom();
   return getLastVisiblePosition() == (getCount() - 1)&&lastBottom<=(getHeight()-effectivePaddingBottom)&&deltay>0;
}
Handler handler = new Handler(){
  public void handleMessage(android.os.Message msg) {
   int what = msg.what;
   switch (what) {
   case 0:
    setVerticalScrollBarEnabled(true);
    invalidate();
    break;
   default:
    break;
   }
  };
};
}


分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享淘帖0 收藏收藏0 评分评分
您需要登录后才可以回帖 登录 | 立即注册


手机版|SKY外语计算机学习 ( 粤ICP备12031577 )    

GMT+8, 2024-4-30 10:25 , Processed in 0.111673 second(s), 26 queries .

回顶部