有弹性的ListView
2016-01-31 12:18
281 查看
有弹性的ListView
package com.weichuang.china.video.view; 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; public class MyListView extends ListView { private Context context; private boolean outBound = false; private int distance; private int firstOut; public MyListView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; } public MyListView(Context context) { super(context); this.context = context; } GestureDetector gestureDetector = new GestureDetector( new OnGestureListener() { public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } 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; } if (lastPos != (itemCount - 1)) return false; View lastView = getChildAt(lastPos - firstPos); int GridHeight = getHeight(); if (lastView != null && (outBound || ((lastView.getBottom() + 8) >= GridHeight && distanceY > 0))) { distance = firstOut - (int) e2.getRawY(); scrollTo(0, distance); return true; } return false; } public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub return false; } public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } }); @Override public boolean dispatchTouchEvent(MotionEvent event) { int act = event.getAction(); if ((act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_CANCEL) && outBound) { outBound = false; } if (!gestureDetector.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); } }
相关文章推荐
- 处理键盘升起后对界面覆盖问题的处理
- 基于OpenWrt防火墙配置(作为二级路由)
- 嵌入式系统开发步骤
- JS小Demo实战之今天外卖点什么?(一)
- 对CAN signal 的一点理解
- Handler,Looper,HandlerThread浅析
- Spring的声明式事务管理
- Spring的声明式事务管理
- Spring的声明式事务管理
- Linux下修改Mysql的用户(root)的密码
- 1月22日--1月31日(剩3195小时)
- PHP获得真实客户端的真实IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
- CURL函数简单介绍,CURL简单用法,初识CURL
- 从无到有写一个运维APP(二)
- 算法_1: 数论
- python求线性回归斜率
- 软件工程的引入:Scrum开发框架总结
- iOS 安全攻防系列(四):分析二进制软件
- Dynamics CRM 2015/2016 Web API:新的数据查询方式
- zyltdlhr