<declare-styleable name="PanePicView">
<attr name="maxValue" format="integer"/>
</declare-styleable>
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.MeasureSpec;
public class PanePicView extends View {
private int mStartAngle = 180;
private int DURING_ARC = 180;
private int mMinValue = 0; // 最小值
private int mMaxValue = 200; // 最大值
public PanePicView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PanePicView, defStyleAttr, 0);
mMaxValue = a.getInteger(R.styleable.PanePicView_maxValue, 200);
init();
}
public PanePicView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public PanePicView(Context context) {
this(context,null);
}
private Paint mPaint;
private Path mPath;
private Rect mRect;
private void init(){
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPath = new Path();
mRect = new Rect();
}
private int mViewWidth; // 控件宽度
private int mViewHeight; // 控件高度
private float mCenterX;
private float mCenterY;
private int mPercent; //seekBar传入的值
private int innerRadios = 30;
private int pointRadios = 4;
private int pointLenght = 30;
private int pointRadiosOfset = 2;//指针小圆偏移量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY) {
mViewWidth = widthSize;
} else {
mViewWidth = 204;
}
if (heightMode == MeasureSpec.EXACTLY) {
mViewHeight = heightSize;
} else {
mViewHeight = 134;
}
mCenterX = mViewWidth/2;
mCenterY = 92;
setMeasuredDimension(mViewWidth, mViewHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
float angel = (DURING_ARC * (mPercent - mMinValue) / (mMaxValue - mMinValue)); // 指针与水平线夹角
canvas.rotate(angel, mCenterX, mCenterY);
mPaint.setStyle(Style.FILL);
mPaint.setStrokeWidth(2);
mPaint.setColor(Color.RED);
canvas.drawCircle(mCenterX-innerRadios/3*2+pointRadiosOfset, mCenterY, pointRadios, mPaint);
canvas.translate(mCenterX-innerRadios/3*2+pointRadiosOfset, mCenterY);
mPath.moveTo(0, -pointRadios);
mPath.lineTo(0, -pointRadios);
mPath.lineTo(-pointLenght, 0);
mPath.lineTo(0, pointRadios);
mPath.close();
canvas.drawPath(mPath, mPaint);
canvas.restore();
canvas.translate(mCenterX, mCenterY);
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth(1);
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(16);
mPaint.setTextAlign(Paint.Align.CENTER);
mPaint.getTextBounds(String.valueOf(mPercent), 0, String.valueOf(mPercent).length(), mRect);
Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
float top = fontMetrics.top;
float bottom = fontMetrics.bottom;
int baseLineY = (int) (mRect.centerY() - top/2 - bottom/2);
canvas.drawText(String.valueOf(mPercent), mRect.left,baseLineY, mPaint);
canvas.restore();
}
public void setPercent(int percent) {
mPercent = percent;
invalidate();
}
// public void setPercent(float percent) {
// mPercent = percent;
// invalidate();
// }
}