Android自定義控件橫向柱狀統(tǒng)計(jì)圖
本文實(shí)例為大家分享了Android實(shí)現(xiàn)橫向柱狀統(tǒng)計(jì)圖的具體代碼,供大家參考,具體內(nèi)容如下
碰到一個(gè)項(xiàng)目需要用到統(tǒng)計(jì)圖功能,比較簡(jiǎn)單就自定義寫(xiě)了一個(gè)。沒(méi)有寫(xiě)過(guò)多的樣式和功能,僅有簡(jiǎn)單的橫向柱狀統(tǒng)計(jì)圖。
傳入數(shù)據(jù)后大致樣式如下:

/**橫向柱狀統(tǒng)計(jì)圖
* Created by Administrator on 2018/1/16 0016.
*/
public class HorizontalChartView extends View {
/**
* 間隔線畫(huà)筆
*/
private Paint paint;
/**
* 線的顏色
*/
private int color_line = Color.rgb(230, 230, 230);
/**
* 字的顏色
*/
private int color_font = Color.rgb(51, 51, 51);
/**
* 比例圖顏色
*/
private int color_plan = Color.rgb(22, 85, 164);
/**
* 比例圖畫(huà)筆
*/
private Paint paint_plan;
/**
* 比例圖高度
*/
private int plan_height;
/**
* 初始化比例
*/
private Float[] ratio = {0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f};
/**
* 文字畫(huà)筆1
*/
private Paint paint_font;
/**
* 文字畫(huà)筆2
*/
private Paint paint_font2;
/**
* 線的條數(shù)
*/
private int line_num = 11;
/**
* 比例數(shù)
*/
private String ratio_num = "0";
/**
* 月份
*/
private String month_num = "1月";
public HorizontalChartView(Context context) {
super(context);
}
public HorizontalChartView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public HorizontalChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public HorizontalChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs);
}
/**
* 初始化
*
* @param context
* @param attrs
*/
public void init(Context context, AttributeSet attrs) {
paint = new Paint();
paint.setColor(color_line);
paint_plan = new Paint();
paint_plan.setColor(color_plan);
paint_font = new Paint();
paint_font.setColor(color_font);
paint_font.setTextSize(DensityUtils.dp2px(context, 12));
paint_font.setAntiAlias(true);
paint_font.setTextAlign(Paint.Align.CENTER);
paint_font2 = new Paint();
paint_font2.setColor(color_font);
paint_font2.setTextSize(DensityUtils.dp2px(context, 12));
paint_font2.setAntiAlias(true);
paint_font2.setTextAlign(Paint.Align.RIGHT);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = getWidth();
int height = getHeight();
int lift_width = (int) (width * 0.15);
int line_width = (int) (width * 0.78);
//獲取底部文字信息
Paint.FontMetrics fm = paint_font.getFontMetrics();
int line_length = (int) (height - (fm.bottom - fm.top) - 4);
plan_height = (int) (line_length / 12 * 0.3);
for (int i = 0; i < line_num; i++) {
canvas.save();
if (i == 0) {
ratio_num = "0";
} else {
ratio_num = i + "0";
}
//底部百分比數(shù)字
canvas.drawText(ratio_num, lift_width + i * line_width / 10, height - 10, paint_font);
//網(wǎng)絡(luò)線
canvas.drawLine(lift_width + i * line_width / 10, 0, lift_width + i * line_width / 10, line_length, paint);
canvas.restore();
}
//獲取月份文字信息
Paint.FontMetrics fm1 = paint_font2.getFontMetrics();
for (int n = 12; n > 0; n--) {
canvas.save();
month_num = n + "月";
//左側(cè)月份
canvas.drawText(month_num, lift_width / 4 * 3, ((line_length / 12)) * (13 - n) - line_length / 24 + (fm1.bottom - fm1.top) / 2, paint_font2);
//比例圖
canvas.drawRect(lift_width, line_length / 12 * (13 - n) - (line_length / 24 + plan_height / 2) + fm1.bottom,
line_width * (ratio[n - 1] / 100) + lift_width, line_length / 12 * (13 - n) - (line_length / 24 + plan_height / 2) + plan_height + fm1.bottom, paint_plan);
canvas.restore();
}
}
/**
* 傳入比例信息
*
* @param ratio
*/
public void setRatio(Float[] ratio) {
this.ratio = ratio;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義控件實(shí)現(xiàn)通用驗(yàn)證碼輸入框(二)
- Android自定義控件實(shí)現(xiàn)通用驗(yàn)證碼輸入框
- Android自定義控件之圓形進(jìn)度條動(dòng)畫(huà)
- Android自定義控件之水平圓點(diǎn)加載進(jìn)度條
- Android自定義控件之刻度尺控件
- Android Studio 創(chuàng)建自定義控件的方法
- Android開(kāi)發(fā)自定義控件之折線圖實(shí)現(xiàn)方法詳解
- Android自定義控件實(shí)現(xiàn)時(shí)鐘效果
- Android自定義控件仿ios下拉回彈效果
- Android運(yùn)動(dòng)健康睡眠自定義控件的實(shí)現(xiàn)
相關(guān)文章
Android ViewFlipper簡(jiǎn)單用法解析
這篇文章主要為大家詳細(xì)介紹了Android ViewFlipper簡(jiǎn)單用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android酷炫動(dòng)畫(huà)效果之3D星體旋轉(zhuǎn)效果
本文要實(shí)現(xiàn)的3D星體旋轉(zhuǎn)效果是從CoverFlow演繹而來(lái),不過(guò)CoverFlow只是對(duì)圖像進(jìn)行轉(zhuǎn)動(dòng),我這里要實(shí)現(xiàn)的效果是要對(duì)所有的View進(jìn)行類似旋轉(zhuǎn)木馬的轉(zhuǎn)動(dòng)2018-05-05
flutter實(shí)現(xiàn)appbar下選項(xiàng)卡切換
這篇文章主要為大家詳細(xì)介紹了flutter實(shí)現(xiàn)appbar下選項(xiàng)卡切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Android事件分發(fā)機(jī)制(上) ViewGroup的事件分發(fā)
這篇文章主要為大家詳細(xì)介紹了Android ViewGroup的事件分發(fā)機(jī)制上篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Android4.4新增函數(shù)訪問(wèn)外部存儲(chǔ)
這篇文章主要介紹了Android4.4新增函數(shù)訪問(wèn)外部存儲(chǔ)的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
Android實(shí)現(xiàn)九宮格手勢(shì)密碼
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)九宮格手勢(shì)密碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
Android Manifest中meta-data擴(kuò)展元素?cái)?shù)據(jù)的配置與獲取方式
這篇文章主要介紹了Android Manifest中meta-data擴(kuò)展元素?cái)?shù)據(jù)的配置與獲取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03

