Android環形統計控件

 這是一個相對簡單的自定義控件,是根據總人數和統計人數的比例,來畫出環形統計圖,原理就是在同一個圓心上畫上不同的圓形和扇形來達到想要的效果,該控件在屏幕適配上海有一些小問題,歡迎大家完善。下面是代碼:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.RectF;
import android.provider.MediaStore.Video;
import android.util.AttributeSet;
import android.view.View;

public class LoopView extends View
{
	private int width;
	private int height;
	private float center_x;
	private float center_y;
	private float left;
	private float right;
	private float top;
	private float bottom;

	private int angle = 90;
	private int startAngle = 270;



	private float innerRadius;
	private float outerRadius;
	private float barWidth = 15;

	private RectF rect;

	// private Paint circleRing;
	// private Paint circleColor;
	// private Paint textPaint;

	private int mAscent;
	private Paint loopPaint;
	private int count;
	private int maxCount;
	private int textSize = 47;

	public LoopView(Context context)
	{
		super(context);
		loopPaint = new Paint();
	}

	public LoopView(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		loopPaint = new Paint();
	}

	public LoopView(Context context, AttributeSet attrs, int defStyleAttr)
	{
		super(context, attrs, defStyleAttr);
		loopPaint = new Paint();
	}

	public void setCount(int c)
	{
		count = c;
	}

	public int getCount()
	{
		return count;
	}

	public void setMaxCount(int c)
	{
		maxCount = c;
	}

	public int getMaxCount()
	{
		return maxCount;
	}

	public void setTextSize(int c)
	{
		textSize = c;
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
	{
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		width=resolveSize(80, widthMeasureSpec);
		height=resolveSize(80, heightMeasureSpec);
		int size=(width>height)?height:width;
		center_x=width/2;
		center_y=height/2;
		
		outerRadius=size/2;
		barWidth=outerRadius/5;
		
		innerRadius=outerRadius-barWidth;
		
		left=center_x-outerRadius;
		right = center_x + outerRadius;
		top = center_y - outerRadius;
		bottom = center_y + outerRadius;
		rect=new RectF();
		rect.set(left, top, right, bottom);
		setMeasuredDimension(width, height);
	}

	@Override
	protected void onDraw(Canvas canvas)
	{
		super.onDraw(canvas);
		
		loopPaint.setColor(Color.GRAY);
		loopPaint.setAntiAlias(true);
		loopPaint.setStrokeWidth(15);
		canvas.drawCircle(center_x, center_y, outerRadius, loopPaint);
		
		loopPaint.setColor(Color.rgb(0, 189, 0));
		loopPaint.setAntiAlias(true);
		loopPaint.setStrokeWidth(25);
//		count = 75;
//		maxCount = 100;
		angle = (new Double(((float) count / (float) maxCount) * 360)).intValue();
		canvas.drawArc(rect, startAngle, angle, true,loopPaint);
		
		loopPaint.setColor(Color.WHITE);
		loopPaint.setAntiAlias(true);
		loopPaint.setStrokeWidth(15);
		canvas.drawCircle(center_x, center_y, innerRadius, loopPaint);
		
		loopPaint.setColor(Color.rgb(0, 189, 0));
		loopPaint.setAntiAlias(true);
		loopPaint.setTextAlign(Paint.Align.CENTER);
		loopPaint.setStrokeWidth(15);
		loopPaint.setTextSize(textSize);
		FontMetrics fontMetrics = loopPaint.getFontMetrics();
		float fontHeight = fontMetrics.bottom - fontMetrics.top;
		float textBaseY = height - (height - fontHeight) / 2 - fontMetrics.bottom;
		canvas.drawText(String.valueOf(count), center_y, textBaseY, loopPaint);

	}
	public void refalsh()
	{
		invalidate();
	}
}


源碼下載:http://download.csdn.net/detail/y280903468/9158929

效果圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章