自定义View实现SlidingMenu

自定义View通过继承HorizontalScrollView来实现SlidingMenu的功能

其实这里面有两个布局,通过重写几个方法来回隐藏显示两个布局达到侧滑的效果。
原理是在LinearLayout外嵌套了HorizontalScrollView,而SlidingMenu继承HorizontalScrollView 重写onMeasure()onLayout()onTouchEvent()方法来实现最基本的功能。

下面是实现代码

/** * Created by ylbf_dev on 2016/1/25. */
public class SlidingMenu extends HorizontalScrollView {
    private int mScreenWidth;//屏幕宽度
    private int mMenuRightPaddint = 50;//右边留出的宽度
    private ViewGroup mMenu;//左边视图
    private ViewGroup mContent;//右边视图
    private int mMenuWidth;//左边视图宽度
    private int mHalfMenuWidth;//左边视图宽度的一半
    private boolean once;//是否已经初始化菜单
    private Button button;//渐变菜单按钮

    public SlidingMenu(Context context, AttributeSet attrs) {
        super(context, attrs);
        mScreenWidth = context.getResources().getDisplayMetrics().widthPixels;//得到屏幕的宽
    }

    /** * 重新计算两个视图的宽度 默认显示右边的视图 */

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (!once) {
            LinearLayout child =(LinearLayout)getChildAt(0);
            mMenu = (ViewGroup) child.getChildAt(0);//获得左边菜单视图
            mContent = (ViewGroup) child.getChildAt(1);//获得右边主视图
            button = (Button) mContent.getChildAt(0);
            mMenuWidth = mScreenWidth - mMenuRightPaddint;//获得菜单宽度
            mHalfMenuWidth = mMenuWidth / 2;

            mMenu.getLayoutParams().width = mMenuWidth;//设置宽度
            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);//表示移动的位置
            once = true;
        }
    }

    /** * 按钮切换的点击事件 */
    public void menuToggle() {
        if (getScaleX() == 0) {//展示菜单
            smoothScrollTo(mMenuWidth, 0);
        } else if (getScaleX() == mMenuWidth) {//展示主界面
            smoothScrollTo(0, 0);
        }


    }

    /** * 处理滑动超过一半 * * @param ev * @return */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_UP:
                int scrollX = getScrollX();//得到水平滑动的距离
                if (scrollX > mHalfMenuWidth) {
                    smoothScrollTo(mMenuWidth, 0);
                } else {
                    smoothScrollTo(0, 0);
                }
                return true;
        }
        return super.onTouchEvent(ev);
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        float scale = l * 1.0f / mMenuWidth;//原始值的范围

        // ViewHelper 在开源动画库nineoldandroids中
        ViewHelper.setAlpha(button,scale);
    }
}

你可能感兴趣的:(自定义view)