重写viewgroup现实上下view滑动(修改版)

寒假编写app时用到了上下view的切换,故把之前的代码优化了下,当然我的水平还是很有限的,在编写之前弄懂了安卓的事件机制,费了不少功夫,还好在自己实践后就很好理解了

安卓的事件是:分为分发事件和处理事件,事件是往上分发的(即向子view分发)处理事件时往下"滚"的,我的表达能力有限,如果您对安卓事件感兴趣的话就百度一下吧,有很多的优秀的博客的,那么我就根据我的理解来"优化"我之前的代码把

package com.java.zh_app.myviews;

import com.java.zh_app.HomeMain;
import com.java.zh_app.HomeMain.MsgViewOpen;

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

public class MyTwoListViewVg extends ViewGroup {
	private Scroller scroller;

	private final static int CanSlideViewDP = 50;
	private final static int firstview = 1, secondview = 2;
	private static int View_height = 0;

	private static int View_width = 0;
	private static float y_beginTragView = 0;
	private OnViewChangeListener mOpenTopListener;
	private static boolean trag_topview, trag_downview;
	private static int tragingview = 0, currview = 2;

	// 初始化为显示第二个view
	private void Init_paras(Context context) {
		scroller = new Scroller(context);
		y_beginTragView = 0;
		trag_topview = false;
		trag_downview = false;
		tragingview = 0;
		currview = 2;
		//当homeMain出现msgview时要及时把topview拉下来
		HomeMain.setOnMsgViewOpenLis(new MsgViewOpen() {
			@Override
			public void MsgViewOpenLis() {
				if(currview==1)setTopMenuClose();
			}
		});
	}

	public MyTwoListViewVg(Context context) {
		super(context);
		Init_paras(context);
	}

	public MyTwoListViewVg(Context context, AttributeSet attrs) {
		super(context, attrs);
		Init_paras(context);
	}

	public MyTwoListViewVg(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		Init_paras(context);
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		int viewCount = getChildCount();
		for (int count = 0; count < viewCount; count++) {
			View child = getChildAt(count);
			int height = child.getMeasuredHeight();
			int width = child.getMeasuredWidth();
			child.layout(0, 0, width, height);
		}
		// 初始化后获取view的高度
		View_height = getHeight();// height = child.getMeasuredHeight();
		View_width = getWidth();// width = child.getMeasuredWidth();

	}

	public void setContent(View v) {
		this.addView(v);
	}

	public void setfresh_view(View v) {
		this.addView(v);
	}

	@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 void computeScroll() {
		if (scroller.computeScrollOffset()) {
			getChildAt(secondview - 1).layout(0, scroller.getCurrY(),
					View_width, scroller.getCurrY() + View_height);
			getChildAt(firstview - 1).layout(0,
					-View_height + scroller.getCurrY(), View_width,
					scroller.getCurrY());
			postInvalidate();
		}
		super.computeScroll();
	}

	// 拖动view事件
	public void TragingView(float y_start, float y_distance) {
		scroller.startScroll(0, (int) y_start, 0, (int) y_distance);
		invalidate();
	}

	public void OpenTopView(float currN) {
		scroller.startScroll(0, (int) currN, 0, View_height - (int) currN);
		invalidate();
		if(mOpenTopListener!=null){
			mOpenTopListener.onChanged();
		}
	}

	public void CloseTopView(float currN) {
		scroller.startScroll(0, (int) currN, 0, (int) -currN);
		invalidate();
	}

	public void OpenDownView(float currN) {
		scroller.startScroll(0, (int) currN, 0, -(int) currN);
		invalidate();
	}

	public void CloseDownView(float currN) {
		scroller.startScroll(0, (int) currN, 0, View_height - (int) currN);
		invalidate();
	}
	public void setTopMenuClose(){
		CloseTopView(this.getHeight());
		currview = secondview;
		invalidate();
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		super.onTouchEvent(event);
		Log.i("OnTouch", "--->>>onTouchEvent" + event.getAction());
		switch (event.getAction()) {
		case MotionEvent.ACTION_MOVE:
			if (trag_topview) {
				y_beginTragView = event.getY();
				TragingView(y_beginTragView, 2);// 下滑动
				tragingview = 1;
			} else if (trag_downview) {
				y_beginTragView = event.getY();
				TragingView(y_beginTragView, -2);// 上滑动
				tragingview = 2;
			}

			break;
		case MotionEvent.ACTION_UP:
			if (tragingview == 1 && (event.getY() < View_height / 2)) {
				CloseTopView(event.getY());
				Log.i("msg", "---/CloseTop");
				currview = secondview;
			} else if (tragingview == 1 && event.getY() > View_height / 2) {
				OpenTopView(event.getY());
				Log.i("msg", "---/ShowTop");
				currview = firstview;
			} else if (tragingview == 2 && (event.getY() < View_height / 2)) {
				OpenDownView(event.getY());
				Log.i("msg", "---/ShowDown");
				currview = secondview;
			} else if (tragingview == 2 && (event.getY() > View_height / 2)) {
				CloseDownView(event.getY());
				Log.i("msg", "---/CloseDown");
				currview = firstview;
			}
			tragingview = 0;
			break;// 处理完
		default:
			break;
		}
		return true;
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent event) {
		super.onInterceptTouchEvent(event);
		// 处理分给子view的范围
		if (currview == secondview && (event.getY() < CanSlideViewDP)) {
			Log.i("trag", "--->>top");
			trag_topview = true;
			trag_downview = false;
			return true;
		} else if (currview == firstview
				&& event.getY() > (View_height - CanSlideViewDP)) {
			Log.i("trag", "--->>down");
			trag_downview = true;
			trag_topview = false;
			return true;

		} else {
			// 其他事件交给ziview
			trag_downview = false;
			trag_topview = false;
			return false;
		}
	}

	public void setOpenTopLis(OnViewChangeListener lis) {
		this.mOpenTopListener = lis;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值