天天看點

android-Viewpager

ViewPager是google SDk中自帶的一個附加包的一個類(在android-compatibility這個檔案夾下),可以用來實作螢幕間的切換。

如可以仿一個workspace的效果。

android-Viewpager
android-Viewpager

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.     @Override  
  121.     protected void onDraw(Canvas canvas) {  
  122.         super.onDraw(canvas);  
  123.         int longSize;  
  124.         int longPaddingBefore;  
  125.         int longPaddingAfter;  
  126.         int shortPaddingBefore;  
  127.         if (mOrientation == HORIZONTAL) {  
  128.             longSize = getWidth();  
  129.             longPaddingBefore = getPaddingLeft();  
  130.             longPaddingAfter = getPaddingRight();  
  131.             shortPaddingBefore = getPaddingTop();  
  132.         } else {  
  133.             longSize = getHeight();  
  134.             longPaddingBefore = getPaddingTop();  
  135.             longPaddingAfter = getPaddingBottom();  
  136.             shortPaddingBefore = getPaddingLeft();  
  137.         }  
  138.         final int count = mViewPager.getAdapter().getCount();  
  139.         final float threeRadius = mRadius * 3;  
  140.         final float shortOffset = shortPaddingBefore + mRadius;  
  141.         float longOffset = longPaddingBefore + mRadius;  
  142.         if (mCentered) {  
  143.             longOffset += ((longSize - longPaddingBefore - longPaddingAfter) / 2.0f) - ((count * threeRadius) / 2.0f);  
  144.         }  
  145.         float dX;  
  146.         float dY;  
  147.         //Draw stroked circles  
  148.         for (int iLoop = 0; iLoop < count; iLoop++) {  
  149.             float drawLong = longOffset + (iLoop * threeRadius);  
  150.             if (mOrientation == HORIZONTAL) {  
  151.                 dX = drawLong;  
  152.                 dY = shortOffset;  
  153.             } else {  
  154.                 dX = shortOffset;  
  155.                 dY = drawLong;  
  156.             }  
  157.             canvas.drawCircle(dX, dY, mRadius, mPaintStroke);  
  158.         }  
  159.         //Draw the filled circle according to the current scroll  
  160.         float cx = (mSnap ? mSnapPage : mCurrentPage) * threeRadius;  
  161.         if (!mSnap && (mPageSize != 0)) {  
  162.             cx += (mCurrentOffset * 1.0f / mPageSize) * threeRadius;  
  163.         }  
  164.         if (mOrientation == HORIZONTAL) {  
  165.             dX = longOffset + cx;  
  166.             dY = shortOffset;  
  167.         } else {  
  168.             dX = shortOffset;  
  169.             dY = longOffset + cx;  
  170.         }  
  171.         canvas.drawCircle(dX, dY, mRadius, mPaintFill);  
  172.     }  
  173.     @Override  
  174.     public boolean onTouchEvent(MotionEvent event) {  
  175.         if (event.getAction() == MotionEvent.ACTION_DOWN) {  
  176.             final int count = mViewPager.getAdapter().getCount();  
  177.             final int longSize = (mOrientation == HORIZONTAL) ? getWidth() : getHeight();  
  178.             final float halfLongSize = longSize / 2;  
  179.             final float halfCircleLongSize = (count * 3 * mRadius) / 2;  
  180.             final float pointerValue = (mOrientation == HORIZONTAL) ? event.getX() : event.getY();  
  181.             if ((mCurrentPage > 0) && (pointerValue < halfLongSize - halfCircleLongSize)) {  
  182.                 setCurrentItem(mCurrentPage - 1);  
  183.                 return true;  
  184.             } else if ((mCurrentPage < count - 1) && (pointerValue > halfLongSize + halfCircleLongSize)) {  
  185.                 setCurrentItem(mCurrentPage + 1);  
  186.                 return true;  
  187.             }  
  188.         }  
  189.         return super.onTouchEvent(event);  
  190.     }  
  191.     @Override  
  192.     public void setViewPager(ViewPager view) {  
  193.         if (view.getAdapter() == null) {  
  194.             throw new IllegalStateException("ViewPager does not have adapter instance.");  
  195.         }  
  196.         mViewPager = view;  
  197.         mViewPager.setOnPageChangeListener(this);  
  198.         updatePageSize();  
  199.         invalidate();  
  200.     }  
  201.     private void updatePageSize() {  
  202.         if (mViewPager != null) {  
  203.             mPageSize = (mOrientation == HORIZONTAL) ? mViewPager.getWidth() : mViewPager.getHeight();  
  204.         }  
  205.     }  
  206.     @Override  
  207.     public void setViewPager(ViewPager view, int initialPosition) {  
  208.         setViewPager(view);  
  209.         setCurrentItem(initialPosition);  
  210.     }  
  211.     @Override  
  212.     public void setCurrentItem(int item) {  
  213.         if (mViewPager == null) {  
  214.             throw new IllegalStateException("ViewPager has not been bound.");  
  215.         }  
  216.         mViewPager.setCurrentItem(item);  
  217.         mCurrentPage = item;  
  218.         invalidate();  
  219.     }  
  220.     @Override  
  221.     public void onPageScrollStateChanged(int state) {  
  222.         mScrollState = state;  
  223.         if (mListener != null) {  
  224.             mListener.onPageScrollStateChanged(state);  
  225.         }  
  226.     }  
  227.     @Override  
  228.     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {  
  229.         mCurrentPage = position;  
  230.         mCurrentOffset = positionOffsetPixels;  
  231.         updatePageSize();  
  232.         invalidate();  
  233.         if (mListener != null) {  
  234.             mListener.onPageScrolled(position, positionOffset, positionOffsetPixels);  
  235.         }  
  236.     }  
  237.     @Override  
  238.     public void onPageSelected(int position) {  
  239.         if (mSnap || mScrollState == ViewPager.SCROLL_STATE_IDLE) {  
  240.             mCurrentPage = position;  
  241.             mSnapPage = position;  
  242.             invalidate();  
  243.         }  
  244.         if (mListener != null) {  
  245.             mListener.onPageSelected(position);  
  246.         }  
  247.     }  
  248.     @Override  
  249.     public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) {  
  250.         mListener = listener;  
  251.     }  
  252.     @Override  
  253.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  254.         if (mOrientation == HORIZONTAL) {  
  255.             setMeasuredDimension(measureLong(widthMeasureSpec), measureShort(heightMeasureSpec));  
  256.         } else {  
  257.             setMeasuredDimension(measureShort(widthMeasureSpec), measureLong(heightMeasureSpec));  
  258.         }  
  259.     }  
  260.     private int measureLong(int measureSpec) {  
  261.         int result = 0;  
  262.         int specMode = MeasureSpec.getMode(measureSpec);  
  263.         int specSize = MeasureSpec.getSize(measureSpec);  
  264.         if (specMode == MeasureSpec.EXACTLY) {  
  265.             //We were told how big to be  
  266.             result = specSize;  
  267.         } else {  
  268.             //Calculate the width according the views count  
  269.             final int count = mViewPager.getAdapter().getCount();  
  270.             result = (int)(getPaddingLeft() + getPaddingRight()  
  271.                     + (count * 2 * mRadius) + (count - 1) * mRadius + 1);  
  272.             //Respect AT_MOST value if that was what is called for by measureSpec  
  273.             if (specMode == MeasureSpec.AT_MOST) {  
  274.                 result = Math.min(result, specSize);  
  275.             }  
  276.         }  
  277.         return result;  
  278.     }  
  279.     private int measureShort(int measureSpec) {  
  280.         int result = 0;  
  281.         int specMode = MeasureSpec.getMode(measureSpec);  
  282.         int specSize = MeasureSpec.getSize(measureSpec);  
  283.         if (specMode == MeasureSpec.EXACTLY) {  
  284.             //We were told how big to be  
  285.             result = specSize;  
  286.         } else {  
  287.             //Measure the height  
  288.             result = (int)(2 * mRadius + getPaddingTop() + getPaddingBottom() + 1);  
  289.             //Respect AT_MOST value if that was what is called for by measureSpec  
  290.             if (specMode == MeasureSpec.AT_MOST) {  
  291.                 result = Math.min(result, specSize);  
  292.             }  
  293.         }  
  294.         return result;  
  295.     }  
  296.     @Override  
  297.     public void onRestoreInstanceState(Parcelable state) {  
  298.         SavedState savedState = (SavedState)state;  
  299.         super.onRestoreInstanceState(savedState.getSuperState());  
  300.         mCurrentPage = savedState.currentPage;  
  301.         mSnapPage = savedState.currentPage;  
  302.         requestLayout();  
  303.     }  
  304.     @Override  
  305.     public Parcelable onSaveInstanceState() {  
  306.         Parcelable superState = super.onSaveInstanceState();  
  307.         SavedState savedState = new SavedState(superState);  
  308.         savedState.currentPage = mCurrentPage;  
  309.         return savedState;  
  310.     }  
  311.     static class SavedState extends BaseSavedState {  
  312.         int currentPage;  
  313.         public SavedState(Parcelable superState) {  
  314.             super(superState);  
  315.         }  
  316.         private SavedState(Parcel in) {  
  317.             super(in);  
  318.             currentPage = in.readInt();  
  319.         }  
  320.         @Override  
  321.         public void writeToParcel(Parcel dest, int flags) {  
  322.             super.writeToParcel(dest, flags);  
  323.             dest.writeInt(currentPage);  
  324.         }  
  325.         public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {  
  326.             @Override  
  327.             public SavedState createFromParcel(Parcel in) {  
  328.                 return new SavedState(in);  
  329.             }  
  330.             @Override  
  331.             public SavedState[] newArray(int size) {  
  332.                 return new SavedState[size];  
  333.             }  
  334.         };  
  335.     }  
  336. }  

代碼下載下傳http://download.csdn.net/detail/shaojie519/4256481

繼續閱讀