ViewPager是google SDk中自带的一个附加包的一个类(在android-compatibility这个文件夹下),可以用来实现屏幕间的切换。

如可以仿一个workspace的效果。

Actviity:

[java]  view plain copy
  1. import com.viewpagerindicator.CirclePageIndicator;
  2. import android.os.Bundle;
  3. import android.support.v4.app.FragmentActivity;
  4. import android.support.v4.view.ViewPager;
  5. public class ViewpagerActivity extends FragmentActivity {
  6. TestFragmentAdapter mAdapter;
  7. ViewPager mPager;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. //The look of this sample is set via a style in the manifest
  12. setContentView(R.layout.simple_circles);
  13. mAdapter = new TestFragmentAdapter(getSupportFragmentManager());
  14. mPager = (ViewPager)findViewById(R.id.pager);
  15. mPager.setAdapter(mAdapter);
  16. CirclePageIndicator indicator = (CirclePageIndicator)findViewById(R.id.indicator);
  17. indicator.setViewPager(mPager);
  18. }
  19. }

simple_circles.xml:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent">
  7. <android.support.v4.view.ViewPager
  8. android:id="@+id/pager"
  9. android:layout_width="fill_parent"
  10. android:layout_height="0dp"
  11. android:layout_weight="1"
  12. />
  13. <com.viewpagerindicator.CirclePageIndicator
  14. android:id="@+id/indicator"
  15. android:padding="10dip"
  16. android:layout_height="wrap_content"
  17. android:layout_width="fill_parent"
  18. />
  19. </LinearLayout>

TestFragmentAdapter:

[java]  view plain copy
  1. import android.support.v4.app.Fragment;
  2. import android.support.v4.app.FragmentManager;
  3. import android.support.v4.app.FragmentPagerAdapter;
  4. class TestFragmentAdapter extends FragmentPagerAdapter {
  5. protected static final String[] CONTENT = new String[] { "第一页", "第二页", "第三页", "第四页", };
  6. private int mCount = CONTENT.length;
  7. public TestFragmentAdapter(FragmentManager fm) {
  8. super(fm);
  9. }
  10. @Override
  11. public Fragment getItem(int position) {
  12. return TestFragment.newInstance(CONTENT[position % CONTENT.length]);
  13. }
  14. @Override
  15. public int getCount() {
  16. return mCount;
  17. }
  18. public void setCount(int count) {
  19. if (count > 0 && count <= 10) {
  20. mCount = count;
  21. notifyDataSetChanged();
  22. }
  23. }
  24. }

TestFragment:

[java]  view plain copy
  1. package com.shao.pager;
  2. import android.os.Bundle;
  3. import android.support.v4.app.Fragment;
  4. import android.view.Gravity;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.LinearLayout;
  9. import android.widget.LinearLayout.LayoutParams;
  10. import android.widget.TextView;
  11. public final class TestFragment extends Fragment {
  12. private static final String KEY_CONTENT = "TestFragment:Content";
  13. public static TestFragment newInstance(String content) {
  14. TestFragment fragment = new TestFragment();
  15. fragment.mContent = content;
  16. return fragment;
  17. }
  18. private String mContent = "???";
  19. @Override
  20. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  21. if ((savedInstanceState != null) && savedInstanceState.containsKey(KEY_CONTENT)) {
  22. mContent = savedInstanceState.getString(KEY_CONTENT);
  23. }
  24. TextView text = new TextView(getActivity());
  25. text.setGravity(Gravity.CENTER);
  26. text.setText(mContent);
  27. text.setTextSize(20 * getResources().getDisplayMetrics().density);
  28. text.setPadding(20, 20, 20, 20);
  29. LinearLayout layout = new LinearLayout(getActivity());
  30. layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
  31. layout.setGravity(Gravity.CENTER);
  32. layout.addView(text);
  33. return layout;
  34. }
  35. @Override
  36. public void onSaveInstanceState(Bundle outState) {
  37. super.onSaveInstanceState(outState);
  38. outState.putString(KEY_CONTENT, mContent);
  39. }
  40. }

PageIndicator:

[java]  view plain copy
  1. package com.viewpagerindicator;
  2. import android.support.v4.view.ViewPager;
  3. public interface PageIndicator extends ViewPager.OnPageChangeListener {
  4. public void setViewPager(ViewPager view);
  5. public void setViewPager(ViewPager view, int initialPosition);
  6. public void setCurrentItem(int item);
  7. public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener);
  8. }

CliclePageIndicator:

[java]  view plain copy
  1. package com.viewpagerindicator;
  2. import android.content.Context;
  3. import android.content.res.Resources;
  4. import android.content.res.TypedArray;
  5. import android.graphics.Canvas;
  6. import android.graphics.Paint;
  7. import android.graphics.Paint.Style;
  8. import android.os.Parcel;
  9. import android.os.Parcelable;
  10. import android.support.v4.view.ViewPager;
  11. import android.util.AttributeSet;
  12. import android.view.MotionEvent;
  13. import android.view.View;
  14. import com.shao.pager.R;
  15. public class CirclePageIndicator extends View implements PageIndicator {
  16. public static final int HORIZONTAL = 0;
  17. public static final int VERTICAL = 1;
  18. private float mRadius;
  19. private final Paint mPaintStroke;
  20. private final Paint mPaintFill;
  21. private ViewPager mViewPager;
  22. private ViewPager.OnPageChangeListener mListener;
  23. private int mCurrentPage;
  24. private int mSnapPage;
  25. private int mCurrentOffset;
  26. private int mScrollState;
  27. private int mPageSize;
  28. private int mOrientation;
  29. private boolean mCentered;
  30. private boolean mSnap;
  31. public CirclePageIndicator(Context context) {
  32. this(context, null);
  33. }
  34. public CirclePageIndicator(Context context, AttributeSet attrs) {
  35. this(context, attrs, R.attr.circlePageIndicatorStyle);
  36. }
  37. public CirclePageIndicator(Context context, AttributeSet attrs, int defStyle) {
  38. super(context, attrs, defStyle);
  39. //Load defaults from resources
  40. final Resources res = getResources();
  41. final int defaultFillColor = res.getColor(R.color.default_circle_indicator_fill_color);
  42. final int defaultOrientation = res.getInteger(R.integer.default_circle_indicator_orientation);
  43. final int defaultStrokeColor = res.getColor(R.color.default_circle_indicator_stroke_color);
  44. final float defaultStrokeWidth = res.getDimension(R.dimen.default_circle_indicator_stroke_width);
  45. final float defaultRadius = res.getDimension(R.dimen.default_circle_indicator_radius);
  46. final boolean defaultCentered = res.getBoolean(R.bool.default_circle_indicator_centered);
  47. final boolean defaultSnap = res.getBoolean(R.bool.default_circle_indicator_snap);
  48. //Retrieve styles attributes
  49. TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CirclePageIndicator, defStyle, R.style.Widget_CirclePageIndicator);
  50. mCentered = a.getBoolean(R.styleable.CirclePageIndicator_centered, defaultCentered);
  51. mOrientation = a.getInt(R.styleable.CirclePageIndicator_orientation, defaultOrientation);
  52. mPaintStroke = new Paint(Paint.ANTI_ALIAS_FLAG);
  53. mPaintStroke.setStyle(Style.STROKE);
  54. mPaintStroke.setColor(a.getColor(R.styleable.CirclePageIndicator_strokeColor, defaultStrokeColor));
  55. mPaintStroke.setStrokeWidth(a.getDimension(R.styleable.CirclePageIndicator_strokeWidth, defaultStrokeWidth));
  56. mPaintFill = new Paint(Paint.ANTI_ALIAS_FLAG);
  57. mPaintFill.setStyle(Style.FILL);
  58. mPaintFill.setColor(a.getColor(R.styleable.CirclePageIndicator_fillColor, defaultFillColor));
  59. mRadius = a.getDimension(R.styleable.CirclePageIndicator_radius, defaultRadius);
  60. mSnap = a.getBoolean(R.styleable.CirclePageIndicator_snap, defaultSnap);
  61. a.recycle();
  62. }
  63. public void setCentered(boolean centered) {
  64. mCentered = centered;
  65. invalidate();
  66. }
  67. public boolean isCentered() {
  68. return mCentered;
  69. }
  70. public void setFillColor(int fillColor) {
  71. mPaintFill.setColor(fillColor);
  72. invalidate();
  73. }
  74. public int getFillColor() {
  75. return mPaintFill.getColor();
  76. }
  77. public void setOrientation(int orientation) {
  78. switch (orientation) {
  79. case HORIZONTAL:
  80. case VERTICAL:
  81. mOrientation = orientation;
  82. updatePageSize();
  83. requestLayout();
  84. break;
  85. default:
  86. throw new IllegalArgumentException("Orientation must be either HORIZONTAL or VERTICAL.");
  87. }
  88. }
  89. public int getOrientation() {
  90. return mOrientation;
  91. }
  92. public void setStrokeColor(int strokeColor) {
  93. mPaintStroke.setColor(strokeColor);
  94. invalidate();
  95. }
  96. public int getStrokeColor() {
  97. return mPaintStroke.getColor();
  98. }
  99. public void setStrokeWidth(float strokeWidth) {
  100. mPaintStroke.setStrokeWidth(strokeWidth);
  101. invalidate();
  102. }
  103. public float getStrokeWidth() {
  104. return mPaintStroke.getStrokeWidth();
  105. }
  106. public void setRadius(float radius) {
  107. mRadius = radius;
  108. invalidate();
  109. }
  110. public float getRadius() {
  111. return mRadius;
  112. }
  113. public void setSnap(boolean snap) {
  114. mSnap = snap;
  115. invalidate();
  116. }
  117. public boolean isSnap() {
  118. return mSnap;
  119. }
  120. /*
  121. * (non-Javadoc)
  122. *
  123. * @see android.view.View#onDraw(android.graphics.Canvas)
  124. */
  125. @Override
  126. protected void onDraw(Canvas canvas) {
  127. super.onDraw(canvas);
  128. int longSize;
  129. int longPaddingBefore;
  130. int longPaddingAfter;
  131. int shortPaddingBefore;
  132. if (mOrientation == HORIZONTAL) {
  133. longSize = getWidth();
  134. longPaddingBefore = getPaddingLeft();
  135. longPaddingAfter = getPaddingRight();
  136. shortPaddingBefore = getPaddingTop();
  137. } else {
  138. longSize = getHeight();
  139. longPaddingBefore = getPaddingTop();
  140. longPaddingAfter = getPaddingBottom();
  141. shortPaddingBefore = getPaddingLeft();
  142. }
  143. final int count = mViewPager.getAdapter().getCount();
  144. final float threeRadius = mRadius * 3;
  145. final float shortOffset = shortPaddingBefore + mRadius;
  146. float longOffset = longPaddingBefore + mRadius;
  147. if (mCentered) {
  148. longOffset += ((longSize - longPaddingBefore - longPaddingAfter) / 2.0f) - ((count * threeRadius) / 2.0f);
  149. }
  150. float dX;
  151. float dY;
  152. //Draw stroked circles
  153. for (int iLoop = 0; iLoop < count; iLoop++) {
  154. float drawLong = longOffset + (iLoop * threeRadius);
  155. if (mOrientation == HORIZONTAL) {
  156. dX = drawLong;
  157. dY = shortOffset;
  158. } else {
  159. dX = shortOffset;
  160. dY = drawLong;
  161. }
  162. canvas.drawCircle(dX, dY, mRadius, mPaintStroke);
  163. }
  164. //Draw the filled circle according to the current scroll
  165. float cx = (mSnap ? mSnapPage : mCurrentPage) * threeRadius;
  166. if (!mSnap && (mPageSize != 0)) {
  167. cx += (mCurrentOffset * 1.0f / mPageSize) * threeRadius;
  168. }
  169. if (mOrientation == HORIZONTAL) {
  170. dX = longOffset + cx;
  171. dY = shortOffset;
  172. } else {
  173. dX = shortOffset;
  174. dY = longOffset + cx;
  175. }
  176. canvas.drawCircle(dX, dY, mRadius, mPaintFill);
  177. }
  178. @Override
  179. public boolean onTouchEvent(MotionEvent event) {
  180. if (event.getAction() == MotionEvent.ACTION_DOWN) {
  181. final int count = mViewPager.getAdapter().getCount();
  182. final int longSize = (mOrientation == HORIZONTAL) ? getWidth() : getHeight();
  183. final float halfLongSize = longSize / 2;
  184. final float halfCircleLongSize = (count * 3 * mRadius) / 2;
  185. final float pointerValue = (mOrientation == HORIZONTAL) ? event.getX() : event.getY();
  186. if ((mCurrentPage > 0) && (pointerValue < halfLongSize - halfCircleLongSize)) {
  187. setCurrentItem(mCurrentPage - 1);
  188. return true;
  189. } else if ((mCurrentPage < count - 1) && (pointerValue > halfLongSize + halfCircleLongSize)) {
  190. setCurrentItem(mCurrentPage + 1);
  191. return true;
  192. }
  193. }
  194. return super.onTouchEvent(event);
  195. }
  196. @Override
  197. public void setViewPager(ViewPager view) {
  198. if (view.getAdapter() == null) {
  199. throw new IllegalStateException("ViewPager does not have adapter instance.");
  200. }
  201. mViewPager = view;
  202. mViewPager.setOnPageChangeListener(this);
  203. updatePageSize();
  204. invalidate();
  205. }
  206. private void updatePageSize() {
  207. if (mViewPager != null) {
  208. mPageSize = (mOrientation == HORIZONTAL) ? mViewPager.getWidth() : mViewPager.getHeight();
  209. }
  210. }
  211. @Override
  212. public void setViewPager(ViewPager view, int initialPosition) {
  213. setViewPager(view);
  214. setCurrentItem(initialPosition);
  215. }
  216. @Override
  217. public void setCurrentItem(int item) {
  218. if (mViewPager == null) {
  219. throw new IllegalStateException("ViewPager has not been bound.");
  220. }
  221. mViewPager.setCurrentItem(item);
  222. mCurrentPage = item;
  223. invalidate();
  224. }
  225. @Override
  226. public void onPageScrollStateChanged(int state) {
  227. mScrollState = state;
  228. if (mListener != null) {
  229. mListener.onPageScrollStateChanged(state);
  230. }
  231. }
  232. @Override
  233. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  234. mCurrentPage = position;
  235. mCurrentOffset = positionOffsetPixels;
  236. updatePageSize();
  237. invalidate();
  238. if (mListener != null) {
  239. mListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
  240. }
  241. }
  242. @Override
  243. public void onPageSelected(int position) {
  244. if (mSnap || mScrollState == ViewPager.SCROLL_STATE_IDLE) {
  245. mCurrentPage = position;
  246. mSnapPage = position;
  247. invalidate();
  248. }
  249. if (mListener != null) {
  250. mListener.onPageSelected(position);
  251. }
  252. }
  253. @Override
  254. public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) {
  255. mListener = listener;
  256. }
  257. @Override
  258. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  259. if (mOrientation == HORIZONTAL) {
  260. setMeasuredDimension(measureLong(widthMeasureSpec), measureShort(heightMeasureSpec));
  261. } else {
  262. setMeasuredDimension(measureShort(widthMeasureSpec), measureLong(heightMeasureSpec));
  263. }
  264. }
  265. /**
  266. * Determines the width of this view
  267. *
  268. * @param measureSpec
  269. *            A measureSpec packed into an int
  270. * @return The width of the view, honoring constraints from measureSpec
  271. */
  272. private int measureLong(int measureSpec) {
  273. int result = 0;
  274. int specMode = MeasureSpec.getMode(measureSpec);
  275. int specSize = MeasureSpec.getSize(measureSpec);
  276. if (specMode == MeasureSpec.EXACTLY) {
  277. //We were told how big to be
  278. result = specSize;
  279. } else {
  280. //Calculate the width according the views count
  281. final int count = mViewPager.getAdapter().getCount();
  282. result = (int)(getPaddingLeft() + getPaddingRight()
  283. + (count * 2 * mRadius) + (count - 1) * mRadius + 1);
  284. //Respect AT_MOST value if that was what is called for by measureSpec
  285. if (specMode == MeasureSpec.AT_MOST) {
  286. result = Math.min(result, specSize);
  287. }
  288. }
  289. return result;
  290. }
  291. private int measureShort(int measureSpec) {
  292. int result = 0;
  293. int specMode = MeasureSpec.getMode(measureSpec);
  294. int specSize = MeasureSpec.getSize(measureSpec);
  295. if (specMode == MeasureSpec.EXACTLY) {
  296. //We were told how big to be
  297. result = specSize;
  298. } else {
  299. //Measure the height
  300. result = (int)(2 * mRadius + getPaddingTop() + getPaddingBottom() + 1);
  301. //Respect AT_MOST value if that was what is called for by measureSpec
  302. if (specMode == MeasureSpec.AT_MOST) {
  303. result = Math.min(result, specSize);
  304. }
  305. }
  306. return result;
  307. }
  308. @Override
  309. public void onRestoreInstanceState(Parcelable state) {
  310. SavedState savedState = (SavedState)state;
  311. super.onRestoreInstanceState(savedState.getSuperState());
  312. mCurrentPage = savedState.currentPage;
  313. mSnapPage = savedState.currentPage;
  314. requestLayout();
  315. }
  316. @Override
  317. public Parcelable onSaveInstanceState() {
  318. Parcelable superState = super.onSaveInstanceState();
  319. SavedState savedState = new SavedState(superState);
  320. savedState.currentPage = mCurrentPage;
  321. return savedState;
  322. }
  323. static class SavedState extends BaseSavedState {
  324. int currentPage;
  325. public SavedState(Parcelable superState) {
  326. super(superState);
  327. }
  328. private SavedState(Parcel in) {
  329. super(in);
  330. currentPage = in.readInt();
  331. }
  332. @Override
  333. public void writeToParcel(Parcel dest, int flags) {
  334. super.writeToParcel(dest, flags);
  335. dest.writeInt(currentPage);
  336. }
  337. public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
  338. @Override
  339. public SavedState createFromParcel(Parcel in) {
  340. return new SavedState(in);
  341. }
  342. @Override
  343. public SavedState[] newArray(int size) {
  344. return new SavedState[size];
  345. }
  346. };
  347. }
  348. }

代码下载http://download.csdn.net/detail/shaojie519/4256481

android-Viewpager相关推荐

  1. android viewpager 嵌套fragment,Android ViewPager+Fragment多层嵌套(使用问题处理)

    之前写了Android ViewPager+Fragment(使用问题处理),封装了一个BaseFragment,对于简单使用ViewPager+Fragment而言,是没有问题的. 不过,ViewP ...

  2. Android -- ViewPager切换动画,PageTransformer

    transformPage(View view, float position) view就是滑动中的那个view,position这里是float类型,是当前滑动状态的一个表示,比如当滑动到正全屏时 ...

  3. android开发实例之viewpager无限循环+自动滚动,Android ViewPager实现无限循环的实例...

    Android ViewPager实现无限循环的实例 ViewPager自身并不支持左右无限循环的功能,这里就提供一种方案让Android ViewPager实现左右无限循环的功能,这里记录下: 用于 ...

  4. android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...

    本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里 ...

  5. android ViewPager 实现点击小圆点切换页面 案例

    android ViewPager  实现点击小圆点切换页面 说明:在viewpager中,通过左右滑动可以切换页面,同样可以通过点击所指示的小圆点来滑动到某个页面页面. 具体实现方法如下: 主要ac ...

  6. Android ViewPager 重复数据问题的解决方法

    Android ViewPager 重复数据问题的解决方法 参考文章: (1)Android ViewPager 重复数据问题的解决方法 (2)https://www.cnblogs.com/Linc ...

  7. Android ViewPager示例教程

    ViewPager in Android allows the user to flip left and right through pages of data. In our android Vi ...

  8. android ViewPager轮播制作成品——轮播制作(六)

    android ViewPager轮播制作成品--轮播制作(六) 本文主要参考文章:Android 使用ViewPager实现左右循环滑动图片 下面整体介绍一下本系列文章.目的是想要做一个广告.通知轮 ...

  9. android小圆点滑动切换,android ViewPager 实现点击小圆点切换页面 案例

    android ViewPager  实现点击小圆点切换页面 说明:在viewpager中,通过左右滑动可以切换页面,同样可以通过点击所指示的小圆点来滑动到某个页面页面. 具体实现方法如下: 主要ac ...

  10. android切换页面上滑动动画,Android ViewPager多页面滑动切换以及动画效果

    评论 #28楼[楼主] 2012-06-01 14:27D.Winter @孤寒江雪 我猜 要么在头尾各再加入一个页卡 在页卡切换监听中判断,如果选中了头尾的页卡,就返回到相邻的那个页卡.头尾页卡的界 ...

最新文章

  1. 2022-2028年中国BOPET薄膜行业市场全景调查及投资前景预测报告
  2. 【Gstreamer】在虚拟机中无法使用硬件加速:gstreamer1.0-vaapi
  3. python修改excel数据-python之实现对excel表格数据的修改
  4. LeetCode-两个结构分别遍历,然后合并
  5. java 10-4 Scanner方法
  6. 人脸检测SSD 记录
  7. 美团点评架构再调整,王兴凭什么同时杠上阿里滴滴饿了么
  8. 有多么巨大的工作量,要交接一个月?
  9. 简单WEB登录页面代码实现
  10. adb shell中的am pm命令
  11. 农夫山泉 || 到底是如何缔造年140亿销售神话的?
  12. linux同步clock和date,liunx时钟与同步
  13. JVM系列之深入理解JVM(三)
  14. 【饭谈】面试场上的珍珑棋局(PUA之无限打击)
  15. 对图像作LUT处理是什么意思
  16. 流量分析(wireshark使用)
  17. 【TeXstudio】【3】较为完整的论文排版模板与bib文件引用方法
  18. RTL概念与常用RTL建模
  19. Java使用IKAnalyzer实现多关键字查询
  20. html中视频代码字段,Html5通过数据流方式播放视频的实现

热门文章

  1. 《卓有成效的管理者》——学习心得(五)
  2. 【Jmeter常用断言组件】
  3. HTML 修改滚动条样式
  4. 华为p10和p10plus区别_华为P10与P10 Plus的区别,不仅仅只是大了一圈
  5. 【有限元分析】在ANSYS经典版中划分网格后,如何查看单元数和节点数
  6. 在西雅图华盛顿大学 (University of Washington) 就读是怎样一番体验?
  7. Kyligence 春季论坛成功举办,助力企业构建数字化管理新体系
  8. 三电平半桥LLC谐振变换器电路仿真 采用频率控制方式 引入一定的移相角度
  9. Revit 二次开发 获取多段轴网的location
  10. HFM深入技术学习系列之二--规则