用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - android代码库

仿微信 首次启动 使用教程滑动 开门动画

2013-04-13 作者: 小蜜锋举报

[android]代码库

package com.chen.weixin.test;
 
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;
 
    private Scroller mScroller; // 滑动控制
 
    private int mCurScreen;
 
    private int mDefaultScreen = 0;
 
    private float mLastMotionX;
 
    // private int mTouchSlop;
 
    // private static final int TOUCH_STATE_REST = 0;
    // private static final int TOUCH_STATE_SCROLLING = 1;
    // private int mTouchState = TOUCH_STATE_REST;
 
    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);
    }
 
    public MyScrollLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
 
        init(context);
    }
 
    private void init(Context context) {
        mCurScreen = mDefaultScreen;
 
        // mTouchSlop =
        // ViewConfiguration.get(getContext()).getScaledTouchSlop();
 
        mScroller = new Scroller(context);
 
    }
 
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // TODO Auto-generated method stub
 
        if (changed) {
            int childLeft = 0;
            final int childCount = getChildCount();
 
            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);
 
        final int width = MeasureSpec.getSize(widthMeasureSpec);
        final int widthMode = MeasureSpec.getMode(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);
    }
 
    public void snapToScreen(int whichScreen) {
 
        // get the valid layout page
        whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
        if (getScrollX() != (whichScreen * getWidth())) {
 
            final int delta = whichScreen * getWidth() - getScrollX();
 
            mScroller.startScroll(getScrollX(), 0, delta, 0,
                    Math.abs(delta) * 2);
 
            mCurScreen = whichScreen;
            invalidate(); // Redraw the layout
 
            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);
                velocityX = (int) mVelocityTracker.getXVelocity();
            }
 
            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;
            }
 
            // mTouchState = TOUCH_STATE_REST;
            break;
        }
 
        return true;
    }
 
    //
    // public boolean onInterceptTouchEvent(MotionEvent ev) {
    // // TODO Auto-generated method stub
    // final int action = ev.getAction();
    // if ((action == MotionEvent.ACTION_MOVE)
    // && (mTouchState != TOUCH_STATE_REST)) {
    // Log.i("", "onInterceptTouchEvent  return true");
    // return true;
    // }
    // final float x = ev.getX();
    // final float y = ev.getY();
    // switch (action) {
    // case MotionEvent.ACTION_MOVE:
    // final int xDiff = (int) Math.abs(mLastMotionX - x);
    // if (xDiff > mTouchSlop) {
    // mTouchState = TOUCH_STATE_SCROLLING;
    // }
    // break;
    //
    // case MotionEvent.ACTION_DOWN:
    // mLastMotionX = x;
    //
    // mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST
    // : TOUCH_STATE_SCROLLING;
    // break;
    //
    // case MotionEvent.ACTION_CANCEL:
    // case MotionEvent.ACTION_UP:
    // mTouchState = TOUCH_STATE_REST;
    // break;
    // }
    //
    // if (mTouchState != TOUCH_STATE_REST)
    // {
    // Log.i("", "mTouchState != TOUCH_STATE_REST  return true");
    // }
    //
    //
    // return mTouchState != TOUCH_STATE_REST;
    // }
 
    private boolean IsCanMove(int deltaX) {
 
        if (getScrollX() <= 0 && deltaX < 0) {
            return false;
        }
 
        if (getScrollX() >= (getChildCount() - 1) * getWidth() && deltaX > 0) {
            return false;
        }
 
        return true;
    }
 
    public void SetOnViewChangeListener(OnViewChangeListener listener) {
        mOnViewChangeListener = listener;
    }
 
}

[代码运行效果截图]


仿微信 首次启动 使用教程滑动  开门动画

[源代码打包下载]




网友评论    (发表评论)

共3 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...