目录
上几次使用layout直接slide的,这次使用scrollto
关键源码
/**
*
*/
package com.zk.demo6.slideutil;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Scroller;
public class BOXContent extends ViewGroup implements SlideInter {
private Scroller scroller;
private final static String Tag = "BOXContent";
private static int screenWidth = 0;
private static int screenHeight = 0;
private int OpenSlideDis = 0;
private VelocityTracker vTracker;
public BOXContent(Context context) {
super(context);
init();
}
public BOXContent(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public BOXContent(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public void init() {
scroller = new Scroller(getContext());
}
// 通过onLayout正常的长满屏幕
// 我们只是简单的把view沾满屏幕,如果实
// 现多个view的布局的话还是相当麻烦的!
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int viewcount = getChildCount();
View child = null;
for (int count = 0; count < viewcount; count++) {
child = getChildAt(count);
if (child.getVisibility() != GONE) {
child.layout(l, t, r, b);
}
}
// 屏幕的大小
screenWidth = getWidth();
screenHeight = getHeight();
}
// 通过measure让view正常的长满屏幕
// 我们只是简单的把view沾满屏幕,如果实
// 现多个view的布局的话还是相当麻烦的!
// 将view根据测量测度设置measure
// 不用该onMeasure方法还是可以的
// 不过在onlayout时就会不正常,自
// 已试一试在该view布局一个Button
// (带text的,就知道了,具体得深入理解UI的布局)
@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 boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
if (ev.getX() < SlideAction.startXTrag && !SlideAction.isOnTraging
&& !SlideAction.menuOpen) {
TargBegState();
addVTracker(ev);
} else if (ev.getX() > SlideAction.MenuWidth
&& !SlideAction.isOnTraging && SlideAction.menuOpen) {
TragEndState();
addVTracker(ev);
}
break;
case MotionEvent.ACTION_MOVE:
//Log.i(Tag,"the x velocity is "+vTracker.getXVelocity());
if (SlideAction.isOnTraging) {
vTracker.addMovement(ev);
vTracker.computeCurrentVelocity(1000);
// 消除缝隙
if (ClearGrap((int) ev.getX()))break;
//速度问题
/*if(vTracker.getXVelocity() > 4000){
Log.i(Tag,"InitOpenState");
//OpenSlideDis = screenWidth - (int) ev.getX() - (screenWidth - SlideAction.MenuWidth);
//onTraging(-(int) ev.getX(), -OpenSlideDis);
// 初始化open状态
InitOpenState();
break;
}else if(vTracker.getXVelocity() < -4000){
Log.i(Tag,"InitStarState");
//onTraging(-(int) ev.getX(), (int) ev.getX());
// 初始化开始状态
InitStarState();
break;
}*/
onTraging(-(int) ev.getX(), 2);
}
break;
case MotionEvent.ACTION_UP:
if (ev.getX() > SlideAction.MenuWidth
&& SlideAction.menuOpen == true) {
Log.i(Tag, "End....");
onTraging(-(int) SlideAction.MenuWidth,
(int) SlideAction.MenuWidth);
// 初始化开始状态
InitStarState();
} else if (SlideAction.isOnTraging
&& ev.getX() < SlideAction.MenuWidthHalf) {
onTraging(-(int) ev.getX(), (int) ev.getX());
// 初始化开始状态
InitStarState();
} else if (SlideAction.isOnTraging
&& ev.getX() > SlideAction.MenuWidthHalf) {
// 消除缝隙
if (ClearGrap((int) ev.getX()))
break;
OpenSlideDis = screenWidth - (int) ev.getX()
- (screenWidth - SlideAction.MenuWidth);
onTraging(-(int) ev.getX(), -OpenSlideDis);
// 初始化open状态
InitOpenState();
}
//回收
recyleVTracker(vTracker);
break;
case MotionEvent.ACTION_CANCEL:
recyleVTracker(vTracker);
break;
default:
break;
}
return super.onInterceptTouchEvent(ev);
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset() && !scroller.isFinished()) {
scrollTo(scroller.getCurrX(), 0);
postInvalidate();
}
}
@Override
public void TargBegState() {
SlideAction.isOnTraging = true;
}
@Override
public void TragEndState() {
SlideAction.isOnTraging = true;
}
@Override
public void onTraging(int curr, int dis) {
scroller.startScroll(curr, 0, dis, 0);
drawView();
}
@Override
public void InitOpenState() {
//getChildAt(0).layout(SlideAction.MenuWidth, 0, SlideAction.MenuWidth+screenWidth, screenHeight);
SlideAction.menuOpen = true;
SlideAction.isOnTraging = false;
}
@Override
public void InitStarState() {
SlideAction.menuOpen = false;
SlideAction.isOnTraging = false;
getChildAt(0).layout(0, 0, screenWidth, screenHeight);
drawView();
}
@Override
public void drawView() {
invalidate();
}
@Override
public boolean ClearGrap(int curr) {
if (curr > SlideAction.MenuWidth) {
return true;
}
return false;
}
@Override
public void addVTracker(MotionEvent ev) {
if (vTracker == null) {
vTracker = VelocityTracker.obtain();
} else {
vTracker.clear();
}
vTracker.addMovement(ev);
}
@Override
public void recyleVTracker(VelocityTracker ev) {
if(ev !=null){
ev.recycle();
}
}
}
下载自已学习