Android自定义控件横向柱状统计图

 更新时间:2020年07月16日 17:07:27   作者:尖叫_  
这篇文章主要为大家详细介绍了Android自定义控件横向柱状统计图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android实现横向柱状统计图的具体代码,供大家参考,具体内容如下

碰到一个项目需要用到统计图功能,比较简单就自定义写了一个。没有写过多的样式和功能,仅有简单的横向柱状统计图。

传入数据后大致样式如下:

/**横向柱状统计图
 * Created by Administrator on 2018/1/16 0016.
 */
public class HorizontalChartView extends View {
 
 /**
  * 间隔线画笔
  */
 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);
 
 /**
  * 比例图画笔
  */
 private Paint paint_plan;
 
 /**
  * 比例图高度
  */
 private int plan_height;
 
 /**
  * 初始化比例
  */
 private Float[] ratio = {0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f};
 
 /**
  * 文字画笔1
  */
 private Paint paint_font;
 
 /**
  * 文字画笔2
  */
 private Paint paint_font2;
 
 /**
  * 线的条数
  */
 private int line_num = 11;
 
 /**
  * 比例数
  */
 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";
   }
   //底部百分比数字
   canvas.drawText(ratio_num, lift_width + i * line_width / 10, height - 10, paint_font);
   //网络线
   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 + "月";
   //左侧月份
   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;
 }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android三种常见的图片压缩方式

    Android三种常见的图片压缩方式

    在开发中,我们经常有这样一种需求,从相册选择图片,上传到服务器。随着手机像素的不断提升,照片也是小一点的3,4兆,大一点的多大10多兆。如果直接上传原图,会增大服务器压力,所以,在上传之前对图片压缩就显得很必要了。
    2021-05-05
  • Android简单获取经纬度的方法

    Android简单获取经纬度的方法

    这篇文章主要介绍了Android简单获取经纬度的方法,涉及Android位置运算的相关操作技巧,需要的朋友可以参考下
    2016-08-08
  • 5种Android数据存储方式汇总

    5种Android数据存储方式汇总

    这篇文章主要为大家整理了5种Android数据存储方式,列出了各存储方式的优缺点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • C#中利用正则表达式将人民币金额转换为大写汉字

    C#中利用正则表达式将人民币金额转换为大写汉字

    这篇文章主要介绍了C#中利用正则表达式将人民币金额转换为大写汉字的方法,需要的朋友可以参考下
    2016-02-02
  • Android 蓝牙BLE开发完全指南

    Android 蓝牙BLE开发完全指南

    BLE蓝牙的兴起主要因为近年来可穿戴设备的流行,由于传统蓝牙功耗高不能满足可穿戴设备对于续航的要求,所以大部分可穿戴设备采用蓝牙4.0,即BLE蓝牙技术,这篇文章主要给大家介绍了关于Android 蓝牙BLE开发的相关资料,需要的朋友可以参考下
    2021-11-11
  • Android Webview使用小结

    Android Webview使用小结

    这篇文章主要针对Android Webview的使用方法为大家进行了详细的总结,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android 对话框 Dialog使用实例讲解

    Android 对话框 Dialog使用实例讲解

    对话框是在当前的页面之上弹出的小窗口, 用于显示一些重要的提示信息, 提示用户的输入,确认信息,或显示某种状态.如 : 显示进度条对话框, 退出提示.接下来通过本文给大家介绍android dialog对话框知识,感兴趣的朋友一起看看吧
    2016-09-09
  • Android解析XML文件升级APK的方法

    Android解析XML文件升级APK的方法

    这篇文章主要介绍了Android解析XML文件升级APK的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Android实现仿今日头条点赞动画效果实例

    Android实现仿今日头条点赞动画效果实例

    我想看到今日头条的点赞效果,应该都觉得很绚丽吧,下面这篇文章主要给大家介绍了关于Android实现仿今日头条点赞动画效果的相关资料,文中通过示例代价介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • android 使用uinput模拟输入设备的方法

    android 使用uinput模拟输入设备的方法

    这篇文章主要介绍了android 使用uinput模拟输入设备的方法,有需要的朋友可以参考一下
    2014-01-01

最新评论