图片轮轮播器的时候,通常有几个点点指示当前是第几张图片,有的实现是切好几张图片,但这样的点点不能修改样式大小,不够灵活。由于这是一个很常用的控件,于是就写了一个自定义控件,功能如下:
1、单独调用。
2、可以控制每个点大小。
3、有内环、处环,效果好。
4、可以控制点点的间距。
5、控制哪个点被选中。
6、动态控制有几个点。
效果如下:
自定义View代码:
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
/**
 * 滑动图片点点指示器
 * 
 * @author zhougang
 * 
 *         2014-1-17 下午5:23:17
 */
public class DotIndicatorView extends View {
	private Context mContext;
	private int innerColor;
	private int outerColor;
	private float size;
	private float distance;
	private int number;
	private int selectedIndex;
	private Paint mPaint1;
	private Paint mPaint2;
	private Paint mPaint3;
	
	private int border = 2;
	
	public DotIndicatorView(Context context) {
		super(context);
	}
	public DotIndicatorView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mPaint1 = new Paint();
		mPaint2 = new Paint();
		mPaint3 = new Paint();
		TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.DotIndicatorView);
		innerColor = typedArray.getColor(R.styleable.DotIndicatorView_innerColor, 0XFF0000);
		outerColor = typedArray.getColor(R.styleable.DotIndicatorView_outerColor, 0XFFFFFF);
		size = typedArray.getDimension(R.styleable.DotIndicatorView_size, 8);
		distance = typedArray.getDimension(
				R.styleable.DotIndicatorView_distance, 10);
		number = typedArray.getInteger(R.styleable.DotIndicatorView_number, 4);
		selectedIndex = typedArray.getInteger(
				R.styleable.DotIndicatorView_selectedIndex, 0);
		typedArray.recycle();
	}
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		mPaint1.setStyle(Style.FILL);
		mPaint1.setColor(outerColor);
		mPaint1.setAntiAlias(true);
		
		mPaint2.setStyle(Style.FILL);
		mPaint2.setColor(innerColor);
		mPaint2.setAntiAlias(true);
		
		mPaint3.setColor(outerColor);
		mPaint3.setAntiAlias(true);
		mPaint3.setStyle(Style.STROKE);
		mPaint3.setStrokeWidth(2);
		
		for (int index = 0; index < number; index++) {
			if(number==1){
				return ;
			}
			if (index == selectedIndex ) {
				canvas.drawCircle((index+1) * (distance+ size), size/2, size/2-border,mPaint2);
				canvas.drawCircle((index+1) * (distance+size), size/2, size/2-border,mPaint3);
			} else {
				canvas.drawCircle((index+1) * (distance+size), size/2, size/2-1,mPaint1);
			}
		}
	}
	public void setPosition(int position) {
		selectedIndex = position;
		invalidate();
	}
	public void setNumber(int number) {
		this.number = number;
		invalidate();
	}
	
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
	    int desiredWidth = (int)(number*size +(number+1)*distance);
	    int desiredHeight = (int)size;
	    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
	    int widthSize = MeasureSpec.getSize(widthMeasureSpec);
	    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
	    int heightSize = MeasureSpec.getSize(heightMeasureSpec);
	    int width;
	    int height;
	    //Measure Width
	    if (widthMode == MeasureSpec.EXACTLY) {
	        //Must be this size
	        width = widthSize;
	    } else if (widthMode == MeasureSpec.AT_MOST) {
	        //Can‘t be bigger than...
	        width = Math.min(desiredWidth, widthSize);
	    } else {
	        //Be whatever you want
	        width = desiredWidth;
	    }
	    //Measure Height
	    if (heightMode == MeasureSpec.EXACTLY) {
	        //Must be this size
	        height = heightSize;
	    } else if (heightMode == MeasureSpec.AT_MOST) {
	        //Can‘t be bigger than...
	        height = Math.min(desiredHeight, heightSize);
	    } else {
	        //Be whatever you want
	        height = desiredHeight;
	    }
	    //MUST CALL THIS
	    setMeasuredDimension(width, height);
	}
}
<com.view.PagerSlidingTabStripandroid:id="@+id/tabs"android:layout_width="fill_parent"android:layout_height="40dip"android:background="#009ABB"app:pstsDividerColor="#00000000"app:pstsIndicatorColor="#FF0000"app:pstsIndicatorHeight="1dip"app:pstsShouldExpand="true" />
记住调用的布局文件中要添加自定义命名空间:
xmlns:app="http://schemas.android.com/apk/res-auto"
自定义的属性需要在res/values/attrs.xml中定义:
<?xml version="1.0" encoding="utf-8"?><resources><declare-styleable name="PagerSlidingTabStrip"><attr name="pstsIndicatorColor" format="color" /><attr name="pstsUnderlineColor" format="color" /><attr name="pstsDividerColor" format="color" /><attr name="pstsIndicatorHeight" format="dimension" /><attr name="pstsUnderlineHeight" format="dimension" /><attr name="pstsDividerPadding" format="dimension" /><attr name="pstsTabPaddingLeftRight" format="dimension" /><attr name="pstsScrollOffset" format="dimension" /><attr name="pstsTabBackground" format="reference" /><attr name="pstsShouldExpand" format="boolean" /><attr name="pstsTextAllCaps" format="boolean" /></declare-styleable><declare-styleable name="DotIndicatorView"><attr name="innerColor" format="color" /><attr name="outerColor" format="color" /><!-- 圆点大小 --><attr name="size" format="dimension" /><!-- 每个点之间的间隔 --><attr name="distance" format="dimension" /><!-- 有几个点 --><attr name="number" format="integer" /><!-- 哪一个点被选中 --><attr name="selectedIndex" format="integer" /></declare-styleable></resources>
原文:http://blog.csdn.net/nnmmbb/article/details/22039949