Workspace界面模拟

来源:互联网 发布:宁波每日成交数据 编辑:程序博客网 时间:2024/04/26 15:57

>模拟WorkSpace界面的实现代码

>>onMeasure onLayout初始化界面

>>onInterceptTouchEvent() onTouchEvent()实现左右滑动

/** * @author Lean  @date:2014-10-30   */public class MyScrollLayout extends ViewGroup{private static final int TOUCH_STATE_SCROLLING = 0;private static final int TOUCH_STATE_REST = 1;private static final int SNAP_VELOCITY = 700;private Scroller mScroller;private int mTouchSlop;private int mTouchState;private VelocityTracker mVelocityTracker;private float mDownX;private int mCurrenScreen;public MyScrollLayout(Context context, AttributeSet attrs) {super(context, attrs);mScroller=new Scroller(context);mTouchSlop=ViewConfiguration.get(context).getScaledTouchSlop();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int widthMode=MeasureSpec.getMode(widthMeasureSpec);int heightMode=MeasureSpec.getMode(heightMeasureSpec);if (widthMode!=MeasureSpec.EXACTLY||heightMode!=MeasureSpec.EXACTLY) {throw new IllegalStateException("you must improve a exacty child view !");}int width=MeasureSpec.getSize(widthMeasureSpec);final int childCount=getChildCount();for (int i = 0; i <childCount; i++) {getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);}scrollTo(mCurrenScreen*width, 0);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {if (changed) {int childLeft=0;final int childCount=getChildCount();for (int i = 0; i < childCount; i++) {View childView=getChildAt(i);getChildAt(i).layout(childLeft, 0, childLeft+getWidth(),childView.getMeasuredHeight());childLeft+=getWidth();}}}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {int action=ev.getAction();if (action==MotionEvent.ACTION_MOVE&&(mTouchState!=TOUCH_STATE_REST)) {return true;}switch (action) {case MotionEvent.ACTION_DOWN:mDownX=ev.getRawX();mTouchState=mScroller.isFinished()?TOUCH_STATE_REST:TOUCH_STATE_SCROLLING;break;case MotionEvent.ACTION_MOVE:float deltaX=Math.abs(mDownX-ev.getRawX());if (mTouchSlop<deltaX) {mTouchState=TOUCH_STATE_SCROLLING;}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:mTouchState=TOUCH_STATE_REST;break;default:break;}return mTouchState!=TOUCH_STATE_REST;}@Overridepublic boolean onTouchEvent(MotionEvent event) {createVelocity(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (!mScroller.isFinished()) {mScroller.abortAnimation();}mDownX=event.getRawX();break;case MotionEvent.ACTION_MOVE:int deltaX=(int) (mDownX-event.getRawX());mDownX=event.getRawX();scrollBy(deltaX, 0);break;case MotionEvent.ACTION_UP:mVelocityTracker.computeCurrentVelocity(1000);int velocityX=(int) mVelocityTracker.getXVelocity();if (velocityX>SNAP_VELOCITY&&mCurrenScreen>0) {snapToScreen(mCurrenScreen-1);}else if (velocityX<-SNAP_VELOCITY&&mCurrenScreen<getChildCount()-1) {snapToScreen(mCurrenScreen+1);}else {snapToDestination();}recycleVelocity();mTouchState=TOUCH_STATE_REST;break;case MotionEvent.ACTION_CANCEL:mTouchState=TOUCH_STATE_REST;break;default:break;}return true;}private void snapToScreen(int whichScreen) {whichScreen=Math.max(0, Math.min(whichScreen,getChildCount()-1));if (getScrollX()!=(whichScreen*getWidth())) {int deltaX=whichScreen*getWidth()-getScrollX();mScroller.startScroll(getScrollX(),0, deltaX, 0,Math.abs(deltaX)*2);mCurrenScreen=whichScreen;invalidate();}}private void snapToDestination() {int whichScreen=(getScrollX()+getWidth()/2)/getWidth();snapToScreen(whichScreen);}@Overridepublic void computeScroll() {if (mScroller.computeScrollOffset()) {scrollTo(mScroller.getCurrX(),mScroller.getCurrY());invalidate();}}private void recycleVelocity() {if (mVelocityTracker!=null) {mVelocityTracker.recycle();mVelocityTracker=null;}}private void createVelocity(MotionEvent event) {if (mVelocityTracker==null) {mVelocityTracker=VelocityTracker.obtain();}mVelocityTracker.addMovement(event);}}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 四个月宝宝不吃奶瓶怎么办 四个月宝宝不吃奶粉怎么办 婴儿三四天不大便怎么办 婴儿几天不拉大便怎么办 新生儿6天不拉屎怎么办 孩子10天不大便怎么办 宝宝5天没拉屎怎么办 小孩4-5天不大便怎么办 三个月宝宝睡前哭闹厉害怎么办 新生儿抱着睡放下就醒怎么办 宝宝大运动发育迟缓怎么办 八个月宝宝不会爬怎么办 宝宝竖着抱早了怎么办 孕妇吃的水果少怎么办 6个月宝宝厌奶怎么办 5个月宝宝厌奶怎么办 11个月宝宝厌奶怎么办 母乳宝宝不喝奶粉怎么办 换奶粉不拉大便怎么办 宝宝和妈妈不亲怎么办 冬天榨果汁太凉怎么办 四个月宝宝拉水怎么办 婴儿吃奶吃撑了怎么办 1岁的宝宝腹泻怎么办 一岁宝宝老拉肚子怎么办 一岁宝宝拉肚子怎么办啊 小孩发烧怎么办39度要吃消炎药吗 孩子不爱吃水果蔬菜怎么办 一岁宝宝不吃水果怎么办 一岁宝宝不爱吃水果怎么办 1岁多宝宝不吃水果怎么办 中学生不爱与家长交流怎么办 孩子一直37度多怎么办 小孩39度3算高烧怎么办 7岁发烧怎么办如何退烧 7岁反复发烧7天怎么办 一岁发烧39.8度怎么办 反复发烧39度4天怎么办 大人发烧到39度怎么办 小孩高烧39度多怎么办 孩子嗓子发炎发烧怎么办吃什么药