MainActivity

Java代码 复制代码 收藏代码
  1. package org.wp.activity;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.widget.ImageView;
  5. publicclass MainActivity extends Activity {
  6. private ImageScrollView imageScrollView = null;
  7. private PageControlView pageControlView = null;
  8. @Override
  9. publicvoid onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. imageScrollView = (ImageScrollView) this.findViewById(R.id.myImageScrollView);
  13. ImageView imageView = new ImageView(this);
  14. imageView.setImageResource(R.drawable.a1);
  15. imageScrollView.addView(imageView);
  16. imageView = new ImageView(this);
  17. imageView.setImageResource(R.drawable.a2);
  18. imageScrollView.addView(imageView);
  19. imageView = new ImageView(this);
  20. imageView.setImageResource(R.drawable.a3);
  21. imageScrollView.addView(imageView);
  22. imageView = new ImageView(this);
  23. imageView.setImageResource(R.drawable.a4);
  24. imageScrollView.addView(imageView);
  25. imageView = new ImageView(this);
  26. imageView.setImageResource(R.drawable.a5);
  27. imageScrollView.addView(imageView);
  28. imageView = new ImageView(this);
  29. imageView.setImageResource(R.drawable.a6);
  30. imageScrollView.addView(imageView);
  31. pageControlView = (PageControlView) this.findViewById(R.id.myPageControlView);
  32. /** 设置圆圈的数量 **/
  33. pageControlView.setCount(imageScrollView.getChildCount());
  34. /** 初始化圆圈 **/
  35. pageControlView.generatePageControl(0);
  36. /** 设置视图切换回调函数实现 **/
  37. imageScrollView.setScrollToScreenCallback(pageControlView);
  38. }
  39. }
 

ImageScrollView

Java代码 复制代码 收藏代码
  1. package org.wp.activity;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.view.GestureDetector;
  5. import android.view.GestureDetector.OnGestureListener;
  6. import android.view.MotionEvent;
  7. import android.view.View;
  8. import android.view.ViewConfiguration;
  9. import android.view.ViewGroup;
  10. import android.widget.Scroller;
  11. publicclass ImageScrollView extends ViewGroup {
  12. /** 滚动对象Scroller **/
  13. private Scroller scroller = null;
  14. /** 手势识别对象GestureDetector **/
  15. private GestureDetector gestureDetector = null;
  16. /** 当前屏幕索引 **/
  17. privateint currentScreenIndex = 0;
  18. /** 设置一个标志位,防止底层的onTouch事件重复处理UP事件 **/
  19. privateboolean fling = false;
  20. public ImageScrollView(Context context, AttributeSet attrs) {
  21. super(context, attrs);
  22. initView(context);
  23. }
  24. @Override
  25. protectedvoid onLayout(boolean changed, int left, int top, int right,
  26. int bottom) {
  27. /** 设置布局,将子视图顺序横屏排列 **/
  28. for (int i = 0; i < getChildCount(); i++) {
  29. View child = getChildAt(i);
  30. child.setVisibility(View.VISIBLE);
  31. child.measure(right - left, bottom - top);
  32. child.layout(i * getWidth(), 0, (i + 1) * getWidth(), getHeight());
  33. }
  34. }
  35. /** 初始化 **/
  36. privatevoid initView(final Context context) {
  37. this.scroller = new Scroller(context);
  38. this.gestureDetector = new GestureDetector(new OnGestureListener() {
  39. @Override
  40. publicboolean onSingleTapUp(MotionEvent e) {
  41. returnfalse;
  42. }
  43. @Override
  44. publicvoid onShowPress(MotionEvent e) {
  45. }
  46. @Override
  47. publicboolean onScroll(MotionEvent e1, MotionEvent e2,
  48. float distanceX, float distanceY) {
  49. // 防止移动过最后一页
  50. if ((distanceX > 0 && getScrollX() < getWidth() * (getChildCount() - 1))
  51. || (distanceX < 0 && getScrollX() > 0)) {// 防止向第一页之前移动
  52. scrollBy((int) distanceX, 0);
  53. }
  54. returntrue;
  55. }
  56. @Override
  57. publicvoid onLongPress(MotionEvent e) {
  58. }
  59. @Override
  60. publicboolean onFling(MotionEvent e1, MotionEvent e2,
  61. float velocityX, float velocityY) {
  62. // 判断是否达到最小轻松速度,取绝对值的
  63. if (Math.abs(velocityX) > ViewConfiguration.get(context)
  64. .getScaledMinimumFlingVelocity()) {
  65. if (velocityX > 0 && currentScreenIndex > 0) {
  66. fling = true;
  67. scrollToScreen(currentScreenIndex - 1);
  68. } elseif (velocityX < 0 && currentScreenIndex < getChildCount() - 1) {
  69. fling = true;
  70. scrollToScreen(currentScreenIndex + 1);
  71. }
  72. }
  73. returntrue;
  74. }
  75. @Override
  76. publicboolean onDown(MotionEvent e) {
  77. returnfalse;
  78. }
  79. });
  80. }
  81. /** 切换到指定屏 **/
  82. publicvoid scrollToScreen(int whichScreen) {
  83. if (whichScreen != currentScreenIndex && getFocusedChild() != null
  84. && getFocusedChild() == getChildAt(currentScreenIndex)) {
  85. getFocusedChild().clearFocus(); // 清除焦点
  86. }
  87. finalint delta = whichScreen * getWidth() - getScrollX();
  88. scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);
  89. invalidate();
  90. currentScreenIndex = whichScreen; // 设置当前屏幕索引
  91. if (scrollToScreenCallback != null) { // 刷新圆圈
  92. scrollToScreenCallback.callback(currentScreenIndex);
  93. }
  94. }
  95. @Override
  96. publicvoid computeScroll() {
  97. // 当滚动没有完成
  98. if (scroller.computeScrollOffset()) {
  99. scrollTo(scroller.getCurrX(), 0);
  100. postInvalidate();
  101. }
  102. }
  103. @Override
  104. publicboolean onTouchEvent(MotionEvent event) {
  105. gestureDetector.onTouchEvent(event);
  106. if (event.getAction() == MotionEvent.ACTION_UP) {
  107. if (!fling) {
  108. // 当用户停止拖动
  109. snapToDestination();
  110. }
  111. fling = false;
  112. }
  113. returntrue;
  114. }
  115. /** 根据当前x坐标位置确定切换到第几屏 **/
  116. privatevoid snapToDestination() {
  117. scrollToScreen((getScrollX() + (getWidth() / 2)) / getWidth());
  118. }
  119. /** 底部圆圈显示回调接口 **/
  120. interface ScrollToScreenCallback {
  121. publicvoid callback(int currentIndex);
  122. }
  123. /** ScrollToScreenCallback回调对象 **/
  124. private ScrollToScreenCallback scrollToScreenCallback;
  125. /** 设置回调函数对象 **/
  126. publicvoid setScrollToScreenCallback(ScrollToScreenCallback scrollToScreenCallback) {
  127. this.scrollToScreenCallback = scrollToScreenCallback;
  128. }
  129. }

 

PageControlView

Java代码 复制代码 收藏代码
  1. package org.wp.activity;
  2. import org.wp.activity.ImageScrollView.ScrollToScreenCallback;
  3. import android.content.Context;
  4. import android.util.AttributeSet;
  5. import android.widget.ImageView;
  6. import android.widget.LinearLayout;
  7. publicclass PageControlView extends LinearLayout implements
  8. ScrollToScreenCallback {
  9. /** Context对象 **/
  10. private Context context;
  11. /** 圆圈的数量 **/
  12. privateint count;
  13. public PageControlView(Context context, AttributeSet attrs) {
  14. super(context, attrs);
  15. this.context = context;
  16. }
  17. /** 回调函数 **/
  18. @Override
  19. publicvoid callback(int currentIndex) {
  20. generatePageControl(currentIndex);
  21. }
  22. /** 设置选中圆圈 **/
  23. publicvoid generatePageControl(int currentIndex) {
  24. this.removeAllViews();
  25. for (int i = 0; i < this.count; i++) {
  26. ImageView iv = new ImageView(context);
  27. if (currentIndex == i) {
  28. iv.setImageResource(R.drawable.page_indicator_focused);
  29. } else {
  30. iv.setImageResource(R.drawable.page_indicator);
  31. }
  32. this.addView(iv);
  33. }
  34. }
  35. /** 设置圆圈数量 **/
  36. publicvoid setCount(int count) {
  37. this.count = count;
  38. }
  39. }
 

main.xml

Xml代码 复制代码 收藏代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <org.wp.activity.ImageScrollViewandroid:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. android:id="@+id/myImageScrollView"/>
  8. <org.wp.activity.PageControlViewandroid:layout_width="fill_parent"
  9. android:layout_height="40dip"
  10. android:layout_alignParentBottom="true"
  11. android:background="#8f00000f"
  12. android:gravity="center"
  13. android:id="@+id/myPageControlView"/>
  14. </RelativeLayout>
posted on 2012-04-20 18:11  elva zhou  阅读(1040)  评论(0编辑  收藏  举报