寒假编写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;
}
}