仿手机酷狗-音乐播放页面拖动效果
来源:互联网 发布:小可知乎 编辑:程序博客网 时间: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
- 仿手机酷狗-音乐播放页面拖动效果
- Android仿网易云音乐播放页面 背景虚化碟片效果
- Swift版本仿网易云音乐播放音乐动画效果
- 实现 酷狗音乐 歌词播放效果
- iOS-自定义Model转场动画-仿酷我音乐播放器效果
- 仿手机QQ消息数拖动删除效果
- 仿QQ音乐播放器
- 仿网易云音乐播放音乐转盘
- ios音乐播放器-仿QQ音乐
- HTML5页面播放音乐
- 手机页面禁止页面拖动
- 仿手机通讯录效果
- 仿虾米音乐引导页面
- 手机安全卫士------手机防盗页面之播放报警音乐&GPS定位
- 仿千千动听酷狗音乐桌面歌词效果技术关键
- 92.手机播放报警音乐
- DerectX7实现播放音乐效果
- DerectX7实现播放音乐效果
- my eclipse 的代码提示功能
- UVA - 656 Optimal Programs
- java生成者消费者队列实现(全)
- NSDictionary和NSMutableDictionary
- bzoj 1862/1056 [HAOI2008]排名系统
- 仿手机酷狗-音乐播放页面拖动效果
- CSU1604: SunnyPig(BFS)
- Android中的Audio播放:音量和远程播放控制
- JSP文件是否有必要放在WEB-INF下
- 使用L脚本语言实现分布式计算的例子
- 置顶
- 黑马程序员_Java基础_泛型应用 和 基本数据类型对象包装类
- 域名设置 Domain Name System
- CSU1603: Scheduling the final examination(贪心)