1. 程式人生 > >android在程式碼裡直接畫出環形統計圖

android在程式碼裡直接畫出環形統計圖

先看效果圖。

具體實現程式碼如下:

/**
 * LangK
 * */
public class RingView extends TextView{

	public RingView(Context context) {
		super(context);
	}

	public RingView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public RingView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	
	/**
	 * 環的顏色
	 * */
	private final static int RingColor = Color.parseColor("#00C2C4");
	
	/**
	 * 進度的顏色
	 * */
	private final static int PecentColor = Color.GREEN;
	
	/**
	 * 畫筆
	 */
	private Paint paint;
	/**
	 * 是否第一次
	 */
	private boolean init = false;
	/**
	 * 背景
	 */
	private static final int BackGround = Color.parseColor("#FF0000");
	/**
	 * 已經完成的顏色
	 */
	private static final int CircleColor = Color.YELLOW;

	/**
	 * 完成扇形角度
	 */
	private static final float startAngle = 270;
	/**
	 * 扇形中心點X軸
	 */
	private float content_X;
	/**
	 * 扇形中心點Y軸
	 */
	private float content_Y;
	/**
	 * 環形外半徑
	 */
	private float bigRadius;
	/**
	 * 環形內半徑
	 */
	private float smallRadius;
	/**
	 * 預設終點角度
	 */
	private float SweepAngle = 270;
	/**
	 * 控制元件寬
	 */
	private int width;
	/**
	 * 控制元件高
	 */
	private int height;
	/**
	 * 檔案顯示的文字
	 */
	private String text;
	private static final int TEXTSIZE = 25;

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		if (!init) {
			initPaint();
		}
	}

	private void initPaint() {
		setPadding(0, 0, 0, 0);
		paint = new Paint();
		paint.setStyle(Style.FILL);
		paint.setAntiAlias(true);
		paint.setColor(RingColor);//ring的顏色
		width = getMeasuredWidth();
		height = getMeasuredHeight();
		bigRadius = ((float) width / 2);
		smallRadius = (float) width / 3;
		content_X = (float) width / 2;
		content_Y = (float) height / 2;
		init = true;
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		paint.setColor(RingColor);//ring的顏色
		Path path = new Path();
		path.reset();
		/*畫圓*/
		path.addCircle(content_X, content_Y, bigRadius -3 , Path.Direction.CCW);
		path.close();
		canvas.drawPath(path, paint);
		path.reset();
		paint.setColor(Color.WHITE);
		path.addCircle(content_X, content_Y, smallRadius, Path.Direction.CCW);
		path.close();
		canvas.drawPath(path, paint);
		getSectorClip(canvas,startAngle);
		path.reset();
		paint.setColor(Color.WHITE);
		path.addCircle(content_X, content_Y, smallRadius-3, Path.Direction.CCW);
		path.close();
		canvas.drawPath(path, paint);
		if (text!=null) {
			paint.setColor(Color.GREEN);
			paint.setFakeBoldText(true);
			paint.setTextSize(TEXTSIZE);
			canvas.drawText(text,width/4,height/2, paint);
		}
	}
	/**
	 * 返回一個扇形的剪裁區
	 * 
	 * @param canvas
	 *            //畫筆
	 * @param startAngle
	 *            //起始角度
	 */
	private void getSectorClip(Canvas canvas,float startAngle) {
		paint.setColor(PecentColor);//進度的顏色
		Path path = new Path();
		// 下面是獲得一個三角形的剪裁區
		path.moveTo(content_X, content_Y); // 圓心
		path.lineTo(
				(float) (content_X + bigRadius * Math.cos(startAngle * Math.PI / 180)), // 起始點角度在圓上對應的橫座標

				(float) (content_Y + bigRadius * Math.sin(startAngle * Math.PI / 180))); // 起始點角度在圓上對應的縱座標
		path.lineTo(
				(float) (content_X + bigRadius * Math.cos(SweepAngle * Math.PI / 180)), // 終點角度在圓上對應的橫座標

				(float) (content_Y + bigRadius * Math.sin(SweepAngle * Math.PI / 180))); // 終點點角度在圓上對應的縱座標
		path.close();
		// //設定一個正方形,內切圓
		RectF rectF = new RectF(content_X - bigRadius, content_Y - bigRadius, content_X + bigRadius,
				content_Y + bigRadius);
		// 下面是獲得弧形剪裁區的方法
		path.addArc(rectF, startAngle, SweepAngle - startAngle);
		canvas.drawPath(path,paint);
		
		
	}
	
	/**
	 * 返回一個扇形的剪裁區
	 * 
	 * @param canvas
	 *            //畫筆
	 * @param startAngle
	 *            //起始角度
	 */
	private void getSmallSectorClip(Canvas canvas,float startAngle) {
		paint.setColor(Color.WHITE);
		Path path = new Path();
		// 下面是獲得一個三角形的剪裁區
		path.moveTo(content_X, content_Y); // 圓心
		path.lineTo(
				(float) (content_X + smallRadius * Math.cos(startAngle * Math.PI / 180)), // 起始點角度在圓上對應的橫座標

				(float) (content_Y + smallRadius * Math.sin(startAngle * Math.PI / 180))); // 起始點角度在圓上對應的縱座標
		path.lineTo(
				(float) (content_X + smallRadius * Math.cos(SweepAngle * Math.PI / 180)), // 終點角度在圓上對應的橫座標

				(float) (content_Y + smallRadius * Math.sin(SweepAngle * Math.PI / 180))); // 終點點角度在圓上對應的縱座標
		path.close();
		// //設定一個正方形,內切圓
		RectF rectF = new RectF(content_X - smallRadius, content_Y - smallRadius, content_X + smallRadius,
				content_Y + smallRadius);
		// 下面是獲得弧形剪裁區的方法
		path.addArc(rectF, startAngle, SweepAngle - startAngle);
		canvas.drawPath(path,paint);
		
		
	}
	
	/**
	 * @param startAngle百分比
	 */
	public void setAngle(float startAngle){
		SweepAngle = (360*startAngle/100 + 270); 
	}
	
	public void setText(String text){
		this.text = text;
	}
}
程式碼中註釋已經寫的很清晰了,就不再贅述了。

相關推薦

android程式碼直接環形統計

先看效果圖。 具體實現程式碼如下: /** * LangK * */ public class RingView extends TextView{ public RingView(Context context) { super(context); }

Android自定義View一個時鐘(時針、分針、秒針)完美搭配當前時間走動

1、獲取時間值 private void getDatas() { SimpleDateFormat format = new SimpleDateFormat("HH,mm,ss"); String time = format

後臺程式碼執行彈指令碼方法!(Response.Write), Response.Write()彈窗的方法大全

//關閉,父視窗彈出對話方塊,子視窗直接關閉this.Response.Write("<script language=javascript>window.close();</script>");//關閉,父視窗和子視窗都不彈出對話方塊,直接關閉th

android自定義環形統計(帶動畫)

一、測試截圖 二、實現原理  package com.freedomanlib; import java.util.Timer; import java.util.TimerTask; import android.annotation.SuppressLint;

Android 程式碼動態設定TextView/Button等的文字顏色Seletor

前言 今天遇到個很蛋疼的問題,下載時,多個按鈕共用一個button,也就是不同下載狀態下,button的背景以及字型顏色都不一樣,結果自己挖了坑把自己埋進去了。 以下是我在/res/color資

Android TextView直接顯示圖片的三種方法

方法一:重寫TextView的onDraw方法,也挺直觀就是不太好控制顯示完圖片後再顯示字型所佔空間的位置關係。一般如果字型是在圖片上重疊的推薦這樣寫。時間關係,這個不付原始碼了。方法二:利用TextView支援部分Html的特性,直接用api賦圖片。程式碼如下://第一種方

求助使用matlab網絡

.html htm atl 畫出 tlab 網絡圖 tla com .com %E5%88%9A%E4%B8%8B%E7%9A%84CF4%E6%89%93%E5%AF%B9%E7%9A%84%E4%BB%A3%E7%A0%81%E4%B9%9F%E6%98%AF%E6%8

python心形

package div origin enc strip 心形 gin 畫出 gif 程序員表達愛的方式真是多種多樣。比如,用python來畫一個心型,獻給夢中的情人,代碼如下: from turtle import * pensize(1) pencolor(‘red

matplotlib中在for中多張

num () randint nump pict mat inf col int import matplotlib.pyplot as plt import numpy as np fig, axes = plt.subplots(2, 2) def showim(

vue使用echarts好看的

<template> <div class="charts"> <div id="main" style=" width:100%; height:350px;"></div> </div> </te

隨機生成(x,y)資料值,並散點

隨機生成(x,y)資料值,並畫出散點圖 import numpy as np import matplotlib.pyplot as plt r = []#生成兩個空列表 b = [] d=np.zeros((50,2)) print(d) Mean=0 STD=5 for i in r

如何用matlab有向(帶箭頭)

close all,clear,clc; cm =[       0     10     0 &nb

python文字挖掘輸出權重,詞頻等資訊,3d權重

# -*- coding: utf-8 -*- from pandas import read_csv import numpy as np from sklearn.datasets.base import Bunch import pickle # 匯入cPickle包

Pyecharts 根據經緯度和量值的大小,散點

      而今天我們主要介紹的是地圖+散點圖,地圖+熱力圖,應用到的函式是Geo,主要引數說明如下: attr:標籤名稱(在例子裡面就是地點) value:數值(在例子裡就是流動人員) visual_range:視覺化的數值範圍 symbol_size:

【matlab】全面總結:MATLAB如何漂亮的

畫圖前已有開啟的圖形視窗,則再畫圖系統將自動 擦掉座標系中已有的圖形物件,但設定了hold on後,可以保持座標系中已繪出 的圖形.  33 01234567 -1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 圖(a)  還可以進一步設定包括線的寬度(LineWidth),

echarts圓環統計並載入動態資料 (ajax獲取資料)

最近,要用到echarts畫餅圖統計圖,於是學習了會,附上echarts官網 http://echarts.baidu.com/doc/example.html 看到echarts有一些餅圖例項,程式碼如下: option = {     tooltip : {     

Android自定義View——彩色圓環統計

效果展示實現步驟1、初始化變數 //-------------必須給的資料相關------------- private String[] str = new String[]{"一年級", "二年級", "三年級", "四年級", "五年級", "六年級"};

Python柱狀統計

一、工具:python的matplotlib.pyplot 庫 二、案例: import matplotlib.pyplot as plt import numpy as np #新增圖形屬性 p

在EA中將的ER轉換成SQL指令碼

    在進行資料庫設計的時候,想著正好安裝著EA軟體呢,看能不能用EA畫ER模型。結果發現不僅能畫,而且還能進行整套資料庫設計(生成SQL指令碼)。     下面以機房收費系統使用者--學生為例。學

微信小程式彈loading層的兩種方法:直接程式碼控制,在wxml檔案里布局彈窗loading層,利用條件渲染,在js程式碼控制是否顯示loading層。

微信小程式彈出loading層的兩種方法:直接在程式碼裡控制,在wxml檔案里布局彈窗loading層,利用條件渲染,在js程式碼裡控制是否顯示loading層。  直接在程式碼裡控制 js程式碼 showLoading:function(){ wx.showToast({