自定义FrameLayout 实现屏幕一张张翻

来源:互联网 发布:校园网络投标书 编辑:程序博客网 时间:2024/06/06 23:16
http://wang-peng1.iteye.com/blog/995814
class PanelSwitcher extends FrameLayout {    private static final int MAJOR_MOVE = 60;    private static final int ANIM_DURATION = 400;    private GestureDetector mGestureDetector;    private int mCurrentView;    private View mChild, mHistoryView;    private View children[];    private int mWidth;    private TranslateAnimation inLeft;    private TranslateAnimation outLeft;    private TranslateAnimation inRight;    private TranslateAnimation outRight;    private static final int NONE  = 1;    private static final int LEFT  = 2;    private static final int RIGHT = 3;    private int mPreviousMove;    public PanelSwitcher(Context context, AttributeSet attrs) {        super(context, attrs);        mCurrentView = 0;        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {                public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,                                       float velocityY) {                    int dx = (int) (e2.getX() - e1.getX());                    // don't accept the fling if it's too short                    // as it may conflict with a button push                    if (Math.abs(dx) > MAJOR_MOVE && Math.abs(velocityX) > Math.abs(velocityY)) {                        if (velocityX > 0) {                            moveRight();                        } else {                            moveLeft();                        }                        return true;                    } else {                        return false;                    }                }            });    }    @Override     public void onSizeChanged(int w, int h, int oldW, int oldH) {        mWidth = w;        inLeft   = new TranslateAnimation(mWidth, 0, 0, 0);        outLeft  = new TranslateAnimation(0, -mWidth, 0, 0);                inRight  = new TranslateAnimation(-mWidth, 0, 0, 0);        outRight = new TranslateAnimation(0, mWidth, 0, 0);        inLeft.setDuration(ANIM_DURATION);        outLeft.setDuration(ANIM_DURATION);        inRight.setDuration(ANIM_DURATION);        outRight.setDuration(ANIM_DURATION);    }    protected void onFinishInflate() {        int count = getChildCount();        children = new View[count];        for (int i = 0; i < count; ++i) {            children[i] = getChildAt(i);            if (i != mCurrentView) {                children[i].setVisibility(View.GONE);            }        }    }    @Override    public boolean onTouchEvent(MotionEvent event) {        mGestureDetector.onTouchEvent(event);        return true;    }    @Override    public boolean onInterceptTouchEvent(MotionEvent event) {        return mGestureDetector.onTouchEvent(event);    }    void moveLeft() {        //  <--        if (mCurrentView < children.length - 1 && mPreviousMove != LEFT) {            children[mCurrentView+1].setVisibility(View.VISIBLE);            children[mCurrentView+1].startAnimation(inLeft);            children[mCurrentView].startAnimation(outLeft);            children[mCurrentView].setVisibility(View.GONE);            mCurrentView++;            mPreviousMove = LEFT;        }    }    void moveRight() {        //  -->        if (mCurrentView > 0 && mPreviousMove != RIGHT) {            children[mCurrentView-1].setVisibility(View.VISIBLE);            children[mCurrentView-1].startAnimation(inRight);            children[mCurrentView].startAnimation(outRight);            children[mCurrentView].setVisibility(View.GONE);            mCurrentView--;            mPreviousMove = RIGHT;        }    }    int getCurrentIndex() {        return mCurrentView;    }}

0 0
原创粉丝点击