代码修正
This commit is contained in:
parent
901bc5957c
commit
f934535d05
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,200 @@
|
|||
package com.stone.shop.scroll;
|
||||
|
||||
import android.R.bool;
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.VelocityTracker;
|
||||
import android.view.View;
|
||||
import android.view.ViewConfiguration;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.View.MeasureSpec;
|
||||
import android.widget.Scroller;
|
||||
|
||||
public class MyScrollLayout extends ViewGroup {
|
||||
|
||||
private static final String TAG = "ScrollLayout";
|
||||
private VelocityTracker mVelocityTracker; // 用于判断甩动手势
|
||||
private static final int SNAP_VELOCITY = 600; //X轴速度基值,大于该值时进行切换
|
||||
private Scroller mScroller; // 滑动控制<EFBFBD>?
|
||||
private int mCurScreen; //当前页面为第几屏
|
||||
private int mDefaultScreen = 0;
|
||||
private float mLastMotionX;
|
||||
|
||||
|
||||
private OnViewChangeListener mOnViewChangeListener;
|
||||
|
||||
public MyScrollLayout(Context context) {
|
||||
super(context);
|
||||
// TODO Auto-generated constructor stub
|
||||
init(context);
|
||||
}
|
||||
|
||||
public MyScrollLayout(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
// TODO Auto-generated constructor stub
|
||||
init(context);
|
||||
}
|
||||
|
||||
private void init(Context context) {
|
||||
mCurScreen = mDefaultScreen;
|
||||
mScroller = new Scroller(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
Log.e("a", "a");
|
||||
if (changed) {
|
||||
int childLeft = 0;
|
||||
final int childCount = getChildCount();
|
||||
Log.e("count", childCount+"");
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
final View childView = getChildAt(i);
|
||||
if (childView.getVisibility() != View.GONE) {
|
||||
final int childWidth = childView.getMeasuredWidth();
|
||||
childView.layout(childLeft, 0, childLeft + childWidth,
|
||||
childView.getMeasuredHeight());
|
||||
childLeft += childWidth;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
// TODO Auto-generated method stub
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
Log.e("b", "b");
|
||||
final int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||
|
||||
final int count = getChildCount();
|
||||
for (int i = 0; i < count; i++) {
|
||||
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
|
||||
}
|
||||
|
||||
scrollTo(mCurScreen * width, 0);
|
||||
|
||||
}
|
||||
|
||||
public void snapToDestination() {
|
||||
final int screenWidth = getWidth();
|
||||
|
||||
final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth;
|
||||
snapToScreen(destScreen);
|
||||
}
|
||||
|
||||
//使屏幕移动到第whichScreen+1屏
|
||||
public void snapToScreen(int whichScreen) {
|
||||
|
||||
if (getScrollX() != (whichScreen * getWidth())) {
|
||||
final int delta = whichScreen * getWidth() - getScrollX();
|
||||
mScroller.startScroll(getScrollX(), 0, delta, 0,
|
||||
Math.abs(delta) * 2);
|
||||
mCurScreen = whichScreen;
|
||||
invalidate();
|
||||
|
||||
if (mOnViewChangeListener != null) {
|
||||
mOnViewChangeListener.OnViewChange(mCurScreen);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void computeScroll() {
|
||||
// TODO Auto-generated method stub
|
||||
if (mScroller.computeScrollOffset()) {
|
||||
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
|
||||
postInvalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
final int action = event.getAction();
|
||||
final float x = event.getX();
|
||||
final float y = event.getY();
|
||||
|
||||
switch (action) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
|
||||
Log.i("", "onTouchEvent ACTION_DOWN");
|
||||
if (mVelocityTracker == null) {
|
||||
mVelocityTracker = VelocityTracker.obtain();
|
||||
mVelocityTracker.addMovement(event);
|
||||
}
|
||||
if (!mScroller.isFinished()) {
|
||||
mScroller.abortAnimation();
|
||||
}
|
||||
mLastMotionX = x;
|
||||
break;
|
||||
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
|
||||
int deltaX = (int) (mLastMotionX - x);
|
||||
if (IsCanMove(deltaX)) {
|
||||
if (mVelocityTracker != null) {
|
||||
mVelocityTracker.addMovement(event);
|
||||
}
|
||||
mLastMotionX = x;
|
||||
//正向或者负向移动,屏幕跟随手指移动
|
||||
scrollBy(deltaX, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case MotionEvent.ACTION_UP:
|
||||
|
||||
int velocityX = 0;
|
||||
if (mVelocityTracker != null) {
|
||||
mVelocityTracker.addMovement(event);
|
||||
mVelocityTracker.computeCurrentVelocity(1000);
|
||||
//得到X轴方向手指移动速度
|
||||
velocityX = (int) mVelocityTracker.getXVelocity();
|
||||
}
|
||||
//velocityX为正值说明手指向右滑动,为负值说明手指向左滑动
|
||||
if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {
|
||||
// Fling enough to move left
|
||||
Log.e(TAG, "snap left");
|
||||
snapToScreen(mCurScreen - 1);
|
||||
} else if (velocityX < -SNAP_VELOCITY
|
||||
&& mCurScreen < getChildCount() - 1) {
|
||||
// Fling enough to move right
|
||||
Log.e(TAG, "snap right");
|
||||
snapToScreen(mCurScreen + 1);
|
||||
} else {
|
||||
snapToDestination();
|
||||
}
|
||||
|
||||
if (mVelocityTracker != null) {
|
||||
mVelocityTracker.recycle();
|
||||
mVelocityTracker = null;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private boolean IsCanMove(int deltaX) {
|
||||
//deltaX<0说明手指向右划
|
||||
if (getScrollX() <= 0 && deltaX < 0) {
|
||||
return false;
|
||||
}
|
||||
//deltaX>0说明手指向左划
|
||||
if (getScrollX() >= (getChildCount() - 1) * getWidth() && deltaX > 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void SetOnViewChangeListener(OnViewChangeListener listener) {
|
||||
mOnViewChangeListener = listener;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package com.stone.shop.scroll;
|
||||
|
||||
public interface OnViewChangeListener {
|
||||
public void OnViewChange(int view);
|
||||
}
|
Loading…
Reference in New Issue