效果图:

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ccv.turbosnail.one.PColumnandroid:layout_width="400dp"android:layout_height="400dp"android:layout_centerInParent="true"/></RelativeLayout>

新建 PColumn 类并继承 View

PColumn.java:

public class PColumn extends View {private static Context context = null;private static AttributeSet attributeSet = null;/*** 自定义view实现柱状图* 首先定义一个类实现View*///定义画笔private Paint mLinePaint;private Paint mGreenPaint;private Paint mTextPaint;//定义上下文private Context mContext;//定义宽高private float weight;private float height;private float mScale;//这个数组是高度的值private String[] y_title = {"100", "80", "60", "40", "20", "0"};//分别为定义数据与数据源名称的集合private static List<Long> mData;private static List<String> mNames;public PColumn(Context context, @Nullable AttributeSet attrs) {super(context, attrs);PColumn.context = context;attributeSet = attrs;//给定义的画笔进行加工mContext = context;mLinePaint = new Paint();mGreenPaint = new Paint();mTextPaint = new Paint();mLinePaint.setARGB(255, 223, 233, 231);mGreenPaint.setARGB(255, 0, 200, 149);mTextPaint.setARGB(255, 153, 153, 153);mGreenPaint.setStyle(Paint.Style.FILL);mTextPaint.setAntiAlias(true);mGreenPaint.setAntiAlias(true);mLinePaint.setAntiAlias(true);mScale = context.getResources().getDisplayMetrics().density;}//尺寸发生改变的时候调用@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);weight = 0.7F * w;height = 0.70F * h;}//绘制@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);float min_height = height / 5;for (int i = 5; i >= 0; i--) {if (i == 5) {mLinePaint.setARGB(255, 131, 148, 144);} else {mLinePaint.setARGB(255, 223, 233, 231);}canvas.drawLine(70 * mScale, 30 * mScale + min_height * i, 70 * mScale + weight, 30 * mScale + min_height * i, mLinePaint);mTextPaint.setTextAlign(Paint.Align.RIGHT);mTextPaint.setTextSize(10 * mScale);canvas.drawText(y_title[i], 60 * mScale, 32 * mScale + min_height * i, mTextPaint);}float min_weight = (weight - 70 * mScale) / (mData.size());mTextPaint.setTextSize(12 * mScale);mTextPaint.setTextAlign(Paint.Align.CENTER);for (int i = 0; i < mData.size(); i++) {int leftR = (int) (70 * mScale + i * min_weight + min_weight / 2);int rightR = leftR + (int) (min_weight / 2);int buttomR = (int) (30 * mScale + min_height * 5);int topR = buttomR - (int) (height / 100 * mData.get(i));canvas.drawRect(new RectF(leftR, topR, rightR, buttomR), mGreenPaint);mTextPaint.setARGB(255, 153, 153, 153);canvas.drawText(mNames.get(i), leftR + min_weight / 4, buttomR + 20 * mScale, mTextPaint);mTextPaint.setARGB(255, 51, 51, 51);canvas.drawText(mData.get(i) + "", leftR + min_weight / 4, topR - 10 * mScale, mTextPaint);}}//传入数据并进行绘制public PColumn(List<Long> data, List<String> name) {super(PColumn.context,PColumn.attributeSet);mData = data;mNames = name;invalidate();}}

MainActivity.java

public class MainActivity extends AppCompatActivity {private static List<Long> mData;        //  数据值private static List<String> mNames;     //  数据姓名@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_cartogram);//  柱形图initSQLiteTwo();PColumn pColumn = new PColumn(mData,mNames);    //  将数据源传递给自定义柱形图类}private void initSQLiteTwo() {//初始化数据mData = new ArrayList<>();mNames = new ArrayList<>();mData = new ArrayList<>();mNames = new ArrayList<>();mData.add((long) 20);       mData.add((long) 10);mData.add((long) 30);mData.add((long) 40);mNames.add("停车费");mNames.add("过路费");mNames.add("油费");mNames.add("罚款");}
}

Android 柱状图(自定义View)相关推荐

  1. android 动态画直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...

    本文讲述了Android使用自定义view在指定时间内匀速画一条直线的实例代码.分享给大家供大家参考,具体如下: 1.效果图: 2.自定义view实现 public class UniformLine ...

  2. Android 系统(264)---android进阶——自定义View

    android进阶--自定义View 软件架构 01.自定义View简介 - onMeasure,onDraw,自定义属性  https://www.jianshu.com/p/48944aad200 ...

  3. android 动态生成直线,Android使用自定义view在指定时间内匀速画一条直线的实例代码...

    本文讲述了Android使用自定义view在指定时间内匀速画一条直线的实例代码.分享给大家供大家参考,具体如下: 1.效果图: 2.自定义view实现 public class UniformLine ...

  4. android五子棋编程教程全集,android简单自定义View实现五子棋

    本文实例为大家分享了android自定义View实现五子棋的具体代码,供大家参考,具体内容如下 先说一下吧,android的自定义View就是自己实现一个类去继承View,实现其中的方法,这里面我最感 ...

  5. Android 中自定义View 裁剪扇形图片

    Android 中自定义View 裁剪扇形图片 当需要裁剪图片为扇形区域时,使用Canvas.clipPath(path)方法可以裁剪为扇形区域 ps:此方法会导致绘制图片边缘有锯齿,暂无解决方法(知 ...

  6. 【Android】自定义View、画家(画布)Canvas与画笔Paint的应用——画图、涂鸦板app的实现

    利用一个简单的画图app来说明安卓的图形处理类与自定义View的应用. 如下图,有一个供用户自己任意画图.涂鸦的app, 这里不做那么花俏了,仅提供黑白两色,但可以改变笔尖的粗细. 实质上这里的橡皮擦 ...

  7. android开发自定义View(三)仿芝麻信用积分

    此文参考了https://github.com/HotBitmapGG/CreditSesameRingView 感谢作者的分享!! 首先看一下支付宝上显示的样子 然后看一下模仿的效果 代码 基础部分 ...

  8. Android 高级自定义View实战

    2019独角兽企业重金招聘Python工程师标准>>> 在android组件中主要分为两种:容器(LinearLayout....)和子View(TextView......),但是 ...

  9. Android之自定义View以及画一个时钟

    https://www.2cto.com/kf/201509/443112.html 概述: 当Android自带的View满足不了开发者时,自定义View就发挥了很好的作用. 建立一个自定义View ...

  10. Android中自定义View的研究 -- 在XML中引用自定义View

    如果在一直使用SetContentView(new HellwView(this)觉得总是少了一点东西,少了什么了,失去了Android中使用XML定义组件的便携性,这种感觉让人很不爽,呵呵,在这节里 ...

最新文章

  1. 2020级HAUT新生周赛(四)@张承树专场
  2. OpenCV数字图像处理(5) 像素访问之添加椒盐实例 通道分离与合并
  3. Java IO流中 File文件对象与Properties类(四)
  4. 【Android 插件化】VirtualApp 源码分析 ( 添加应用源码分析 | LaunchpadAdapter 适配器 | 适配器添加元素 | PackageAppData 元素 )
  5. python3实现抓取网页资源的 N 种方法(内附200GPython学习资料)
  6. maven如何将本地jar安装到本地仓库
  7. ExtJs UI框架学习三
  8. python如何计算字符宽度_Python中计算字符宽度
  9. DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
  10. 资深程序员的笔记:工作多年对于编程语言的理解,新手建议了解!
  11. 面试突然问Java多线程底层原理,我哭了!
  12. 如何编写优雅的代码:06. 设计模式应用案例(上)
  13. unity获得运动物体前后时刻的位置坐标pos值
  14. 天勤2022数据结构(七)排序
  15. js html 导出excel文件,js 导出excel ,elsx格式
  16. Landsat8处理小工具(python)
  17. 0x0f的java写法_0x0f(0x0f转化十进制)
  18. 特种作业操作证2021电工作业2021年电气试验考试题库
  19. 微信端浏览器不会自动播放视频音频
  20. 4核处理器_AMD新款4核处理器899元,配一套电脑是不是可以更便宜了?

热门文章

  1. yum 崩溃的解决方法
  2. 利用Pelican搭建个人博客
  3. iPhone 6/6 Plus 出现后,如何改进工作流以实现一份设计稿支持多个尺寸?
  4. mouseover与mouseenter、 mouseout与mouseleave的区别
  5. 【论文笔记】EMNLP2019: 基于层次多图卷积网络的实体类型分类
  6. Python动态数据展示
  7. 每日算法系列【LeetCode 927】三等分
  8. [NAACL18]What's Going On in Neural Constituency Parsers? An Analysis(神经成分句法分析器的一些分析)...
  9. [论文翻译]Attention Is All You Need
  10. HTML5移动开发即学即用(双色)