码迷,mamicode.com
首页 > 其他好文 > 详细

使用HorizontalScrollView实现侧滑菜单

时间:2015-04-05 13:23:33      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:android   侧滑菜单   

主要继承 HorizontalScrollView   类 ,在构造方法中设置 菜单的宽,  重写 onMeasure,  onLayout 方法 ,在 onLayout 中设置初始显示到 内容页的 scrollTo


1、SlidingMenuView 类的实现如下,

package com.example.slidingmenu;

import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;

public class SlidingMenuView extends HorizontalScrollView {

    private LinearLayout mWapper;
    private ViewGroup mMenu;
    private ViewGroup mContent;
    private int mScreenWidth;
    private int mMenuRightPadding;

    private int mMenuWidth;

    private boolean hasMeasured = false;

    public SlidingMenuView(Context context) {
        super(context);
    }

    public SlidingMenuView(Context context, AttributeSet attrs) {
        super(context, attrs);

        WindowManager wm = (WindowManager) context
                .getSystemService(context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        mScreenWidth = outMetrics.widthPixels;

        mMenuRightPadding = (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 200, context.getResources()
                        .getDisplayMetrics());
    }

    public SlidingMenuView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        if (hasMeasured == false) {
            mWapper = (LinearLayout) getChildAt(0);
            mMenu = (ViewGroup) mWapper.getChildAt(0);
            mContent = (ViewGroup) mWapper.getChildAt(1);

            mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth
                    - mMenuRightPadding;
            mContent.getLayoutParams().width = mScreenWidth;
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);

        if (changed)
            this.scrollTo(mMenuWidth, 0);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
        case MotionEvent.ACTION_UP:
             int scrollX = getScrollX();  // 隐藏 在 左边 的 宽度
             if( scrollX >= mMenuWidth / 2){
                 this.smoothScrollTo(mMenuWidth, 0);
             }else{
                 this.smoothScrollTo(0, 0);
             }
             return true;
        default:
            break;
        }
        
        return super.onTouchEvent(ev);
    }

}


2、 xml布局文件中使用的方法如下, 注意 HorizontalScrollView 的子布局里只允许有一个根View

<com.example.slidingmenu.SlidingMenuView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent" >

        <include layout="@layout/sliding_menu" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#f0f"
            android:gravity="center" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="内容页" />
        </LinearLayout>
    </LinearLayout>

</com.example.slidingmenu.SlidingMenuView>

3、运行效果图

     技术分享            技术分享



使用HorizontalScrollView实现侧滑菜单

标签:android   侧滑菜单   

原文地址:http://blog.csdn.net/u013394527/article/details/44887015

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!