Advertisement
Guest User

Untitled

a guest
Aug 25th, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.74 KB | None | 0 0
  1. package com.example.byhieg.viewpratice;
  2.  
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.util.Log;
  6. import android.view.MotionEvent;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.LinearLayout;
  10. import android.widget.Scroller;
  11.  
  12. /**
  13. * Created by shiqifeng on 2016/8/25.
  14. * Mail:byhieg@gmail.com
  15. */
  16. public class MyViewPager extends ViewGroup{
  17.  
  18. private Scroller mScroller;
  19. private int lastX;
  20. private int mStart, mEnd;
  21. private int mScreenWidth;
  22.  
  23. public MyViewPager(Context context) {
  24. super(context);
  25. init(context);
  26. }
  27.  
  28. public MyViewPager(Context context, AttributeSet attrs) {
  29. super(context, attrs);
  30. init(context);
  31. }
  32.  
  33. public MyViewPager(Context context, AttributeSet attrs, int defStyleAttr) {
  34. super(context, attrs, defStyleAttr);
  35. init(context);
  36. }
  37.  
  38.  
  39. private void init(Context context) {
  40. mScroller = new Scroller(context);
  41. LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
  42. LinearLayout l1 = new LinearLayout(context);
  43. l1.setLayoutParams(lp);
  44. l1.setBackgroundColor(context.getResources().getColor(android.R.color.holo_orange_dark));
  45. LinearLayout l2 = new LinearLayout(context);
  46. l2.setLayoutParams(lp);
  47. l2.setBackgroundColor(context.getResources().getColor(android.R.color.holo_blue_dark));
  48. LinearLayout l3 = new LinearLayout(context);
  49. l3.setLayoutParams(lp);
  50. l3.setBackgroundColor(context.getResources().getColor(android.R.color.holo_green_dark));
  51. addView(l1);
  52. addView(l2);
  53. addView(l3);
  54. }
  55.  
  56. @Override
  57. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  58. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  59. measureChildren(widthMeasureSpec, heightMeasureSpec);
  60.  
  61. }
  62.  
  63. @Override
  64. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  65. int width = 0;
  66. int childCount = getChildCount();
  67. for(int i = 0 ; i < childCount; i++) {
  68. View child = getChildAt(i);
  69. child.layout(width,0,width + child.getMeasuredWidth(),child.getMeasuredHeight());
  70. width += child.getMeasuredWidth();
  71. mScreenWidth = child.getMeasuredWidth();
  72. }
  73. }
  74.  
  75. @Override
  76. public boolean onTouchEvent(MotionEvent event) {
  77. int x = (int)event.getX();
  78. switch (event.getAction()) {
  79. case MotionEvent.ACTION_DOWN:
  80. //记录下起时点的位置
  81. mStart = getScrollX();
  82. //滑动结束,停止动画
  83. if (mScroller.isFinished()) {
  84. mScroller.abortAnimation();
  85. }
  86. //记录位置
  87. lastX = x;
  88. break;
  89. case MotionEvent.ACTION_MOVE:
  90. int deltaX = lastX - x;
  91. Log.e("deltaX", deltaX + "");
  92. if (isMove(deltaX)) {
  93. //在滑动范围内,允许滑动
  94. scrollBy(deltaX, 0);
  95. }
  96. Log.e("getScrollX", getScrollX() + "");
  97. lastX = x;
  98. break;
  99. case MotionEvent.ACTION_UP:
  100. //判断滑动的距离
  101. int dScrollX = checkAlignment();
  102. //弹性滑动开启
  103. if(dScrollX > 0){//从左向右滑动
  104. if (dScrollX < mScreenWidth / 2) {
  105. Log.e("dScrollX", dScrollX + "");
  106. mScroller.startScroll(getScrollX(),0,- dScrollX,0,500);
  107. // scrollBy(-dScrollX,0);
  108. }else {
  109. mScroller.startScroll(getScrollX(),0,mScreenWidth - dScrollX,0,500);
  110. // scrollBy(mScreenWidth - dScrollX,0);
  111. }
  112. }else {//从右向左滑动
  113. if (-dScrollX < mScreenWidth / 2) {
  114. mScroller.startScroll(getScrollX(),0, - dScrollX,0,500);
  115. // scrollBy(-dScrollX,0);
  116. }else{
  117. mScroller.startScroll(getScrollX(),0,-mScreenWidth - dScrollX,0,500);
  118. // scrollBy(-mScreenWidth - dScrollX,0);
  119. }
  120. }
  121. break;
  122. }
  123. //重绘
  124. invalidate();
  125. return true;
  126. }
  127.  
  128. private boolean isMove(int deltaX){
  129. int scrollX = getScrollX();
  130. //滑动到第一屏,不能在向右滑动了
  131. if (deltaX < 0) {//从左向右滑动
  132. if (scrollX <= 0) {
  133. return false;
  134. } else if (deltaX + scrollX < 0) {
  135. scrollTo(0,0);
  136. return false;
  137. }
  138. }
  139. //滑动到最后一屏,不能在向左滑动
  140. int leftX = (getChildCount() - 1) * getWidth();
  141. if (deltaX > 0) {
  142. if (scrollX >= leftX) {
  143. return false;
  144. } else if (scrollX + deltaX > leftX) {
  145. scrollTo(leftX, 0);
  146. return false;
  147. }
  148. }
  149. return true;
  150. }
  151.  
  152. @Override
  153. public void computeScroll() {
  154. super.computeScroll();
  155. if (mScroller.computeScrollOffset()) {
  156. scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
  157. invalidate();
  158. }
  159. }
  160.  
  161. private int checkAlignment(){
  162. //判断滑动的趋势,是向左还是向右,滑动的偏移量是多少
  163. mEnd = getScrollX();
  164. boolean isUp = ((mEnd - mStart) > 0);
  165. int lastPrev = mEnd % mScreenWidth;
  166. int lastNext = mScreenWidth - lastPrev;
  167. if (isUp) {
  168. return lastPrev;
  169. }else{
  170. return -lastNext;
  171. }
  172. }
  173.  
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement