实现效果图
新建一个MainUI类 ,代码如下
public class MainUI extends RelativeLayout {
private Context context;
private FrameLayout leftMenu;
private FrameLayout middleMenu;
private FrameLayout rightMenu;
private Scroller scroller;
public MainUI(Context context) {
super(context);
intView(context);
}
public MainUI(Context context, Attributes attributes) {
super(context, (AttributeSet) attributes);
intView(context);
}
private void intView(Context context) {
this.context = context;
scroller = new Scroller(context,new DecelerateInterpolator());
leftMenu = new FrameLayout(context);
middleMenu = new FrameLayout(context);
rightMenu = new FrameLayout(context);
leftMenu.setBackgroundColor(Color.RED);
middleMenu.setBackgroundColor(Color.GREEN);
rightMenu.setBackgroundColor(Color.RED);
addView(leftMenu);
addView(middleMenu);
addView(rightMenu);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
middleMenu.measure(widthMeasureSpec,heightMeasureSpec);
int realWidth = MeasureSpec.getSize(widthMeasureSpec);
int tempWidthMeasure = MeasureSpec.makeMeasureSpec((int) (realWidth*0.8f),
MeasureSpec.EXACTLY);
leftMenu.measure(tempWidthMeasure,heightMeasureSpec);
rightMenu.measure(tempWidthMeasure,heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
middleMenu.layout(l, t, r, b);
leftMenu.layout(l-leftMenu.getMeasuredWidth(),t,r,b);
rightMenu.layout(l+middleMenu.getMeasuredWidth(),t,
l+middleMenu.getMeasuredWidth()+rightMenu.getMeasuredWidth(),b);
}
private boolean isTestCompete;
private boolean isleftrightEvent;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (!isTestCompete) {
getEventType(ev);
return true;
}
if (isleftrightEvent) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_MOVE:
int curScrollX = getScrollX(); //滚动距离
int dis_x = (int) (ev.getX() - point.x); //滑动距离
int expectX = -dis_x + curScrollX;
int finalX = 0;
if (expectX <0 ) { //向左滚动
finalX = Math.max(expectX,-leftMenu.getMeasuredWidth());
} else { //向右滚动
finalX = Math.min(expectX,rightMenu.getMeasuredWidth());
}
scrollTo(finalX,0);
point.x = (int) ev.getX();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
curScrollX = getScrollX();
if (Math.abs(curScrollX) > leftMenu.getMeasuredWidth() >> 1) {
if (curScrollX < 0) {
scroller.startScroll(curScrollX,0,
-leftMenu.getMeasuredWidth()-curScrollX,0,200);
} else {
scroller.startScroll(curScrollX,0,
leftMenu.getMeasuredWidth()-curScrollX,0,200);
}
} else {
scroller.startScroll(curScrollX,0,-curScrollX,0,200);
}
invalidate();
isleftrightEvent = false;
isTestCompete = false;
break;
}
} else {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_UP:
isleftrightEvent = false;
isTestCompete = false;
break;
default:
break;
}
}
return super.dispatchTouchEvent(ev);
}
@Override
public void computeScroll() {
super.computeScroll();
if (!scroller.computeScrollOffset()) {
return;
}
int tempX = scroller.getCurrX();
scrollTo(tempX,0);
}
private Point point = new Point();
private static final int TEST_DIS = 20;
private void getEventType(MotionEvent ev) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
point.x = (int) ev.getX();
point.y = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
int dX = Math.abs((int) ev.getX() - point.x);
int dY = Math.abs((int) ev.getY() - point.y);
if (dX >= TEST_DIS && dX>dY ) { //左滑动
isleftrightEvent = true;
isTestCompete = true;
point.x = (int) ev.getX();
point.y = (int) ev.getY();
} else if (dY >= TEST_DIS && dY>dX) { //右滑动
isleftrightEvent = false;
isTestCompete = true;
point.x = (int) ev.getX();
point.y = (int) ev.getY();
}
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_CANCEL:
break;
}
}
}
修改MainActivity中代码:
public class MainActivity extends AppCompatActivity {
private MainUI mainUI;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mainUI = new MainUI(this);
setContentView(mainUI);
}
}