折线图

一个折线图的需求,好久没写过折线图了,打算自己弄下。

对于折线图或者条形统计图来说,我很少自己去封装,并不是有多难有多麻烦(其实找到规律之后反而很简单),而是我觉得根本没有一个好的封装方式,UI样式总与你做过的不一样,你还是要不停地调整。所以我感觉过度的封装折线图意义不大,重要的是学到折线图、曲线图、条形图等图表的处理方式。

对于折线图来说,一般都是CAShapeLayer+UIBezierPath进行路径绘制,难度低于需要找控制点的曲线图,主要是对位置的处理。

那么来分析下上面的视图需求,我把整个图拆分成以下几点:

1.坐标转换部分

这里分为三个部分:原始数据、iOS平台坐标系数据(左上角为起点)、数学概念上坐标系数据(左下角为起点)。

我们需要对原始数据进行等比例加工,来转换成适合我们视图的坐标数据。一般来说,X轴直接按数据个数进行等比例分隔,而Y轴,需要获取到最大值拿到临界点,再按最大值的若干倍来布局Y轴的值。原始数据的处理对应的是数学概念上坐标系,而iOS平台下的坐标系则是以左上角为起点,需要我们再处理一次。这三组数据建议均做保留,OC中用Model保存,swift中用结构体保存,下面会用到。

2.折线部分

CAShapeLayer性能远胜于draw:rect:,所以这里采用CAShapeLayer进行画线布局。UI绘制中所用到的坐标系全都是iOS平台坐标系统,我们只需把上一步中的点连起来即可。

3.颜色渐变部分

CAGradientLayer用来搞定渐变效果。当然,单纯的CAGradientLayer无法产生多边形的效果,说到多边形,自然就又回到了CAShapeLayer上,给CAGradientLayer加个遮罩,简简单单达到渐变的多边形。

4.层级部分

由于layer的反复叠加,上一层的layer会遮挡下一层,并且渐变效果使用mask,mask的存在抹去了非覆盖部分,这就会使得折线部分的层级和其他视图层级有点小问题:先加X轴上的横线(无论是view还是layer的方式)会使得横线被覆盖掉,后加X轴上的横线又会遮挡折线部分。如何搞一个隐约模糊的效果呢?那么就要用到Layer的不透明效果了:opacity,调整透明效果,达到X轴浮现。值得注意的是这个属性也具有Animatable特性,可以简单快速达到一些动画效果。

5.触摸视图变化部分

触摸部分包括点击和按住移动。在

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

中轻松获得事件回调。竖线的view效果很好达到,我们需要处理一下折线上的点的效果,要达到这个效果我们就要计算出两点间的斜率。这里需要注意的是,计算斜率时用的是数学坐标系统,得到真实的y时还需要向iOS系统转换一下。

6.logo部分(在demo中还未体现)

这部分指的是当前点对应的信息,像下面这样。

这部分需要注意的是左右临边界和中间斜率k对logo在点左点右的影响。

从优先级来说,临边界 > 斜率k

为了达到良好的效果,在临左边界时logo应在右边显示,临右边界时应在左显示;在中间时,k < 0则在右显示,k > 0则在左显示。

Demo地址

因为是从工程中剥离出来的,也未做太多处理,logo部分暂时还未做。

android 折线图 渐变,做一个渐变色的折线图相关推荐

  1. 举个栗子!Tableau技巧(52):学做一个实用的热图日历

    这种图表我们就叫它热图日历,通过方形展示具体日期,通过颜色呈现该日期的数值多少. 通常我们可以将它用作仪表板上的筛选器,来查看月.周.日的详细情况,通过它可以很容易查看具体到每一天的情况. 那么,怎样 ...

  2. Tableau必知必会之学做一个实用的热图日历

    这种图表我们就叫它热图日历,通过方形展示具体日期,通过颜色呈现该日期的数值多少. 通常我们可以将它用作仪表板上的筛选器,来查看月.周.日的详细情况,通过它可以很容易查看具体到每一天的情况. 为方便学习 ...

  3. Android 实现颜色渐变的一个小 tip

    价值 | 思考 | 共鸣 简评:TL;DR: 如果要实现某个颜色到透明的渐变时,记得不要改动颜色的 RGB 值. Tip: 如果你想要创建从某个颜色到透明的渐变(gradient)背景,那就要小心使用 ...

  4. ps切图后 JAVA开发_做一个会PS切图的前端开发

    系列链接 切图方法分类 PhotoShop从CS版本演变到现在的CC版本,切图功能发生了比较大的变化,我们可以把PhotoShop CS版本时的切图功能称为传统切图,而从PhotoShop CC版本开 ...

  5. Android等待对话框(做一个带动态效果的对话框)

    又到了动画总结的时间了,今天要总结的是一个对话框形式的动画效果,老样子gif图不太清晰,但是总体的效果是可以看的清楚的,一个动态的等待对话框,我只是简单的实现了一些动画,如果需要更复杂的需求,可以联系 ...

  6. 驾驭系统 做一个Windows XP的“***”(图)3

    还管理员账户以真面目 很少有人留意到Windows XP被隐藏了的管理员账户(恰当地说,是Administrator).这个账户是不可见的,除非系统只有这一个账号或者以安全模式启动系统.要去掉Admi ...

  7. 做一个常规的banner图——负边距的使用、banner图的拼法

    在这之前,首先要了解如何设置块级元素在块级元素水平居中 方法: 设置子容器为定位元素 水平居中 left:50%:margin-left:-width/2: 垂直居中 top:50%:margin-t ...

  8. css动画与渐变案例,使用动画和渐变做一个背景动态网页

    目录 一,效果展示 二,背景颜色的渐变与动画 1.背景颜色渐变 2.背景颜色的动态改变 三,字体样式与颜色的改变 1.字体样式的引入 2.设置字体颜色透明与背景 3.字体设置源码 四,背景泡泡的漂浮动 ...

  9. Winform 做一个组织机构思维导图

    就是把组织机构图做成思维导图的样子 本文是在别人的工作上进行了一定的更改,但是找不到这个链接了. 注: 1.组织结构图是用Graphics画的,因此他是一个图片. 2.本文给出了对图片进行点击时的一些 ...

最新文章

  1. iOS - Regex 正则表达式
  2. placeholder文字颜色与是否显示兼容性
  3. mac ox 10.9 安装eclipse j2ee 集成配置JDK1.6
  4. Golang 1.14 发布 | 云原生生态周报 Vol. 39
  5. 使用谷歌浏览器模拟微信(android或ios)浏览器
  6. 【求助】AIX5.3主机下 memcached的内存使用异常
  7. .NET 6 中的七个 System.Text.Json 特性
  8. 解决微信小程序 [Component] slot ““ is not found.
  9. 精典的网吧常用批处理收集
  10. 北航计算机软件基础试题,北航2010计算机软件技术基础试题与答案
  11. django之路由分组,路由分发,FBV,CBV,ORM框架
  12. Android M(6.0) 权限相关
  13. linux下hg无法运行_linux下hg无法运行_Linux下Mercurial (hg)配置说明
  14. Python基础语法01:缩进规则
  15. 还在用 ZXing ? 试试华为统一扫码服务吧!
  16. 群晖DSM桌面无法删除快捷方式(无法右键)解决方法
  17. Android架构设计模式总结(MVX)
  18. 手把手教你完成unity3D跑酷游戏系列(二)
  19. html另存word或excel,excel另存为word
  20. 低代码:阿里“云钉一体”战略的延伸和深化

热门文章

  1. 打油诗-最近有点嘴馋
  2. python3如何使用边缘分割图像_python – 基于边缘像素图的图像分割
  3. Scala 自身类型(self-type) 解析
  4. BUUCTF·[MRCTF2020]babyRSA·WP
  5. 【JAVA进阶架构师指南】 小白勿点
  6. 如何办理德国商标注册
  7. 2021年安全员-C证报名考试及安全员-C证考试试题
  8. redis scan 命令底层原理(为什么会重复扫描?)
  9. nginx 服务器的响应头,隐藏HTTP请求响应头里的nginx版本号
  10. socket编程二十二:socket编程实现文件传输功能