使用scrollto实现slidemenu

目录

上几次使用layout直接slide的,这次使用scrollto

关键源码

/**
 * 
 */
package com.zk.demo6.slideutil;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller;

public class BOXContent extends ViewGroup implements SlideInter {
	private Scroller scroller;
	private final static String Tag = "BOXContent";
	private static int screenWidth = 0;
	private static int screenHeight = 0;
	private int OpenSlideDis = 0;
	private VelocityTracker vTracker;
	public BOXContent(Context context) {
		super(context);
		init();
	}

	public BOXContent(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}

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

	public void init() {

		scroller = new Scroller(getContext());
	}

	// 通过onLayout正常的长满屏幕
	// 我们只是简单的把view沾满屏幕,如果实
	// 现多个view的布局的话还是相当麻烦的!
	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		int viewcount = getChildCount();
		View child = null;
		for (int count = 0; count < viewcount; count++) {
			child = getChildAt(count);
			if (child.getVisibility() != GONE) {
				child.layout(l, t, r, b);
			}
		}
		// 屏幕的大小
		screenWidth = getWidth();
		screenHeight = getHeight();
	}

	// 通过measure让view正常的长满屏幕
	// 我们只是简单的把view沾满屏幕,如果实
	// 现多个view的布局的话还是相当麻烦的!
	// 将view根据测量测度设置measure
	// 不用该onMeasure方法还是可以的
	// 不过在onlayout时就会不正常,自
	// 已试一试在该view布局一个Button
	// (带text的,就知道了,具体得深入理解UI的布局)
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		int width = MeasureSpec.getSize(widthMeasureSpec);
		int height = MeasureSpec.getSize(heightMeasureSpec);
		setMeasuredDimension(width, height);
		for (int i = 0; i < getChildCount(); i++) {
			getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
		}
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		return super.onTouchEvent(event);
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			
			if (ev.getX() < SlideAction.startXTrag && !SlideAction.isOnTraging
					&& !SlideAction.menuOpen) {
				TargBegState();
				addVTracker(ev);
			} else if (ev.getX() > SlideAction.MenuWidth
					&& !SlideAction.isOnTraging && SlideAction.menuOpen) {
				TragEndState();
				addVTracker(ev);
			}
			break;
		case MotionEvent.ACTION_MOVE:

			//Log.i(Tag,"the x velocity is "+vTracker.getXVelocity()); 
			if (SlideAction.isOnTraging) {
				vTracker.addMovement(ev);
				vTracker.computeCurrentVelocity(1000); 				
				// 消除缝隙
				if (ClearGrap((int) ev.getX()))break;
				//速度问题
				/*if(vTracker.getXVelocity() > 4000){
					Log.i(Tag,"InitOpenState"); 
					//OpenSlideDis = screenWidth - (int) ev.getX() - (screenWidth - SlideAction.MenuWidth);
					//onTraging(-(int) ev.getX(), -OpenSlideDis);
					// 初始化open状态
					InitOpenState();	
					break;
				}else if(vTracker.getXVelocity() < -4000){
					Log.i(Tag,"InitStarState"); 
					//onTraging(-(int) ev.getX(), (int) ev.getX());
					// 初始化开始状态
					InitStarState();	
					break;
				}*/
				onTraging(-(int) ev.getX(), 2);
			}
			break;
		case MotionEvent.ACTION_UP:

			if (ev.getX() > SlideAction.MenuWidth
					&& SlideAction.menuOpen == true) {
				Log.i(Tag, "End....");
				onTraging(-(int) SlideAction.MenuWidth,
						(int) SlideAction.MenuWidth);
				// 初始化开始状态
				InitStarState();
			} else if (SlideAction.isOnTraging
					&& ev.getX() < SlideAction.MenuWidthHalf) {
				onTraging(-(int) ev.getX(), (int) ev.getX());
				// 初始化开始状态
				InitStarState();
			} else if (SlideAction.isOnTraging
					&& ev.getX() > SlideAction.MenuWidthHalf) {
				// 消除缝隙
				if (ClearGrap((int) ev.getX()))
					break;
				OpenSlideDis = screenWidth - (int) ev.getX()
						- (screenWidth - SlideAction.MenuWidth);
				onTraging(-(int) ev.getX(), -OpenSlideDis);
				// 初始化open状态
				InitOpenState();
			}
			//回收
			recyleVTracker(vTracker);
			break;
		case MotionEvent.ACTION_CANCEL:
			recyleVTracker(vTracker);
			break;
		default:
			break;
		}
		return super.onInterceptTouchEvent(ev);
	}

	@Override
	public void computeScroll() {
		if (scroller.computeScrollOffset() && !scroller.isFinished()) {
			scrollTo(scroller.getCurrX(), 0);
			postInvalidate();
		}
	}

	@Override
	public void TargBegState() {
		SlideAction.isOnTraging = true;
	}

	@Override
	public void TragEndState() {
		SlideAction.isOnTraging = true;

	}

	@Override
	public void onTraging(int curr, int dis) {

		scroller.startScroll(curr, 0, dis, 0);
		drawView();
	}

	@Override
	public void InitOpenState() {
		//getChildAt(0).layout(SlideAction.MenuWidth, 0, SlideAction.MenuWidth+screenWidth, screenHeight);
		SlideAction.menuOpen = true;
		SlideAction.isOnTraging = false;
	}

	@Override
	public void InitStarState() {
		SlideAction.menuOpen = false;
		SlideAction.isOnTraging = false;
		getChildAt(0).layout(0, 0, screenWidth, screenHeight);
		drawView();
	}

	@Override
	public void drawView() {
		invalidate();
	}

	@Override
	public boolean ClearGrap(int curr) {
		if (curr > SlideAction.MenuWidth) {
			return true;
		}
		return false;

	}

	@Override
	public void addVTracker(MotionEvent ev) {

		if (vTracker == null) {
			vTracker = VelocityTracker.obtain();
		} else {
			vTracker.clear();
		}
		vTracker.addMovement(ev);
	}

	@Override
	public void recyleVTracker(VelocityTracker ev) {
		if(ev !=null){
			ev.recycle();
		}
		
	}
}


 下载自已学习

点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值