积累系统性知识
积聚技术精华
  首页    个人中心    撰写积文    建立课题    订立目标    整理积文    管理课题    管理目标    技能Get    代码积累 
Workspace界面模拟
error997 (error997)    2015-05-10 19:11:13      目标    课题
   >模拟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();  
    }  
      
    @Override  
    protected 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);  
    }  
  
    @Override  
    protected 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();  
            }  
        }  
    }  
      
    @Override  
    public 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;  
    }  
      
    @Override  
    public 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);  
    }  
      
  
    @Override  
    public 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);  
    }  
      
}


   /**
 *    @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();
   }
   
   @Override
   protected 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);
   }

   @Override
   protected 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();
         }
      }
   }
   
   @Override
   public 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;
   }
   
   @Override
   public 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);
   }
   

   @Override
   public 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);
   }
   
}

转自 http://blog.csdn.net/qq285016127/article/details/40654661
(+0)技能Get

建议楼主:搜索关键字 |参考其他资源 |回复 |追问
  error997(error997):   个人中心    课题    目标    代码积累