canvas.drawText(String.valueOf(mYLevel.get(index)), mZeroPos[0], mZeroPos[1]-(index*offsetY), mPaint);}if (index == mGridLevel) {//坐标区间 = 真实区间 + 1break;}mPaint.setColor(mGridColorLevel.get(mGridLevel - 1 - index));mPaint.setStyle(Paint.Style.FILL);//绘制区间叠加图谱方块,从远到0坐标,因为小的图会覆盖大的图canvas.drawRect(mMaxYPos[0], mMaxYPos[1] + index*offsetY, mMaxXPos[0]-index*offsetX, mMaxXPos[1], mPaint);mPaint.setColor(mGridTxtColorLevel.get(index));mPaint.setTextAlign(Paint.Align.RIGHT);mPaint.setTextSize(mXYTitleTextSize);//绘制每个方块状态区间的提示文字canvas.drawText(mGridLevelText.get(index), mMaxXPos[0] - index * offsetX - mXYTitleTextSize,mMaxYPos[1] + index * offsetY + mXYTitleTextSize, mPaint);}//绘制当前坐标drawNotice(canvas, offsetX, offsetY);}private void drawNotice(Canvas canvas, int offsetX, int offsetY) {int realPosX = 0;int realPosY = 0;//计算传入的x值与真实屏幕坐标的像素值的百分比差值转换for (int index=0; index<mGridLevel; index++) {if (mMeasureXpos >= mXLevel.get(index) && mMeasureXpos < mXLevel.get(index+1)) {int subValue = mMeasureXpos - mXLevel.get(index);int offset = mXLevel.get(index+1) - mXLevel.get(index);realPosX = mZeroPos[0] + index*offsetX + (subValue / offset);break;}}//计算传入的y值与真实屏幕坐标的像素值的百分比差值转换for (int index=0; index<mGridLevel; index++) {if (mMeasureYpos >= mYLevel.get(index) && mMeasureYpos < mYLevel.get(index+1)) {int subValue = mMeasureYpos - mYLevel.get(index);int offset = mYLevel.get(index+1) - mYLevel.get(index);realPosY = mZeroPos[1] - index*offsetY - (offsetY - (subValue / offset));break;}}//画我们传入的坐标点的标记小红点mPaint.setColor(Color.RED);mPaint.setStyle(Paint.Style.FILL);canvas.drawCircle(realPosX, realPosY, 8, mPaint);int[] centerPos = {mZeroPos[0] + mRealWidth/2, mZeroPos[1] - mRealHight/2};mPaint.setColor(Color.WHITE);mPaint.setStyle(Paint.Style.FILL_AND_STROKE);RectF rectF = null;Path path = new Path();//画红点旁边的提示框和文字,有四个区域,然后提示框的小三角指标方位不同if (realPosX <= centerPos[0] && realPosY >= centerPos[1]) {//left-bottom//画三角形path.moveTo(realPosX+5, realPosY+5);path.lineTo(realPosX+15, realPosY+15);path.lineTo(realPosX+15, realPosY-15);//画矩形背景rectF = new RectF(realPosX+15, realPosY-40, realPosX+200, realPosY + 30);canvas.drawRoundRect(rectF, 15, 15, mPaint);//画提示框的文字mPaint.reset();mPaint.setColor(Color.RED);mPaint.setTextSize(mXYTitleTextSize - 5);canvas.drawText("("+mMeasureXpos+", "+mMeasureYpos+")", realPosX+30, realPosY, mPaint);}else if (realPosX <= centerPos[0] && realPosY < centerPos[1]) {//left-toppath.moveTo(realPosX+5, realPosY+5);path.lineTo(realPosX+15, realPosY+15);path.lineTo(realPosX + 15, realPosY - 15);rectF = new RectF(realPosX+15, realPosY - 20, realPosX+200, realPosY + 50);canvas.drawRoundRect(rectF, 15, 15, mPaint);mPaint.reset();mPaint.setColor(Color.RED);mPaint.setTextSize(mXYTitleTextSize - 5);canvas.drawText("("+mMeasureXpos+", "+mMeasureYpos+")", realPosX+30, realPosY+20, mPaint);}else if (realPosX > centerPos[0] && realPosY >= centerPos[1]) {//right-bottompath.moveTo(realPosX-5, realPosY+5);path.lineTo(realPosX-15, realPosY+15);path.lineTo(realPosX - 15, realPosY - 15);rectF = new RectF(realPosX-200, realPosY-40, realPosX-15, realPosY + 30);canvas.drawRoundRect(rectF, 15, 15, mPaint);mPaint.reset();mPaint.setColor(Color.RED);mPaint.setTextSize(mXYTitleTextSize - 5);canvas.drawText("("+mMeasureXpos+", "+mMeasureYpos+")", realPosX-180, realPosY, mPaint);}else if (realPosX > centerPos[0] && realPosY < centerPos[1]) {//right-toppath.moveTo(realPosX-5, realPosY+5);path.lineTo(realPosX-15, realPosY+15);path.lineTo(realPosX - 15, realPosY - 15);rectF = new RectF(realPosX-200, realPosY - 20, realPosX-15, realPosY + 50);canvas.drawRoundRect(rectF, 15, 15, mPaint);mPaint.reset();mPaint.setColor(Color.RED);mPaint.setTextSize(mXYTitleTextSize - 5);canvas.drawText("("+mMeasureXpos+", "+mMeasureYpos+")", realPosX-180, realPosY+30, mPaint);}path.close();mPaint.setColor(Color.WHITE);mPaint.setStyle(Paint.Style.FILL_AND_STROKE);canvas.drawPath(path, mPaint);}//设置当前比值public void updateValues(int x, int y) {mMeasureXpos = x;mMeasureYpos = y;postInvalidate();}//设置XY轴顶角的title字体大小public void setTitleTextSize(int size) {mXYTitleTextSize = size;}//初始化X轴的坐标区间点值,可以不均等分public void initXLevelOffset(ArrayList<Integer> list) {mXLevel.clear();mXLevel.addAll(list);}//初始化Y轴的坐标区间点值,可以不均等分public void initYLevelOffset(ArrayList<Integer> list) {mYLevel.clear();mYLevel.addAll(list);}//初始化每个区间的提示文字,如果不想显示可以设置""public void initGridLevelText(ArrayList<String> list) {mGridLevelText.clear();mGridLevelText.addAll(list);}//初始化每个区间的颜色public void initGridColorLevel(ArrayList<Integer> list) {mGridColorLevel.clear();mGridColorLevel.addAll(list);}//初始化每个区间的提示文字颜色public void initGridTxtColorLevel(ArrayList<Integer> list) {mGridTxtColorLevel.clear();mGridTxtColorLevel.addAll(list);}//初始化XY轴titlepublic void initTitleXY(String x, String y) {mTitleX = x;mTitleY = y;}

}

再来看下布局文件:

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"android:layout_height="match_parent"><com.yanbober.customerviewdemo.areachartsview.AreaChartsViewandroid:id="@+id/area_charts_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="10dp"/>
再看看主界面:

public class MainActivity extends AppCompatActivity {

private AreaChartsView mAreaChartsView;private Timer timer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mAreaChartsView = (AreaChartsView) this.findViewById(R.id.area_charts_view);//初始化自定义图表的规格和属性ArrayList<Integer> mXLevel = new ArrayList<>();ArrayList<Integer> mYLevel = new ArrayList<>();ArrayList<String> mGridLevelText = new ArrayList<>();ArrayList<Integer> mGridColorLevel = new ArrayList<>();ArrayList<Integer> mGridTxtColorLevel = new ArrayList<>();//初始化x轴坐标区间mXLevel.add(0);mXLevel.add(60);mXLevel.add(90);mXLevel.add(100);mXLevel.add(110);mXLevel.add(120);//初始化y轴坐标区间mYLevel.add(0);mYLevel.add(90);mYLevel.add(140);mYLevel.add(160);mYLevel.add(180);mYLevel.add(200);//初始化区间颜色mGridColorLevel.add(Color.parseColor("#1FB0E7"));mGridColorLevel.add(Color.parseColor("#4FC7F4"));mGridColorLevel.add(Color.parseColor("#4FDDF2"));mGridColorLevel.add(Color.parseColor("#90E9F4"));mGridColorLevel.add(Color.parseColor("#B2F6F1"));//初始化区间文字提示颜色mGridTxtColorLevel.add(Color.parseColor("#EA8868"));mGridTxtColorLevel.add(Color.parseColor("#EA8868"));mGridTxtColorLevel.add(Color.parseColor("#EA8868"));mGridTxtColorLevel.add(Color.WHITE);mGridTxtColorLevel.add(Color.BLACK);//初始化区间文字mGridLevelText.add("异常");mGridLevelText.add("过高");mGridLevelText.add("偏高");mGridLevelText.add("正常");mGridLevelText.add("偏低");mAreaChartsView.initGridColorLevel(mGridColorLevel);mAreaChartsView.initGridLevelText(mGridLevelText);mAreaChartsView.initGridTxtColorLevel(mGridTxtColorLevel);mAreaChartsView.initXLevelOffset(mXLevel);mAreaChartsView.initYLevelOffset(mYLevel);mAreaChartsView.initTitleXY("投入量(H)", "产出量(H)");}@Overrideprotected void onStart() {super.onStart();

最后

给大家送上我成功跳槽复习中所整理的资料,由于文章篇幅有限,所以只是把题目列出来了

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

l);

    mAreaChartsView.initXLevelOffset(mXLevel);mAreaChartsView.initYLevelOffset(mYLevel);mAreaChartsView.initTitleXY("投入量(H)", "产出量(H)");}@Overrideprotected void onStart() {super.onStart();

最后

给大家送上我成功跳槽复习中所整理的资料,由于文章篇幅有限,所以只是把题目列出来了

CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》

[外链图片转存中…(img-Zuv0mmG1-1630836796482)]

[外链图片转存中…(img-fa4fBp0U-1630836796483)]

Android自定义控件(状态提示图表,我先收藏为敬相关推荐

  1. 看完99%的人都学会了!9次Android面试经验总结,我先收藏为敬

    我们都是被圈养的人? 我的朋友程序员K,说他在电力行业的一家软件公司做了八年Android开发,用到的各种技术,数据库,网络请求,事件传递,响应框架都很熟悉,甚至JNI/NDK/Framework,J ...

  2. Android自定义控件全览(一)

    Android自定义控件总结(一) 目的:收集和整理所有的Android自定义控件 文章目录 Android自定义控件总结(一) 前言 一.面包屑布局(BreadCrumbView) 1.自定义Bre ...

  3. Android 自定义控件打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin ...

  4. android里的editText怎么用,Android自定义控件EditText使用详解

    本文实例为大家分享了Android自定义控件EditText的具体代码,供大家参考,具体内容如下 自定义控件分三种: 1. 自绘控件 2. 组合控件 3. 继承控件 代码已上传到 github 以后的 ...

  5. android汽车之家顶部滑动菜单,Android自定义控件之仿汽车之家下拉刷新

    关于下拉刷新的实现原理我在上篇文章Android自定义控件之仿美团下拉刷新中已经详细介绍过了,这篇文章主要介绍表盘的动画实现原理 汽车之家的下拉刷新分为三个状态: 第一个状态为下拉刷新状态(pull ...

  6. Android自定义控件之仿汽车之家下拉刷新

    感谢 阿拉灯神灯 的技术分享 .版权声明:原文来自http://blog.csdn.net/nugongahou110 关于下拉刷新的实现原理我在上篇文章Android自定义控件之仿美团下拉刷新中已经 ...

  7. Android自定义控件之流式布局

    效果图: 一.首先创建我 们的自定义流式布局 public class FlowLayoutView extends ViewGroup {public FlowLayoutView(Context ...

  8. Android自定义控件:NestedScrolling实现仿魅族flyme6应用市场应用详情弹出式layout

    在前一篇博文中已经实现过一个仿魅族flyme6应用市场应用详情弹出式layout: Android自定义控件:从零开始实现魅族flyme6应用市场应用详情弹出式layout,主要是通过viewDrag ...

  9. Android 自定义控件之圆形页面指示器CirclePageIndicator带划动效果

    Android 自定义控件之圆形页面指示器CirclePageIndicator带划动效果 前言 感谢 效果图 目标 流程 自定义属性 自定义默认属性 自定义接口 创建控件类继承View 声明属性变量 ...

  10. dnf创建服务器信息失败怎么办,DNF提示图表系统组建失败怎么解决?

    DNF提示图表系统组建失败怎么解决?当DNF(地下城与勇士)提示图表系统组建失败的时候,一般都是因为显卡出现问题的缘故,固然显卡还能使用,但在使用DX的时候功能出现错误,导致无法加速图表系统的创建,这 ...

最新文章

  1. 总点第一个视频产生选择偏差?Youtube用“浅塔”来纠正
  2. vue 使用element 菜单与tab页联动
  3. Jzoj4458 密钥破解——Pollard-rho
  4. 实战应对三种因素引起的交换故障
  5. [**奇文共赏**补充问题] 据说看五遍能懂的人智商 200
  6. 【51Nod - 1416】两点 (dfs 或 并查集+dfs)
  7. 【计算机网络复习 数据链路层】3.3.1 差错控制(检错编码)
  8. 配置Struts2的异常处理
  9. MATLAB中文显示乱码的问题如何解决
  10. 解决企业人力短缺难题?且看RPA如何大展身手!
  11. CentOS7.x编译安装nginx,实现HTTP2
  12. python常用的几种字符串替换函数strip、replace、sub
  13. html网页背景图像失真,CSS实现页面背景图片模糊内容不模糊的方法
  14. Fidder实现手机抓包(ios)
  15. centOS安装yasm
  16. 看懂555定时器,有哪些应用?
  17. Alienware-17-R4-630-1060-MacOS 笔记本双显卡 外星人黑苹果hackintosh 10.15
  18. Windows定时关机小程序
  19. Oracle EBS子库存转移,项目转移whole LPN
  20. SQL语句的约束条件

热门文章

  1. 使用Python进行数独求解(二)
  2. 快手磁力金牛和小店通的区别
  3. crm系统需要的服务器,灵当CRM管理系统运行环境-CRM服务器配置
  4. Java swing的主题风格设置
  5. 十三经结业:《诗经》之《蒹葭》赏析
  6. 分时操作系统与实时操作系统的区别
  7. STM32与DS1302设计时钟芯片,超详细
  8. JGROUPS JGRP000029问题
  9. java音乐bpm,Java Tempo.setBpm方法代码示例
  10. 5G标准专利,谁执牛耳?