package pingan.myscrollerview.view; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.BounceInterpolator; import android.widget.LinearLayout; import android.widget.Scroller; /** * Created by huangjian299 on 16/2/3. */ public class CustomerScrollerView extends LinearLayout { private Context mContext; private int mScreenHeight; //屏幕的高度 private int mScreenWidth; private Scroller mScroller; public CustomerScrollerView(Context context) { super(context); } public CustomerScrollerView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; init(); } public CustomerScrollerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mContext = context; init(); } private void init(){ WindowManager wm = (WindowManager) mContext .getSystemService(Context.WINDOW_SERVICE); mScreenWidth = wm.getDefaultDisplay().getWidth(); mScreenHeight= wm.getDefaultDisplay().getHeight(); mScroller = new Scroller(mContext,new AccelerateDecelerateInterpolator()); //mScroller = new Scroller(mContext,new BounceInterpolator()); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int count = getChildCount(); for(int i = 0;i < count ; i++ ){ View childView = getChildAt(i); measureChild(childView,widthMeasureSpec,heightMeasureSpec); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); int childCount = getChildCount(); MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams(); mlp.height = mScreenHeight * childCount; setLayoutParams(mlp); for(int i = 0 ;i < childCount ;i++){ View child = getChildAt(i); if(child.getVisibility() != View.GONE){ child.layout(l,i*mScreenHeight,r,(i+1)*mScreenHeight); } } } private int mStart; private int mEnd; private int mLastY; @Override public boolean onTouchEvent(MotionEvent event) { int y = (int) event.getY(); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: mStart = getScrollY(); mLastY = y; break; case MotionEvent.ACTION_MOVE: if(!mScroller.isFinished()){ mScroller.abortAnimation(); } int dy = mLastY - y; if(getScrollY() < 0){ dy = 0; } if(getScrollY() > getHeight() - mScreenHeight){ dy = 0; } scrollBy(0,dy); mLastY = y; break; case MotionEvent.ACTION_UP: mEnd = getScrollY(); int dScrollY = mEnd - mStart; if(dScrollY > 0){ if(dScrollY < mScreenHeight / 3){ mScroller.startScroll(0,getScrollY(),0,-dScrollY); }else{ mScroller.startScroll(0,getScrollY(),0,mScreenHeight-dScrollY); } }else{ if(-dScrollY < mScreenHeight / 3){ mScroller.startScroll(0,getScrollY(),0,-dScrollY); }else{ mScroller.startScroll(0,getScrollY(),0,-mScreenHeight-dScrollY); } } break; } postInvalidate(); return true; } @Override public void computeScroll() { super.computeScroll(); if(mScroller.computeScrollOffset()){ scrollTo(0,mScroller.getCurrY()); postInvalidate(); } } }
scroller 移动的只是view 的内容: scrollerTo /scrollerBy