这段代码是具有以前写过的代码修改的(其实是全部更改了,不过思路是一样的),更多的解析在我的那篇上下滑动view里,原理都是一样的
package com.java.zh_app.myviews;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller;
import com.java.zh_app.R;
public class MyLRSlideViewGroup extends ViewGroup {
private Scroller scroller;
private final static int canTragviewDp = 60;
private static int curr_view = 2, can_tragview = 0;
private void Int_paras(Context context) {
scroller = new Scroller(context);
setBackgroundColor(context.getResources().getColor(R.color.app_orange_shallow_color));
curr_view = 2;
can_tragview = 0;
}
public MyLRSlideViewGroup(Context context) {
super(context);
Int_paras(context);
}
public MyLRSlideViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
Int_paras(context);
}
public MyLRSlideViewGroup(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
Int_paras(context);
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
getChildAt(1).layout(scroller.getCurrX(), 0,
scroller.getCurrX() + (getChildAt(1).getWidth()),
getHeight());
getChildAt(0).layout(
scroller.getCurrX() - (getChildAt(1).getWidth()), 0,
scroller.getCurrX(), getHeight());
postInvalidate();
}
super.computeScroll();
}
@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 wdith = child.getMeasuredWidth();
child.layout(0, 0, wdith, height);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
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);
}
}
public void ShowMenu(float currN, int dis) {
scroller.startScroll((int) currN, 0, dis, 0);
invalidate();
}
public void OpenMenu(float currN, float currX) {
scroller.startScroll((int) currN, 0,
(getWidth() - (int) currN), 0);
invalidate();
}
public void CloseMenu(float currN, float currX) {
scroller.startScroll((int) currN, 0, -(int) currN, 0);
invalidate();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
super.dispatchTouchEvent(ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
if (can_tragview == 1) {
ShowMenu(ev.getX(), 2);
} else if (can_tragview == 2) {
ShowMenu(ev.getX(), -2);
}
break;
case MotionEvent.ACTION_UP:
if (can_tragview != 0 && ev.getX() < getWidth() / 2) {
CloseMenu(getX(), 0);
can_tragview = 2;
curr_view = 2;
} else if (can_tragview != 0 && ev.getX() >= getWidth() / 2) {
OpenMenu(ev.getX(), 0);
can_tragview = 1;
curr_view = 1;
}
break;
default:
break;
}
return true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
super.onInterceptTouchEvent(ev);
if (ev.getX() < canTragviewDp && curr_view == 2) {
can_tragview = 1;
return true;
} else if (ev.getX() > (getWidth() - canTragviewDp) && curr_view == 1) {
can_tragview = 2;
return true;
} else {
can_tragview = 0;
}
return false;
}
}