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
原创粉丝点击