歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android教程:高仿launcher和墨跡左右拖動效果

Android教程:高仿launcher和墨跡左右拖動效果

日期:2017/3/1 10:25:57   编辑:Linux編程

有這樣的想法,做出一個模仿launcher的效果。自己也曾從網上搜過很多資料,也思考過怎麼實現,最終還是參考了別人的資料實現了此效果,也解決了我這半個多月的冥思苦想,再次感謝,今天把代碼貼出來供大家學習,因為這方面做得比較好的資料缺失比較少(因為本人搜了很多資料都不能達到效果),如果大家覺得還不錯,請頂起。

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

首先自定義一個 ViewGroup:

  1. public class MyScrollLayout extends ViewGroup{
  2. private VelocityTracker mVelocityTracker; // 用於判斷甩動手勢
  3. private static final int SNAP_VELOCITY = 600;
  4. private Scroller mScroller; // 滑動控制器
  5. private int mCurScreen;
  6. private int mDefaultScreen = 0;
  7. private float mLastMotionX;
  8. // private int mTouchSlop;
  9. private OnViewChangeListener mOnViewChangeListener;
  10. public MyScrollLayout(Context context) {
  11. super(context);
  12. // TODO Auto-generated constructor stub
  13. init(context);
  14. }
  15. public MyScrollLayout(Context context, AttributeSet attrs) {
  16. super(context, attrs);
  17. // TODO Auto-generated constructor stub
  18. init(context);
  19. }
  20. public MyScrollLayout(Context context, AttributeSet attrs, int defStyle) {
  21. super(context, attrs, defStyle);
  22. // TODO Auto-generated constructor stub
  23. init(context);
  24. }
  25. private void init(Context context)
  26. {
  27. mCurScreen = mDefaultScreen;
  28. // mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
  29. mScroller = new Scroller(context);
  30. }
  31. @Override
  32. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  33. // TODO Auto-generated method stub
  34. if (changed) {
  35. int childLeft = 0;
  36. final int childCount = getChildCount();
  37. for (int i=0; i<childCount; i++) {
  38. final View childView = getChildAt(i);
  39. if (childView.getVisibility() != View.GONE) {
  40. final int childWidth = childView.getMeasuredWidth();
  41. childView.layout(childLeft, 0,
  42. childLeft+childWidth, childView.getMeasuredHeight());
  43. childLeft += childWidth;
  44. }
  45. }
  46. }
  47. }
  48. @Override
  49. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  50. // TODO Auto-generated method stub
  51. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  52. final int width = MeasureSpec.getSize(widthMeasureSpec);
  53. final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
  54. final int count = getChildCount();
  55. for (int i = 0; i < count; i++) {
  56. getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
  57. }
  58. scrollTo(mCurScreen * width, 0);
  59. }
  60. public void snapToDestination() {
  61. final int screenWidth = getWidth();
  62. final int destScreen = (getScrollX()+ screenWidth/2)/screenWidth;
  63. snapToScreen(destScreen);
  64. }
  65. public void snapToScreen(int whichScreen) {
  66. // get the valid layout page
  67. whichScreen = Math.max(0, Math.min(whichScreen, getChildCount()-1));
  68. if (getScrollX() != (whichScreen*getWidth())) {
  69. final int delta = whichScreen*getWidth()-getScrollX();
  70. mScroller.startScroll(getScrollX(), 0,
  71. delta, 0, Math.abs(delta)*2);
  72. mCurScreen = whichScreen;
  73. invalidate(); // Redraw the layout
  74. if (mOnViewChangeListener != null)
  75. {
  76. mOnViewChangeListener.OnViewChange(mCurScreen);
  77. }
  78. }
  79. }
  80. @Override
  81. public void computeScroll() {
  82. // TODO Auto-generated method stub
  83. if (mScroller.computeScrollOffset()) {
  84. scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
  85. postInvalidate();
  86. }
  87. }
  88. @Override
  89. public boolean onTouchEvent(MotionEvent event) {
  90. // TODO Auto-generated method stub
  91. final int action = event.getAction();
  92. final float x = event.getX();
  93. final float y = event.getY();
  94. switch (action) {
  95. case MotionEvent.ACTION_DOWN:
  96. Log.i("", "onTouchEvent ACTION_DOWN");
  97. if (mVelocityTracker == null) {
  98. mVelocityTracker = VelocityTracker.obtain();
  99. mVelocityTracker.addMovement(event);
  100. }
  101. if (!mScroller.isFinished()){
  102. mScroller.abortAnimation();
  103. }
  104. mLastMotionX = x;
  105. break;
  106. case MotionEvent.ACTION_MOVE:
  107. int deltaX = (int)(mLastMotionX - x);
  108. if (IsCanMove(deltaX))
  109. {
  110. if (mVelocityTracker != null)
  111. {
  112. mVelocityTracker.addMovement(event);
  113. }
  114. mLastMotionX = x;
  115. scrollBy(deltaX, 0);
  116. }
  117. break;
  118. case MotionEvent.ACTION_UP:
  119. int velocityX = 0;
  120. if (mVelocityTracker != null)
  121. {
  122. mVelocityTracker.addMovement(event);
  123. mVelocityTracker.computeCurrentVelocity(1000);
  124. velocityX = (int) mVelocityTracker.getXVelocity();
  125. }
  126. if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {
  127. // Fling enough to move left
  128. snapToScreen(mCurScreen - 1);
  129. } else if (velocityX < -SNAP_VELOCITY
  130. && mCurScreen < getChildCount() - 1) {
  131. // Fling enough to move right
  132. snapToScreen(mCurScreen + 1);
  133. } else {
  134. snapToDestination();
  135. }
  136. if (mVelocityTracker != null) {
  137. mVelocityTracker.recycle();
  138. mVelocityTracker = null;
  139. }
  140. // mTouchState = TOUCH_STATE_REST;
  141. break;
  142. }
  143. return true;
  144. }
  145. private boolean IsCanMove(int deltaX)
  146. {
  147. if (getScrollX() <= 0 && deltaX < 0 ){
  148. return false;
  149. }
  150. if (getScrollX() >= (getChildCount() - 1) * getWidth() && deltaX > 0){
  151. return false;
  152. }
  153. return true;
  154. }
  155. public void SetOnViewChangeListener(OnViewChangeListener listener)
  156. {
  157. mOnViewChangeListener = listener;
  158. }
  159. }
Copyright © Linux教程網 All Rights Reserved