回弹ScrollView
来源:互联网 发布:金方圆v300编程 编辑:程序博客网 时间:2024/05/01 13:11
import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import android.animation.ObjectAnimator;import android.animation.ValueAnimator;import android.animation.ValueAnimator.AnimatorUpdateListener;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.util.AttributeSet;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.ViewConfiguration;import android.view.animation.AccelerateDecelerateInterpolator;import android.view.animation.Interpolator;import android.widget.ScrollView;import android.widget.Scroller;public class OverScrollView extends ScrollView{ private Context context; public OverScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context=context; // TODO Auto-generated constructor stub } public OverScrollView(Context context, AttributeSet attrs ) { super(context, attrs ); this.context=context; // TODO Auto-generated constructor stub } public OverScrollView(Context context ) { super(context ); this.context=context; // TODO Auto-generated constructor stub } private OnOverScrollListener listener; public void setOnOverScrollListener(OnOverScrollListener listener) { this.listener=listener; } public interface OnOverScrollListener { void overScrollDown(float dis); void overScrollUp(float dis); void onScrollResumeFromBottomToTop(float maxDis,float dis); void onScrollResumeFromTopToBottom(float maxDis,float dis); void onScrollResumeFinished( ); } private float pressY; private float downDis; private float upDis; private float pressX; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub if (ev.getAction()==MotionEvent.ACTION_DOWN) { pressY=ev.getRawY(); pressX=ev.getRawX();// System.out.println("onInterceptTouchEvent down "+pressY); } if (ev.getAction()==MotionEvent.ACTION_MOVE) { float nowX=ev.getRawX(); float nowY=ev.getRawY(); float disX=Math.abs(nowX-pressX); float disY=Math.abs(nowY-pressY); if (disY>=ViewConfiguration.get(context).getScaledTouchSlop()&&disY>disX) { return true; } } return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(final MotionEvent ev) { // TODO Auto-generated method stub switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: pressY=ev.getRawY();// System.out.println("down "+pressY); break; case MotionEvent.ACTION_MOVE: int sy=getScrollY();// System.out.println("move getRawY: " +ev.getRawY()+ " getScrollY: "+sy +" getChildAt(0).getHeight():"+getChildAt(0).getHeight()+" getHigh():"+getHeight()); if (sy==0&&ev.getRawY()>pressY) {// isDown=true; downDis=(float) ((ev.getRawY()-pressY)/3); getChildAt(0).setTranslationY(downDis); if (listener!=null) { listener.overScrollDown(downDis); } return true; }// if (isDown) {// // setTranslationY(ev.getRawY()-pressY);// // return true;// } if (sy+getHeight()==getChildAt(0).getHeight()&&ev.getRawY()<pressY) {// isUp=true; upDis=(float) ((ev.getRawY()-pressY)/3); getChildAt(0).setTranslationY(upDis); if (listener!=null) { listener.overScrollUp(upDis); } return true; } if (getHeight()>=getChildAt(0).getHeight()&&ev.getRawY()<pressY) { upDis=(float) ((ev.getRawY()-pressY)/3); getChildAt(0).setTranslationY(upDis); if (listener!=null) { listener.overScrollUp(upDis); } return true; }// if (isUp) {// setTranslationY(ev.getRawY()-pressY);// return true;// // } pressY=ev.getRawY(); try { return super.onTouchEvent(ev); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: final float start=getChildAt(0).getTranslationY(); ObjectAnimator animator=ObjectAnimator.ofFloat(getChildAt(0), "translationY", start,0); animator.setDuration(500); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { // TODO Auto-generated method stub if (listener!=null) { if (ev.getRawY()>pressY) { listener.onScrollResumeFromBottomToTop(start,(Float)animation.getAnimatedValue()); }else listener.onScrollResumeFromTopToBottom(start,(Float)animation.getAnimatedValue()); } } }); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { // TODO Auto-generated method stub super.onAnimationEnd(animation); if (listener!=null) { listener.onScrollResumeFinished(); } } }); animator.start(); break; } return true; } }
0 0
- 回弹ScrollView
- ScrollView拖动回弹效果
- ScrollView 回弹特效
- NGUI ScrollView 回弹控制
- android 可回弹ScrollView
- 自定义scrollview 回弹效果
- ScrollView回弹效果
- NGUI Scrollview 回弹控制
- Android仿IOS回弹效果 ScrollView回弹
- 自定义ScrollView加回弹效果
- ScrollView实现阻尼回弹效果!
- 仿ios回弹效果scrollview
- 自定义scrollview实现下拉回弹
- Scrollview回弹效果自定义控件
- Android仿IOS回弹效果 ScrollView回弹 总结
- Android仿IOS回弹效果 ScrollView回弹 总结
- Android仿IOS回弹效果 ScrollView回弹 总结
- [android] ScrollView 滑动后回弹 的实现(
- Windows 常用命令(快捷启动Windows服务的命令)
- Linux C 学习笔记01-基本数据类型
- 二叉查找树构建
- 草泥马的Shell if 条件判断 如果 == 左右没有空格,不会报错并且按照True来执行。草泥马的
- VirtualBox遇到错误:创建 COM 对象失败. 应用程序将被中断. 被召者 RC:REGDB_E_CLASSNOTREG (0x80040154)
- 回弹ScrollView
- cocos编译安卓apk一晚上经验
- poj 3746——Teacher YYF
- matlab小知识点(一)转换字符等
- java中的forname
- [codeforces534E]Listening to Music && 可持久化线段树
- 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点
- MFC List Control快速更新时闪烁问题的解决办法
- Unity3d 使用 BMFONT 制作的艺术字体 不能居中 解决方法