回弹ScrollView
16lz
2021-01-26
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; } }
更多相关文章
- 代码中设置drawableleft
- android 3.0 隐藏 系统标题栏
- Android开发中activity切换动画的实现
- Android(安卓)学习 笔记_05. 文件下载
- Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
- 技术博客汇总
- android 2.3 wifi (一)
- AndRoid Notification的清空和修改
- Android中的Chronometer