自定义View之 CustomSlidingMenu

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Charles_dai001/article/details/79625626
package com.lide.event.defineView;

import android.content.Context;
import android.support.v4.view.ViewConfigurationCompat;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;

import com.nineoldandroids.view.ViewHelper;

/**
 * @author DJC
 * @time 2018/3/20  9:46
 * @desc ${自定义滑动菜单}
 */
public class SlidingMenu extends HorizontalScrollView {

    private int mScreenWith;
    private ViewGroup mMenu;
    private ViewGroup mMain;
    private int mPadding;
    private boolean hasLayout;
    private int mMenuWith;
    private float mDownX;
    private int mMTouchSlop;

    public SlidingMenu(Context context) {
        super(context);
        initv(context);
    }


    public SlidingMenu(Context context, AttributeSet attrs) {
        super(context, attrs);
        initv(context);
    }

    public SlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initv(context);
    }

    /**
     * 获取屏幕宽度
     *
     * @param context
     */
    private void initv(Context context) {
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        windowManager.getDefaultDisplay().getMetrics(outMetrics);
        mScreenWith = outMetrics.widthPixels;

        final ViewConfiguration configuration = ViewConfiguration.get(context);
        //系统允许的滑动的最小距离    ;//作为判断点击还是滑动事件的最小距离
        mMTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);

        mPadding = 120; //主界面显示最小宽度
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (!hasLayout) {
            LinearLayout wrapper = (LinearLayout) getChildAt(0); //SlidingMenu作为viewgroup获取到自身的第一个view
            mMenu = (ViewGroup) wrapper.getChildAt(0);
            mMain = (ViewGroup) wrapper.getChildAt(1);

            mMenuWith = mScreenWith - mPadding;
            mMenu.getLayoutParams().width = mMenuWith;
            mMain.getLayoutParams().width = mScreenWith;                    //给子view设置固定的宽高
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }


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

        if (changed) {
            hasLayout = true;  
        }
        this.scrollTo(mMenuWith, 0);  //设置初始滑动位置
         super.onLayout(changed, l, t, r, b);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {

        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                mDownX = ev.getX();
                break;
            case MotionEvent.ACTION_HOVER_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                float diffX = ev.getX() - mDownX;
                if (diffX < -mMTouchSlop) {
                    this.smoothScrollTo(mMenuWith, 0);
                } else if (diffX > mMTouchSlop) {
                    this.smoothScrollTo(0, 0);
                } else {
                    return false;  //响应子控件的点击事件
                }
                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 factor = (float) l / mMenuWith;
        ViewHelper.setTranslationX(mMenu, mMenuWith * factor * 0.6f);
        //2.缩放效果
        float leftScale = 1 - 0.4f * factor;
        ViewHelper.setScaleX(mMenu, leftScale);
        ViewHelper.setScaleY(mMenu, leftScale);

        float rightScale = 0.8f + 0.2f * factor;
        ViewHelper.setScaleX(mMain, rightScale);
        ViewHelper.setScaleY(mMain, rightScale);
        //3.透明度效果
        ViewHelper.setAlpha(mMenu, 1 - factor);

    }
}

猜你喜欢

转载自blog.csdn.net/Charles_dai001/article/details/79625626
今日推荐