mScroller.startScroll(0,getScrollY(),0,-dScrollY);
在ViewGroup或者View中使用mScroller.startScroll方法的时候,他们的内容没有移动,还需要重写computeScroll方法,在方法里面调用View或GroupView自身的
scrollTo或scrollBy方法才能移动view,要记得刷新View
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Scroller;
public class MyScrollView extends ViewGroup {
private int mScrenHeight;
private Context context;
private int mLastY;
private int mStart;
private int mEnd;
private Scroller mScroller;
public MyScrollView(Context context) {
super(context);
initView();
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView(){
context = getContext();
DisplayMetrics dm = context.getResources().getDisplayMetrics();
mScrenHeight = dm.heightPixels;
Log.i(getClass().getName(),"mScrenHeight=="+mScrenHeight);
mScroller = new Scroller(context);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int count =getChildCount();
MarginLayoutParams layoutParams = (MarginLayoutParams) getLayoutParams();
layoutParams.height = mScrenHeight * count;
setLayoutParams(layoutParams);
Log.i(getClass().getName(),"count=="+count);
for (int i =0 ; i < count ;i++){
View view = getChildAt(i);
if(view.getVisibility() !=View.GONE){
view.layout(l,i*mScrenHeight,r,(i+1)*mScrenHeight);
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int count = this.getChildCount();
for (int i =0 ; i > count ;i++){
View view = getChildAt(i);
measureChild(view,widthMeasureSpec,heightMeasureSpec);
}
//setMeasuredDimension(widthMeasureSpec,mScrenHeight * getChildCount());
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
int y = (int) event.getY();
switch (action){
case MotionEvent.ACTION_DOWN:
mLastY = y;
mStart = getScrollY();
break;
case MotionEvent.ACTION_MOVE:
if(!mScroller.isFinished()){
mScroller.abortAnimation();
Log.i(getClass().getName(),"xxxxxxxxxxxxxx");
}
int dy = mLastY -y;
if(getScrollY() < 0){
dy = 0;
}
if(getScrollY() > getHeight() -mScrenHeight){
dy =0;
}
Log.i(getClass().getName(),"getScrollY111111=="+getScrollY());
Log.i(getClass().getName(),"dy=="+dy);
scrollBy(0,dy);
Log.i(getClass().getName(),"getScrollY222222=="+getScrollY());
//这里重新赋值才会让view跟着手指移动,
mLastY = y;
break;
case MotionEvent.ACTION_UP:
mEnd = getScrollY();
Log.i(getClass().getName(),"up1111111=="+mEnd);
int dScrollY =mEnd-mStart;
//dScrollY为正 手指往上滑动,为负往下滑动
if(dScrollY > 0){
if(dScrollY < mScrenHeight/3){
mScroller.startScroll(0,getScrollY(),0,-dScrollY);
//scrollBy(0,-dScrollY);
}else{
mScroller.startScroll(0,getScrollY(),0,mScrenHeight-dScrollY);
// scrollBy(0,mScrenHeight-dScrollY);
}
Log.i(getClass().getName(),"up2222222=="+getScrollY());
}else{
if(-dScrollY < mScrenHeight/3){
mScroller.startScroll(0,getScrollY(),0,-dScrollY);
//scrollBy(0,-dScrollY);
}else{
mScroller.startScroll(0,getScrollY(),0,-mScrenHeight-dScrollY);
//scrollBy(0,-mScrenHeight-dScrollY);
}
Log.i(getClass().getName(),"up33333=="+getScrollY());
}
break;
}
postInvalidate();
return true;
}
@Override
public void computeScroll() {
super.computeScroll();
//mScroller.computeScrollOffset() //返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。
if(mScroller.computeScrollOffset()){
Log.i(getClass().getName(),"getCurrY=="+mScroller.getCurrY());
if(mScroller.getCurrY() < 0 ){
scrollTo(0,0);
}else if(mScroller.getCurrY() <= getHeight() -mScrenHeight){
scrollTo(0,mScroller.getCurrY());
}else{
scrollTo(0,getHeight() -mScrenHeight);
}
postInvalidate();
}
}
}
关于 Scroller的
最新推荐文章于 2019-02-20 20:00:00 发布