简单的自定义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;
}
-
博客仿照实现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; }
}
-
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories