仿手机酷狗-音乐播放页面拖动效果

来源:互联网 发布:小可知乎 编辑:程序博客网 时间:2024/04/28 03:03

第一次写博客,希望内容大家能喜欢。

今天要写的内容是仿酷狗音乐播放页面。在最新版的酷狗里,当手指向右移动时,页面会旋转,并将上一个页面的内容显示出来。


先上效果图



下面上代码


public class SwipeLayout extends FrameLayout implements MyScroller.ScrollerEndListener {    private View mView;    private ViewDragHelper mViewDragHelper;    private int mScreenWidth;    private int mLeft = 0;    private OnDragDoneListener mOnDragDoneListener;//当滑动结束时调用    private MyScroller mScroller;//自定义Scroller类,用来监听Scroller的停止    public SwipeLayout(Context context, AttributeSet attrs) {        super(context, attrs);        init(context);    }    private void init(Context context) {        mViewDragHelper = ViewDragHelper.create(this, 1.0f, new DragHelperCallback());        mViewDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);        mScroller = new MyScroller(context);        mScroller.setOnScrollerEndListener(this);    }    @Override    public void onFinishInflate() {        super.onFinishInflate();        mView = getChildAt(0) == null ? null : getChildAt(0);    }    @Override    public void onMeasure(int widthSpec, int heightSpec) {        super.onMeasure(widthSpec, heightSpec);        mScreenWidth = getMeasuredWidth();    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        final int action = MotionEventCompat.getActionMasked(ev);        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {            mViewDragHelper.cancel();            return false;        }        return mViewDragHelper.shouldInterceptTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        if (!mScroller.isFinished()) {            mScroller.abortAnimation();        }        mViewDragHelper.processTouchEvent(ev);        return true;    }    /**     * Clamp Integer values to a given range     *     * @param value the value to clamp     * @param min   the minimum value     * @param max   the maximum value     * @return the clamped value     */    private int clamp(int value, int min, int max) {        return Math.max(min, Math.min(max, value));    }    @Override    public void onScrollerEnd() {        if (mOnDragDoneListener != null)            if (mLeft <= 0) {
<span style="white-space:pre"></span>//保持不动                mOnDragDoneListener.onDragDone(OnDragDoneListener.STAY_PUT);            } else {
<span style="white-space:pre"></span>//关闭当前Activity                mOnDragDoneListener.onDragDone(OnDragDoneListener.SHUT_DOWN);            }    }    public class DragHelperCallback extends ViewDragHelper.Callback {        @Override        public boolean tryCaptureView(View child, int pointerId) {            return child == mView;        }        @Override        public int clampViewPositionHorizontal(View child, int left, int dx) {//dx为move的距离
            mLeft += dx;            mLeft = clamp(mLeft, 0, mScreenWidth);            rotateView(mLeft);            return 0;        }        @Override        public int getViewHorizontalDragRange(View child) {            return mScreenWidth;        }        @Override        public void onViewReleased(View releasedChild, float xvel, float yvel) {            super.onViewReleased(releasedChild, xvel, yvel);            int left = 0;            if (mLeft > mScreenWidth / 2)                left = mScreenWidth;            onReleased(left);            invalidate();        }        @Override        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {            super.onViewPositionChanged(changedView, left, top, dx, dy);        }        @Override        public void onViewDragStateChanged(int state) {            super.onViewDragStateChanged(state);                    }    }    @Override    public void computeScroll() {        if (mScroller.computeScrollOffset()) {            mLeft = mScroller.getCurrX();            rotateView(mLeft);            invalidate();        }        super.computeScroll();    }    private void onReleased(int left) {        mScroller.startScroll(mLeft, 0, left - mLeft, 0, 300);        invalidate();    }    private void rotateView(int left) {        float rotate = (left * 1.0f) / (1.0f * mScreenWidth) * 35;        ViewHelper.setPivotX(mView, 0.5f * mScreenWidth);        ViewHelper.setPivotY(mView, 2.0f * getMeasuredHeight());        ViewHelper.setRotation(mView, rotate);    }    public interface OnDragDoneListener {        public void onDragDone(int whatToDo);        public static final int STAY_PUT = 1;        public static final int SHUT_DOWN = 2;    }    public void setOnDragDoneListener(OnDragDoneListener on) {        mOnDragDoneListener = on;    }}
 下面是MyScroller的代码

public class MyScroller extends Scroller {    private Handler handler;    private long mId;    private ScrollerEndListener mScrollerListener;    public MyScroller(Context context) {        super(context);        handler = new Handler() {            @Override            public void dispatchMessage(Message msg) {                long id = (Long) msg.obj;                if (id == mId) {                    if (mScrollerListener != null) {                        mScrollerListener.onScrollerEnd();                    }                }            }        };    }    @Override    public void startScroll(int startX, int startY, int dx, int dy, int duration) {        super.startScroll(startX, startY, dx, dy, duration);        mId = System.currentTimeMillis();        Message msg = handler.obtainMessage();        msg.obj = mId;        handler.sendMessageDelayed(msg, duration);    }    @Override    public void abortAnimation() {        super.abortAnimation();        mId = System.currentTimeMillis();    }    public void setOnScrollerEndListener(ScrollerEndListener scrollerListener) {        mScrollerListener = scrollerListener;    }    public interface ScrollerEndListener {        public void onScrollerEnd();    }}

下面是Activity的主题


<style name="TransparentTheme" parent="AppTheme">        <item name="android:windowBackground">@android:color/transparent</item>        <item name="android:windowIsTranslucent">true</item>       <span style="white-space:pre"></span><!-- 通过设置这两个属性,可以让Activity变透明并显示上个Activity的内容 -->    </style>






0 0
原创粉丝点击