android自定义滚动上下回弹scollView

android自定义滚动上下回弹scollView

本文实例为大家分享了android自定义滚动上下回弹scollView的具体代码,供大家参考,具体内容如下

这是一个自定义view,在xml布局中用这个view嵌套要使之可以上下回弹的view

就能实现布局可以滚动上下回弹了,自定义view代码如下:

package com.loopfire.meitaotao.view.scrollView; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.TranslateAnimation; import android.widget.ScrollView; /**  * 上下回弹 scollView  *   * @author Administrator  *   */ public class MyScrollView extends ScrollView {     private View inner;     private float y;     private Rect normal = new Rect();     private boolean animationFinish = true;     public MyScrollView(Context context) {         super(context);     }     public MyScrollView(Context context, AttributeSet attrs) {         super(context, attrs);     }     @Override     protected void onFinishInflate() {         if (getChildCount() > 0) {             inner = getChildAt(0);         }     }     @Override     public boolean onInterceptTouchEvent(MotionEvent ev) {         return super.onInterceptTouchEvent(ev);     }     @Override     public boolean onTouchEvent(MotionEvent ev) {         if (inner == null) {             return super.onTouchEvent(ev);         } else {             commOnTouchEvent(ev);         }         return super.onTouchEvent(ev);     }     private void commOnTouchEvent(MotionEvent ev) {         if (animationFinish) {             int action = ev.getAction();             switch (action) {             case MotionEvent.ACTION_DOWN:                 // System.out.println("ACTION_DOWN");                 y = ev.getY();                 super.onTouchEvent(ev);                 break;             case MotionEvent.ACTION_UP:                 // System.out.println("ACTION_UP");                 y = 0;                 if (isNeedAnimation()) {                     animation();                 }                 super.onTouchEvent(ev);                 break;             case MotionEvent.ACTION_MOVE:                 // System.out.println("ACTION_MOVE");                 final float preY = y == 0 ? ev.getY() : y;                 float nowY = ev.getY();                 int deltaY = (int) (preY - nowY);                 // 滚动                 // scrollBy(0, deltaY);                 y = nowY;                 // 当滚动到最上或者最下时就不会再滚动,这时移动布局                 if (isNeedMove()) {                     if (normal.isEmpty()) {                         // 保存正常的布局位置                         normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom());                     }                     // 移动布局                     inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2, inner.getRight(), inner.getBottom() - deltaY / 2);                 } else {                     super.onTouchEvent(ev);                 }                 break;             default:                 break;             }         }     }     // 开启动画移动     private void animation() {         // 开启移动动画         TranslateAnimation ta = new TranslateAnimation(0, 0, 0, normal.top - inner.getTop());         ta.setDuration(200);         ta.setAnimationListener(new AnimationListener() {             @Override             public void onAnimationStart(Animation animation) {                 animationFinish = false;             }             @Override             public void onAnimationRepeat(Animation animation) {             }             @Override             public void onAnimationEnd(Animation animation) {                 inner.clearAnimation();                 // 设置回到正常的布局位置                 inner.layout(normal.left, normal.top, normal.right, normal.bottom);                 normal.setEmpty();                 animationFinish = true;             }         });         inner.startAnimation(ta);     }     // 是否需要开启动画     private boolean isNeedAnimation() {         return !normal.isEmpty();     }     // 是否需要移动布局     private boolean isNeedMove() {         int offset = inner.getMeasuredHeight() - getHeight();         int scrollY = getScrollY();         if (scrollY == 0 || scrollY == offset) {             return true;         }         return false;     } }

在xml中使用如下:

<com.loopfire.meitaotao.view.scrollView.MyScrollView>           <TextView               style="@style/form_left_text_style"               android:layout_width="wrap_content"               android:layout_height="wrap_content"               android:layout_marginLeft="@dimen/text_margin_left2"               android:text="@string/about" /> </com.loopfire.meitaotao.view.scrollView.MyScrollView>

那么包含的这个textview可以上下滚动并且回弹了

推荐阅读