android滑动界面

滑动相关的方法

scrollTo(int x,int y):x,y代表的不是坐标点,而是偏移量。
scrollBy(int x,int y):它实际上是调用了scrollTo(mScrollX + x, mScrollY + y),即表示在原先偏移的基础上在发生偏移

scroller.getCurrX() //获取mScroller当前水平滚动的位置   
scroller.getCurrY() //获取mScroller当前竖直滚动的位置   
scroller.getFinalX() //获取mScroller最终停止的水平位置   
scroller.getFinalY() //获取mScroller最终停止的竖直位置   
scroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置   
scroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置   
滑动动画相关的方法
//滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间   
scroller.startScroll(int startX, int startY, int dx, int dy) //使用默认完成时间250ms   
scroller.startScroll(int startX, int startY, int dx, int dy, int duration)


<span style="font-size:14px;">/*要实现滑动效果必须要重载computeScroll方法*/
@Override
public void computeScroll() {
	// 在View中有scrollTo和scrollBy方法,这两个方法其实是一样的,只是scrollTo是直接滑动到制定的位置,而scrollBy是滑动相对的距离
	// 在调用startScroll之后一定要调用invalidate,invalidate调用computeScroll,
	//然后computeScroll又调用invalidate,这样循环产生了滑动效果
	// 先判断mScroller滚动是否完成
	if (scroller.computeScrollOffset()) {
		// 这里调用View的scrollTo()完成实际的滚动
		scrollTo(scroller.getCurrX(), scroller.getCurrY());
		// 必须调用该方法,否则不一定能看到滚动效果
		postInvalidate();// 使用postInvalidate可以直接在线程中更新界面
	}
}</span>



<span style="font-size:14px;">/** 滑动的核心方法,在此处理滑动相关的操作 */
@Override
public boolean onTouchEvent(MotionEvent event) {
	int action = event.getAction();
	switch (action) {
	case MotionEvent.ACTION_DOWN:
		//业务相关的操作
		break;
	case MotionEvent.ACTION_MOVE:
		//业务相关的操作
		break;
	case MotionEvent.ACTION_UP:
		//业务相关的操作
		break;
	}
	return super.onTouchEvent(event);
}</span>




关键代码:

public class ScreenLayout extends RelativeLayout {
	private Context context;// 上下文
	private Scroller scroller;// 滑动空间,用来控制滑动时
	private int screenHeigh;// 屏幕高度
	private int downY = 0;// 按下时Y的位置
	private int currentY;// 滑动和抬起时Y的位置
	/** 滑动的距离:上滑为负,下滑为正 */
	private int distanceY;
	private int margin = 80;// 滑动区域的上下边距
	private int time = 500;// 滑动效果的持续时间,单位毫秒
	/**滑动布局是否在顶部*/
	private boolean isTop = false;
	private ImageView imgView;

	public ScreenLayout(Context context) {
		super(context);
		this.context = context;
		initView();
	}

	public ScreenLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
		initView();
	}

	/** 初始化组件和界面 */
	private void initView() {
		// 有弹跳效果的Interpolator
		// Interpolator polator = new BounceInterpolator();
		scroller = new Scroller(context, null);
		// 获取屏幕分辨率
		WindowManager wm = (WindowManager) (context
				.getSystemService(Context.WINDOW_SERVICE));
		DisplayMetrics dm = new DisplayMetrics();
		wm.getDefaultDisplay().getMetrics(dm);
		screenHeigh = dm.heightPixels;

		// 设置成透明背景,不然会影响看到底层布局
		this.setBackgroundColor(Color.argb(0, 0, 0, 0));

		imgView = new ImageView(context);
		imgView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.MATCH_PARENT));
		imgView.setScaleType(ImageView.ScaleType.FIT_XY);// 填充整个屏幕
		imgView.setImageResource(R.drawable.view); // 默认背景
		RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
				LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
		lp.addRule(RelativeLayout.CENTER_IN_PARENT);
		addView(imgView);

		startScroll(this.getScrollY(), -this.getScrollY() + margin, time);
	}

	/** 对scroller的startScroll方法进行封装, 从startY开始,滑动距离dy 持续时间duration */
	public void startScroll(int startY, int dy, int duration) {
		scroller.startScroll(0, startY, 0, dy, duration);
		invalidate();// 重绘界面
	}

	/** 滑动的核心方法,在此处理滑动相关的操作 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		int action = event.getAction();
		switch (action) {
		case MotionEvent.ACTION_DOWN:
			downY = (int) event.getY();
			return true;
		case MotionEvent.ACTION_MOVE:
			currentY = (int) event.getY();
			distanceY = currentY - downY;
			if (isTop) {
				if (distanceY > 0) {// 只准下滑
					scrollTo(0, -distanceY + screenHeigh - margin);
				}
			} else {
				if (distanceY < 0) {// 只准上滑
					scrollTo(0, -distanceY + margin);
				}
			}
			break;
		case MotionEvent.ACTION_UP:
			currentY = (int) event.getY();
			distanceY = currentY - downY;
			if (!isTop) {
				if (-distanceY > screenHeigh / 3) {
					// 向上滑
					startScroll(this.getScrollY(),
							screenHeigh - this.getScrollY() - margin, time);
					isTop = true;
				} else {
					// 向下滑
					startScroll(this.getScrollY(), -this.getScrollY() + margin, time);
				}
			} else {
				if (distanceY > screenHeigh / 3) {
					// 向下滑
					startScroll(this.getScrollY(), -this.getScrollY() + margin, time);
					isTop = false;
				} else {
					// 向上滑
					startScroll(this.getScrollY(),screenHeigh - this.getScrollY() - margin, time);
				}
			}
			break;
		}
		return super.onTouchEvent(event);
	}
	@Override
	public void computeScroll() {
		// 在View中有scrollTo和scrollBy方法,这两个方法其实是一样的,只是scrollTo是直接滑动到制定的位置,而scrollBy是滑动相对的距离
		// 在调用startScroll之后一定要调用invalidate,invalidate调用computeScroll,
		//然后computeScroll又调用invalidate,这样循环产生了滑动效果
		// 先判断mScroller滚动是否完成
		if (scroller.computeScrollOffset()) {
			// 这里调用View的scrollTo()完成实际的滚动
			scrollTo(scroller.getCurrX(), scroller.getCurrY());
			// 必须调用该方法,否则不一定能看到滚动效果
			postInvalidate();// 使用postInvalidate可以直接在线程中更新界面
		}else {
			// 滑动结束,此做滑动停止后的相关操作
			if( isTop ) {
				this.setVisibility(View.GONE);
			}
		}
	}
}
参考打码: http://download.csdn.net/detail/duduhali/9425960

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值