使用HorizontalScrollView实现最简单的侧滑菜单

                实现侧滑菜单, 自定义HorizontalScrollView,重写OnMeasure(),OnLayout();OnTouchEvent(); OnScrollChanged()这四个方法就能很简单的实现,代码如下:

   

public class SlidingMenu extends HorizontalScrollView {

	private int applyDimension;
	private LinearLayout mWapper;
	private ViewGroup mMenu;
	private ViewGroup mContent;
	private int mScreenWidth;
	private int mMenuWidth;
	private boolean isSlideOut = false;

	public SlidingMenu(Context context, AttributeSet attrs) {
		super(context, attrs);
		WindowManager wm = (WindowManager) context
				.getSystemService(Context.WINDOW_SERVICE);
		DisplayMetrics Metrics = new DisplayMetrics();
		wm.getDefaultDisplay().getMetrics(Metrics);
		mScreenWidth = Metrics.widthPixels;
		applyDimension = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, context.getResources().getDisplayMetrics());
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		mWapper = (LinearLayout) getChildAt(0);
		mMenu = (ViewGroup) mWapper.getChildAt(0);
		mContent = (ViewGroup) mWapper.getChildAt(1);
		mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth
				- applyDimension;
		mContent.getLayoutParams().width = mScreenWidth;
	}

	@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:
			float moveX = getScrollX();
			// Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏  
			if (moveX > mScreenWidth / 2) {
				this.smoothScrollTo(mMenuWidth, 0);
				isSlideOut = false;
			} else {
				smoothScrollTo(0, 0);
				isSlideOut = true;
			}
			return true;
		}
		return super.onTouchEvent(ev);
	}

	/**
	 * 向右滑出菜单
	 */
	public void slideinMenu() {
		if (isSlideOut) {
			this.smoothScrollTo(mMenuWidth, 0);
			isSlideOut = false;
		} else {
			return;
		}

	}

	/**
	 * 向左滑进菜单
	 */
	public void slideoutMenu() {
		if (!isSlideOut) {
			smoothScrollTo(0, 0);
			isSlideOut = true;
		} else {
			return;
		}
	}
         
         //对外暴露一个打开或缩放的方法
	public void switchMenu() {
		if (isSlideOut) {
			slideinMenu();
		} else {
			slideoutMenu();
		}
	}

	/*
	 发生滚动事件时调用,实现动画效果
	 */
	@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {
		super.onScrollChanged(l, t, oldl, oldt);
		float scale = l * 1.0f / mMenuWidth;

		float menuScale = 1.0f - scale * 0.3f;

		float menuAlpha = 0.0f + 1.0f * (1 - scale);

		float contentScale = 0.8f + 0.2f * scale;

		// 调用属性动画,设置TranslationX
		ViewHelper.setTranslationX(mMenu, mMenuWidth * scale * 0.8f);

		// 左侧菜单的缩放
		ViewHelper.setScaleX(mMenu, menuScale);

		ViewHelper.setScaleY(mMenu, menuScale);

		// 左侧菜单的透明度缩放
		ViewHelper.setAlpha(mMenu, menuAlpha);

		// 右侧内容的缩放
		ViewHelper.setPivotX(mContent, 0);
		ViewHelper.setPivotY(mContent, mContent.getHeight() / 2);

		ViewHelper.setScaleY(mContent, contentScale);

		ViewHelper.setScaleX(mContent, contentScale);
	}

}

    自定义view代码如上,添加了侧滑时的动画效果,其他布局代码就不贴了.

    Demo地址 :http://download.csdn.net/detail/qq_35578940/9801587


  也可以看看HongYang大神的博客:

       http://blog.csdn.net/lmj623565791/article/details/39185641










 

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值