android-Viewpager

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

如可以仿一个workspace的效果。


 

android-Viewpager_第1张图片


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.       
  12.   
  13.     //The look of this sample is set via a style in the manifest  
  14.     setContentView(R.layout.simple_circles);  
  15.       
  16.     mAdapter = new TestFragmentAdapter(getSupportFragmentManager());  
  17.       
  18.     mPager = (ViewPager)findViewById(R.id.pager);  
  19.     mPager.setAdapter(mAdapter);  
  20.       
  21.     CirclePageIndicator indicator = (CirclePageIndicator)findViewById(R.id.indicator);  
  22.     indicator.setViewPager(mPager);  
  23. }  
  24.   
  25.       
  26. }  

simple_circles.xml:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <LinearLayout  
  4.     xmlns:android="http://schemas.android.com/apk/res/android"  
  5.     android:orientation="vertical"  
  6.     android:layout_width="fill_parent"  
  7.     android:layout_height="fill_parent">  
  8.   
  9.     <android.support.v4.view.ViewPager  
  10.         android:id="@+id/pager"  
  11.         android:layout_width="fill_parent"  
  12.         android:layout_height="0dp"  
  13.         android:layout_weight="1"  
  14.         />  
  15.     <com.viewpagerindicator.CirclePageIndicator  
  16.         android:id="@+id/indicator"  
  17.         android:padding="10dip"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_width="fill_parent"  
  20.         />  
  21. </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.   
  5. class TestFragmentAdapter extends FragmentPagerAdapter {  
  6.     protected static final String[] CONTENT = new String[] { "第一页""第二页""第三页""第四页", };  
  7.       
  8.     private int mCount = CONTENT.length;  
  9.   
  10.     public TestFragmentAdapter(FragmentManager fm) {  
  11.         super(fm);  
  12.     }  
  13.   
  14.     @Override  
  15.     public Fragment getItem(int position) {  
  16.         return TestFragment.newInstance(CONTENT[position % CONTENT.length]);  
  17.     }  
  18.   
  19.     @Override  
  20.     public int getCount() {  
  21.         return mCount;  
  22.     }  
  23.       
  24.     public void setCount(int count) {  
  25.         if (count > 0 && count <= 10) {  
  26.             mCount = count;  
  27.             notifyDataSetChanged();  
  28.         }  
  29.     }  
  30. }  

TestFragment:

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

PageIndicator:

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

CliclePageIndicator:

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

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

你可能感兴趣的:(viewpager,Fragment)