需要创建两个文件
attrs_MyArcScaleMap.xml文件定义新控件的xml属性,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyArcScaleMap">
<attr name="myArcScaleMap_titleText" format="string"/>
<attr name="myArcScaleMap_titleTextColor" format="color"/>
<attr name="myArcScaleMap_titleTextSize" format="dimension"/>
</declare-styleable>
</resources>
MyArcScaleMap.java文件包括如下内容:
构造方法:获取自定义的属性集(attrs.xml),创建TypedArray类来获取属性集,获取完属性集后需要调 用recycle()方法来避免重新创建的时候的错误;
画笔初始化方法initXxx():初始化画笔参数;
重载onDraw()方法:定义新控件的画布;
重载onMeasure()方法:获取并设置新控件的宽 高;
全部代码如下:
package com.example.administrator.customwidget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class MyArcScaleMap extends View {
private int mMeasureHeight;
private int mMeasureWidth;
private String mArcScaleMapTitleText;
private int mArcScaleMapTitleTextColor;
private float mArcScaleMapTitleTextSize;
private Paint mCirclePaint,mArcPaint,mTextPaint;
private float mCircleXY;
private float mRadius; //定义圆弧半径
private RectF mArcRectF;
float mSweepAngle = 0;
private float mSweepValue = -60;
//构造方法
public MyArcScaleMap(Context context){
super(context);
}
public MyArcScaleMap(Context context, AttributeSet attrs,int defStyleAttr){
super(context,attrs,defStyleAttr);
}
/**
* MyArcScaleMap 构造方法
* @param context 上下文 参数
* @param attrs xml参数
*/
public MyArcScaleMap(Context context, AttributeSet attrs){
super(context,attrs);
TypedArray ta = context.obtainStyledAttributes( attrs,R.styleable.MyArcScaleMap);
mArcScaleMapTitleText = ta.getString(R.styleable.MyArcScaleMap_myArcScaleMap_titleText);
mArcScaleMapTitleTextColor = ta.getColor(R.styleable.MyArcScaleMap_myArcScaleMap_titleTextColor, 0);
mArcScaleMapTitleTextSize =ta.getDimension(R.styleable.MyArcScaleMap_myArcScaleMap_titleTextSize,40);
ta.recycle();
}
/**
* 重载onDraw方法,重定义画布
* @param canvas 控件画布参数
* canvas.drawCircle 画圆
* canvas.drawArc 画圆弧
* canvas.drawText 写字
*/
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
this.initMyArcScaleMap();
//绘制圆
canvas.drawCircle(mCircleXY,mCircleXY,mRadius,mCirclePaint);
//绘制圆弧
canvas.drawArc(mArcRectF,0,mSweepAngle,false,mArcPaint);
//绘制TEXT
canvas.drawText(mArcScaleMapTitleText,0,mArcScaleMapTitleText.length(),
mCircleXY,mCircleXY + (mArcScaleMapTitleTextSize/4),mTextPaint);
}
/**
* 控件大小测量
* @param widthMeasureSpec 控件宽
* @param heightMeasureSpec 控件高
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
mMeasureWidth = MeasureSpec.getSize(widthMeasureSpec);
mMeasureHeight = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(mMeasureWidth,mMeasureHeight);
}
/**
* initMyArcScaleMap() 初始化方法
* 初始化mCirclePaint mArcPaint mTextPaint等画笔参数
*/
public void initMyArcScaleMap(){
float length = 0;
if(mMeasureHeight >= mMeasureWidth){
length = mMeasureWidth;
}else {
length =mMeasureHeight;
}
mCircleXY = length/2;
mRadius = (float)(length*0.5)/2;
mCirclePaint = new Paint();
mCirclePaint.setAntiAlias(true);
mCirclePaint.setColor(getResources().getColor(android.R.color.holo_blue_bright));
mArcRectF = new RectF(
(float) (length * 0.1),
(float) (length * 0.1),
(float) (length * 0.9),
(float) (length * 0.9));
mSweepAngle = (mSweepValue / 100f) * 360f;
mArcPaint = new Paint();
mArcPaint.setAntiAlias(true);
mArcPaint.setColor(getResources().getColor(android.R.color.holo_blue_bright));
mArcPaint.setStrokeWidth((float) (length * 0.1));
mArcPaint.setStyle(Paint.Style.STROKE);
mTextPaint = new Paint();
mTextPaint.setTextSize(mArcScaleMapTitleTextSize);
mTextPaint.setColor(mArcScaleMapTitleTextColor);
mTextPaint.setTextAlign(Paint.Align.CENTER);
this.invalidate();
}
}