源码如下:
package com.shouwei.csdn.customview;
import com.shouwei.csdn.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
/**
* 启动页小圆点
*
* @author sw
* @date 2015-6-8
*/
public class SelectPointView extends View {
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 小圆点的总数量
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private int count = 4, position = 0;
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 小圆点点击事件回调
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private OnPointSelectListener listener;
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 画笔
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private Paint paint = new Paint();
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 小圆点选中与未选中时的背景
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private Bitmap selected, unselect;
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 所画小圆点Y坐标起点,X坐标起点,单个小圆点的宽度,整个VIEW的宽度与高度
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private float drawHeight, drawWidth, singleWidth, width, height,radius=0;
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 是否自己创建bitmap
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>private boolean isCreateBitmap = false;
<span style="white-space:pre"> </span>public SelectPointView(Context context, int count) {
<span style="white-space:pre"> </span>super(context);
<span style="white-space:pre"> </span>this.count = count;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public SelectPointView(Context context, AttributeSet attr) {
<span style="white-space:pre"> </span>super(context, attr);
<span style="white-space:pre"> </span>TypedArray ta = context.obtainStyledAttributes(attr, R.styleable.SelectPointView);
<span style="white-space:pre"> </span>int typeCount = ta.getIndexCount();
<span style="white-space:pre"> </span>for (int i = 0; i < typeCount; i++) {
<span style="white-space:pre"> </span>int id = ta.getIndex(i);
<span style="white-space:pre"> </span>switch (id) {
<span style="white-space:pre"> </span>// 小圆点的数量
<span style="white-space:pre"> </span>case R.styleable.SelectPointView_pointcount:
<span style="white-space:pre"> </span>count = ta.getInteger(id, 0);
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>// 小圆点选中时的背景
<span style="white-space:pre"> </span>case R.styleable.SelectPointView_selectpic:
<span style="white-space:pre"> </span>selected = BitmapFactory.decodeResource(getResources(), ta.getResourceId(id, 0));
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>// 小圆点未选中时的背景
<span style="white-space:pre"> </span>case R.styleable.SelectPointView_unselectpic:
<span style="white-space:pre"> </span>unselect = BitmapFactory.decodeResource(getResources(), ta.getResourceId(id, 0));
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>default:
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>protected void onDraw(Canvas canvas) {
<span style="white-space:pre"> </span>super.onDraw(canvas);
<span style="white-space:pre"> </span>//设置抗锯齿
<span style="white-space:pre"> </span>paint.setAntiAlias(true);
<span style="white-space:pre"> </span>width = getWidth();
<span style="white-space:pre"> </span>height = getHeight();
<span style="white-space:pre"> </span>if (selected == null||unselect==null) {
<span style="white-space:pre"> </span>isCreateBitmap = true;
<span style="white-space:pre"> </span>if (width/count>=height) {
<span style="white-space:pre"> </span>radius=height/2*2/3;
<span style="white-space:pre"> </span>}else{
<span style="white-space:pre"> </span>radius=width/count/2*2/3;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}else{
<span style="white-space:pre"> </span>drawHeight = getHeight() / 2 - (selected.getHeight() / 2);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>Log.i("savion", "radius==="+radius);
<span style="white-space:pre"> </span>if (count != 0) {
<span style="white-space:pre"> </span>singleWidth = width / count;
<span style="white-space:pre"> </span>for (int i = 0; i < count; i++) {
<span style="white-space:pre"> </span>if (!isCreateBitmap) {
<span style="white-space:pre"> </span>drawWidth = (i + 1) * singleWidth - singleWidth / 2 - selected.getWidth() / 2;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//是否使用自己创建的bitmap
<span style="white-space:pre"> </span>if (isCreateBitmap) {
<span style="white-space:pre"> </span>if (i == position) {
<span style="white-space:pre"> </span>paint.setColor(Color.RED);
<span style="white-space:pre"> </span>canvas.drawCircle((i+1)*singleWidth-singleWidth/2, height/2, radius, paint);
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>paint.setColor(Color.YELLOW);
<span style="white-space:pre"> </span>canvas.drawCircle((i+1)*singleWidth-singleWidth/2, height/2, radius, paint);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>if (i == position) {
<span style="white-space:pre"> </span>canvas.drawBitmap(selected, drawWidth, drawHeight, paint);
<span style="white-space:pre"> </span>} else {
<span style="white-space:pre"> </span>canvas.drawBitmap(unselect, drawWidth, drawHeight, paint);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public boolean onTouchEvent(MotionEvent event) {
<span style="white-space:pre"> </span>int currentPos = (int) (event.getX() / getWidth() * count);
<span style="white-space:pre"> </span>if (event.getAction() == MotionEvent.ACTION_UP) {
<span style="white-space:pre"> </span>listener.onPointSelect(currentPos);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return true;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 设置数量
<span style="white-space:pre"> </span> * @auth shouwei
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public void setCount(int c){
<span style="white-space:pre"> </span>count=c;
<span style="white-space:pre"> </span>invalidate();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 设置被选中时的小圆背景
<span style="white-space:pre"> </span> * @auth shouwei
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public void setSelectPic(Bitmap bit) {
<span style="white-space:pre"> </span>selected = bit;
<span style="white-space:pre"> </span>if (selected!=null&&unselect!=null) {
<span style="white-space:pre"> </span>isCreateBitmap=false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>invalidate();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 设置未被选中时的背景
<span style="white-space:pre"> </span> *
<span style="white-space:pre"> </span> * @param bit
<span style="white-space:pre"> </span> * @auth shouwei
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public void setUnSelectPic(Bitmap bit) {
<span style="white-space:pre"> </span>unselect = bit;
<span style="white-space:pre"> </span>if (unselect!=null&&selected!=null) {
<span style="white-space:pre"> </span>isCreateBitmap=false;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>invalidate();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 设置当前被选中小圆点position
<span style="white-space:pre"> </span> *
<span style="white-space:pre"> </span> * @param position
<span style="white-space:pre"> </span> * @auth shouwei
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public void setPosition(int position) {
<span style="white-space:pre"> </span>this.position = position;
<span style="white-space:pre"> </span>invalidate();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 设置监听
<span style="white-space:pre"> </span> * @param l
<span style="white-space:pre"> </span> * @auth shouwei
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public void setOnPointSelectListener(OnPointSelectListener l) {
<span style="white-space:pre"> </span>this.listener = l;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public interface OnPointSelectListener {
<span style="white-space:pre"> </span>public void onPointSelect(int position);
<span style="white-space:pre"> </span>}
}
接下来是在values文件夹下新建一个attrs文件,写入自定义属性,如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 声明属性级的名称 -->
<declare-styleable name="SelectPointView">
<!-- 声明一个属性,整型 -->
<!-- 声明一个属性,字符串 -->
<!-- 声明一个属性,引用,引用资源id -->
<!-- 小圆点的个数 -->
<attr name="pointcount" format="integer"/>
<!-- 被选中圆点有资源图片 -->
<attr name="selectpic" format="reference"/>
<!-- 未被选中小圆点的资源图片 -->
<attr name="unselectpic" format="reference"/>
</declare-styleable>
</resources>
之后可以在类文件中设置小圆点的点击监听,设置圆点个数与圆点资源图片。
当配置文件与类文件中都不设置资源图片时,会默认画一个黑色与灰色的圆点代表选中与未选中。