Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 仿照Launcher的Workspace實現左右滑動切換(中)

仿照Launcher的Workspace實現左右滑動切換(中)

編輯:Android開發實例

ScrollLayout.xml文件  
  1. package com.teleca.robin;  
  2.  
  3.  
  4. import android.content.Context;  
  5. import android.util.AttributeSet;  
  6. import android.util.Log;  
  7. import android.view.MotionEvent;  
  8. import android.view.VelocityTracker;  
  9. import android.view.View;  
  10. import android.view.ViewConfiguration;  
  11. import android.view.ViewGroup;  
  12. import android.widget.Scroller;  
  13. /**  
  14.  *   
  15.  * 仿Launcher中的WorkSapce,可以左右滑動切換屏幕的類  
  16.  *   
  17.  * @author Yao.GUET  
  18.  *   
  19.  *         blog: http://blog.csdn.NET/Yao_GUET  
  20.  *   
  21.  *         date: 2011-05-04  
  22.  */ 
  23. public class ScrollLayout extends ViewGroup {  
  24. private static final String TAG = "ScrollLayout";  
  25. private Scroller mScroller;  
  26. private VelocityTracker mVelocityTracker;  
  27. private int mCurScreen;  
  28. private int mDefaultScreen = 0;  
  29. private static final int TOUCH_STATE_REST = 0;  
  30. private static final int TOUCH_STATE_SCROLLING = 1;  
  31. private static final int SNAP_VELOCITY = 600;  
  32. private int mTouchState = TOUCH_STATE_REST;  
  33. private int mTouchSlop;  
  34. private float mLastMotionX;  
  35. private float mLastMotionY;  
  36. public ScrollLayout(Context context, AttributeSet attrs) {  
  37. this(context, attrs, 0);  
  38. // TODO Auto-generated constructor stub  
  39. }  
  40. public ScrollLayout(Context context, AttributeSet attrs, int defStyle) {  
  41. super(context, attrs, defStyle);  
  42. // TODO Auto-generated constructor stub  
  43. mScroller = new Scroller(context);  
  44. mCurScreen = mDefaultScreen;  
  45. mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();  
  46. }  
  47. @Override 
  48. protected void onLayout(boolean changed, int l, int t, int r, int b) {  
  49. // TODO Auto-generated method stub  
  50. if (changed) {  
  51. int childLeft = 0;  
  52. final int childCount = getChildCount();  
  53. for (int i = 0; i < childCount; i++) {  
  54. final View childView = getChildAt(i);  
  55. if (childView.getVisibility() != View.GONE) {  
  56. final int childWidth = childView.getMeasuredWidth();  
  57. childView.layout(childLeft, 0,  
  58. childLeft + childWidth, childView.getMeasuredHeight());  
  59. childLeft += childWidth;  
  60. }  
  61. }  
  62.  
  63.  
  64. }  
  65. }  
  66. @Override 
  67. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  68. Log.e(TAG, "onMeasure");  
  69. super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  70. final int width = MeasureSpec.getSize(widthMeasureSpec);  
  71. final int widthMode = MeasureSpec.getMode(widthMeasureSpec);  
  72. if (widthMode != MeasureSpec.EXACTLY) {  
  73. throw new IllegalStateException(  
  74. "ScrollLayout only canmCurScreen run at EXACTLY mode!");  
  75. }  
  76. final int heightMode = MeasureSpec.getMode(heightMeasureSpec);  
  77. if (heightMode != MeasureSpec.EXACTLY) {  
  78. throw new IllegalStateException(  
  79. "ScrollLayout only can run at EXACTLY mode!");  
  80. }  
  81. // The children are given the same width and height as the scrollLayout  
  82. final int count = getChildCount();  
  83. for (int i = 0; i < count; i++) {  
  84. getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);  
  85. }  
  86. // Log.e(TAG, "moving to screen "+mCurScreen);  
  87. scrollTo(mCurScreen * width, 0);  
  88. }  
  89. /**  
  90. *   
  91. * According to the position of current layout  
  92. *   
  93. * scroll to the destination page.  
  94. */ 
  95. public void snapToDestination() {  
  96. final int screenWidth = getWidth();  
  97. final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth;  
  98. snapToScreen(destScreen);  
  99. }  
  100. public void snapToScreen(int whichScreen) {  
  101. // get the valid layout page  
  102. whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));  
  103. if (getScrollX() != (whichScreen * getWidth())) {  
  104. final int delta = whichScreen * getWidth() - getScrollX();  
  105. mScroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);  
  106. mCurScreen = whichScreen;  
  107. invalidate(); // Redraw the layout  
  108. }  
  109. }  
  110. public void setToScreen(int whichScreen) {  
  111. whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));  
  112. mCurScreen = whichScreen;  
  113. scrollTo(whichScreen * getWidth(), 0);  
  114. }  
  115. public int getCurScreen() {  
  116. return mCurScreen;  
  117. }  
  118. @Override 
  119. public void computeScroll() {  
  120. // TODO Auto-generated method stub  
  121. if (mScroller.computeScrollOffset()) {  
  122. scrollTo(mScroller.getCurrX(), mScroller.getCurrY());  
  123. postInvalidate();  
  124. }  
  125. }  
  126. @Override 
  127. public boolean onTouchEvent(MotionEvent event) {  
  128. // TODO Auto-generated method stub  
  129. if (mVelocityTracker == null) {  
  130. mVelocityTracker = VelocityTracker.obtain();  
  131. }  
  132. mVelocityTracker.addMovement(event);  
  133. final int action = event.getAction();  
  134. final float x = event.getX();  
  135. final float y = event.getY();  
  136. switch (action) {  
  137. case MotionEvent.ACTION_DOWN:  
  138. Log.e(TAG, "event down!");  
  139. if (!mScroller.isFinished()) {  
  140. mScroller.abortAnimation();  
  141. }  
  142. mLastMotionX = x;  
  143. break;  
  144. case MotionEvent.ACTION_MOVE:  
  145. int deltaX = (int) (mLastMotionX - x);  
  146. mLastMotionX = x;  
  147. scrollBy(deltaX, 0);  
  148. break;  
  149. case MotionEvent.ACTION_UP:  
  150. Log.e(TAG, "event : up");  
  151. // if (mTouchState == TOUCH_STATE_SCROLLING) {  
  152. final VelocityTracker velocityTracker = mVelocityTracker;  
  153. velocityTracker.computeCurrentVelocity(1000);  
  154. int velocityX = (int) velocityTracker.getXVelocity();  
  155. Log.e(TAG, "velocityX:" + velocityX);  
  156. if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {  
  157. // Fling enough to move left  
  158. Log.e(TAG, "snap left");  
  159. snapToScreen(mCurScreen - 1);  
  160. } else if (velocityX < -SNAP_VELOCITY  
  161. && mCurScreen < getChildCount() - 1) {  
  162. // Fling enough to move right  
  163. Log.e(TAG, "snap right");  
  164. snapToScreen(mCurScreen + 1);  
  165. } else {  
  166. snapToDestination();  
  167. }  
  168. if (mVelocityTracker != null) {  
  169. mVelocityTracker.recycle();  
  170. mVelocityTracker = null;  
  171. }  
  172. // }  
  173. mTouchState = TOUCH_STATE_REST;  
  174. break;  
  175. case MotionEvent.ACTION_CANCEL:  
  176. mTouchState = TOUCH_STATE_REST;  
  177. break;  
  178.  
  179.  
  180. }  
  181. return true;  
  182. }  
  183. @Override 
  184. public boolean onInterceptTouchEvent(MotionEvent ev) {  
  185. // TODO Auto-generated method stub  
  186. Log.e(TAG, "onInterceptTouchEvent-slop:" + mTouchSlop);  
  187. final int action = ev.getAction();  
  188. if ((action == MotionEvent.ACTION_MOVE) &&  
  189. (mTouchState != TOUCH_STATE_REST)) {  
  190. return true;  
  191. }  
  192. final float x = ev.getX();  
  193. final float y = ev.getY();  
  194. switch (action) {  
  195. case MotionEvent.ACTION_MOVE:  
  196. final int xDiff = (int) Math.abs(mLastMotionX - x);  
  197. if (xDiff > mTouchSlop) {  
  198. mTouchState = TOUCH_STATE_SCROLLING;  
  199. }  
  200. break;  
  201. case MotionEvent.ACTION_DOWN:  
  202. mLastMotionX = x;  
  203. mLastMotionY = y;  
  204. mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST  
  205. : TOUCH_STATE_SCROLLING;  
  206. break;  
  207. case MotionEvent.ACTION_CANCEL:  
  208.  
  209.  
  210. case MotionEvent.ACTION_UP:  
  211.  
  212.  
  213. mTouchState = TOUCH_STATE_REST;  
  214.  
  215.  
  216. break;  
  217.  
  218.  
  219. }  
  220. return mTouchState != TOUCH_STATE_REST;  
  221.  
  222.  
  223. }  
  224.  
  225.  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved