Android 实现滑动的侧栏菜单
来源:互联网 发布:unity3d 实时光照 编辑:程序博客网 时间:2024/05/10 23:58
实现一个简单的侧栏菜单,类似于QQ。
DragViewGroup.class
public class DragViewGroup extends FrameLayout {private ViewDragHelper mViewDragHelper;private View mMenuView, mMainView;private int mWidth;public DragViewGroup(Context context) {super(context);initView();}public DragViewGroup(Context context, AttributeSet attrs) {super(context, attrs);initView();}public DragViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView();}@Overrideprotected void onFinishInflate() {super.onFinishInflate();mMenuView = getChildAt(0);mMainView = getChildAt(1);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mWidth = mMenuView.getMeasuredWidth();}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {return mViewDragHelper.shouldInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// 将触摸事件传递给ViewDragHelper,此操作必不可少mViewDragHelper.processTouchEvent(event);return true;}private void initView() {mViewDragHelper = ViewDragHelper.create(this, callback);}private ViewDragHelper.Callback callback = new ViewDragHelper.Callback() {// 何时开始检测触摸事件@Overridepublic boolean tryCaptureView(View child, int pointerId) {// 如果当前触摸的child是mMainView时开始检测return mMainView == child;}// 触摸到View后回调@Overridepublic void onViewCaptured(View capturedChild, int activePointerId) {super.onViewCaptured(capturedChild, activePointerId);}// 当拖拽状态改变,比如idle,dragging@Overridepublic void onViewDragStateChanged(int state) {super.onViewDragStateChanged(state);}// 当位置改变的时候调用,常用与滑动时更改scale等@Overridepublic void onViewPositionChanged(View changedView, int left, int top,int dx, int dy) {super.onViewPositionChanged(changedView, left, top, dx, dy);}// 处理垂直滑动@Overridepublic int clampViewPositionVertical(View child, int top, int dy) {return 0;}// 处理水平滑动@Overridepublic int clampViewPositionHorizontal(View child, int left, int dx) {if (left > 0) {// 如果手势向右滑动则返回,如果向左滑动不返回return left;}return 0;}// 拖动结束后调用@Overridepublic void onViewReleased(View releasedChild, float xvel, float yvel) {super.onViewReleased(releasedChild, xvel, yvel);// 手指抬起后缓慢移动到指定位置if (mMainView.getLeft() < 500) {// 关闭菜单// 相当于Scroller的startScroll方法mViewDragHelper.smoothSlideViewTo(mMainView, 0, 0);ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);} else {// 打开菜单mViewDragHelper.smoothSlideViewTo(mMainView, 300, 0);ViewCompat.postInvalidateOnAnimation(DragViewGroup.this);}}};@Overridepublic void computeScroll() {if (mViewDragHelper.continueSettling(true)) {ViewCompat.postInvalidateOnAnimation(this);}}}drag_viewgroup.xml
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.view.DragViewGroup android:id="@+id/view" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/blue" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Menu" /> </FrameLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/gray" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Main" /> </FrameLayout> </com.example.view.DragViewGroup></FrameLayout>
0 0
- Android 实现滑动的侧栏菜单
- Android 滑动菜单的实现
- Android 滑动菜单的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- (转)android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- android 滑动菜单SlidingMenu的实现
- AOP详解(1)
- mysql 字段避免赋值为0
- PorterDuffXfermode的用法
- Unity中炮弹抛物线运动
- 多实例mysql本地登陆
- Android 实现滑动的侧栏菜单
- 数据结构之链表和递归
- 血液中心满意度考核报表
- 如何制作LINUX的patch文件及如何打patch
- leetcode 125. Valid Palindrome
- linux--kvm--关于kvm的磁盘格式和缓存问题
- 数学三次危机(二)毕达哥拉斯学派的数学思想
- git
- AndroidStudio之导入项目