您的位置:首页 > 移动开发 > Android开发

简单的自定义View-仿SlideMenu

2016-09-17 14:31 295 查看
第一次写博客,文章中有什么问题的话,欢迎指教。

博客仿照实现SlideMenu的效果,实现侧边栏Menu的滑动。

public class MyScollerView extends ViewGroup {

/**

* 侧边栏

*/

private View mLeftMenu;

/**

* 主体部分

*/

private View mMainContent;

/**

* 处理滑动的Scroller

*/

private Scroller mScroller=new Scroller(getContext());

/**

* 处理速度

*/

private VelocityTracker mTracker;

public MyScollerView(Context context) {
super(context);
}

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

public MyScollerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mLeftMenu = getChildAt(0);
mMainContent = getChildAt(1);

mLeftMenu.measure(widthMeasureSpec, heightMeasureSpec);
mMainContent.measure(widthMeasureSpec, heightMeasureSpec);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
mLeftMenu.layout(-mLeftMenu.getLayoutParams().width, 0, 0, b);
mMainContent.layout(l, t, r, b);
}

private int mLastX;
private boolean isShowMenu;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if(!mScroller.isFinished()){
mScroller.abortAnimation();
return false;
}
if(mTracker==null){
mTracker=VelocityTracker.obtain();
}else{
mTracker.clear();
}
mTracker.addMovement(event);
mLastX= (int) event.getX();
break;
case MotionEvent.ACTION_MOVE:
mTracker.addMovement(event);
mTracker.computeCurrentVelocity(1000);
int currentX= (int) event.getX();
int dx=mLastX-currentX;
int scrollX=getScrollX()+dx;

//scroll表示View左边缘到View内容左边缘的距离
//内容往右移为负数
if(scrollX>0){
scrollTo(0,0);
}else if(scrollX<-getChildAt(0).getWidth()){
scrollTo(-getChildAt(0).getWidth(),0);
}else{
scrollBy(dx,0);
}
mLastX=currentX;
break;
case MotionEvent.ACTION_UP:
int upX=getScrollX();
int v= (int) mTracker.getXVelocity();
if(upX<-getChildAt(0).getWidth()/2){
isShowMenu=true;
}else{
isShowMenu=false;
}
if (v>800) {
isShowMenu=true;
}else if(v<-800){
isShowMenu=false;
}

translateScreen();
if(mTracker!=null){
mTracker.recycle();
mTracker=null;
}

break;
}
return true;
}

private void translateScreen() {
int startX=getScrollX();
int dx;
if(isShowMenu){
dx=-getChildAt(0).getWidth()-startX;
}else{
dx=0-startX;
}
mScroller.startScroll(startX,0,dx,0,500);
invalidate();
}

@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
}

/**
* 切换Menu状态
*/
public void switchScreen(){
isShowMenu=!isShowMenu;
translateScreen();
}

/**
* @return Menu是否正在显示
*/
public boolean getMenuState(){
return isShowMenu;
}


}

-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  博客 menu android