_paint…color = rightColor ?? _kProRightColor);

2. 异常比例

对于比例过小或过大的情况,小菜计划展示一个固定的三角形,并且在此状况下不进行文字绘制;

// 左侧
if ((size.width * leftProgress + _height * 0.5 - _spaceWidth * 0.5 - _strokeWidth) <= _height) {
_leftPath.lineTo(
_height + _kProPaddingWidth + _strokeWidth * 0.5, _height);
} else if ((size.width * leftProgress + _height * 0.5) >= size.width - _height) {
_leftPath.lineTo(
size.width - _spaceWidth - _strokeWidth * 2 - _kProPaddingWidth, _height);
_leftPath.lineTo(
size.width - _spaceWidth - _strokeWidth * 2 - _height - _kProPaddingWidth, Offset.zero.dy);
} else {
_leftPath.lineTo(
size.width * leftProgress + _height * 0.5 - _spaceWidth * 0.5 - _strokeWidth, _height);
_leftPath.lineTo(
size.width * leftProgress - _height * 0.5 - _spaceWidth * 0.5 - _strokeWidth, Offset.zero.dy);
}
// 右侧
if ((size.width * leftProgress + _height * 0.5 - _spaceWidth * 0.5 - _strokeWidth) <= _height) {
_rightPath.lineTo(
_height + _spaceWidth + _strokeWidth * 2 + _kProPaddingWidth, _height);
_rightPath.lineTo(
_spaceWidth + _strokeWidth * 2 + _kProPaddingWidth, Offset.zero.dy);
} else if ((size.width * leftProgress + _height * 0.5) >= size.width - _height) {
_rightPath.lineTo(
size.width - _height - _strokeWidth * 0.5 - _kProPaddingWidth, Offset.zero.dy);
} else {
_rightPath.lineTo(
size.width * leftProgress + _height * 0.5 + _spaceWidth * 0.5 + _strokeWidth, _height);
_rightPath.lineTo(
size.width * leftProgress - _height * 0.5 + _spaceWidth * 0.5 + _strokeWidth, Offset.zero.dy);
}

3. 是否填充

对于梯形内容是否填充,可以通过 Paint().style = PaintingStyle.fill / stroke 来处理,但是需要注意的是,当 Path 设置了 strokeWidth 时,其填充状态是边框以内的范围,即边框设置越粗,填充范围越小,其绘制的整体图形也会越大,因此在计算时需要以边框中间位置计算;小菜为了避免填充范围不够,设置在 PaintingStyle.fill 时降低边框粗细为 0.5

_paint = _paint
…strokeWidth = (isFill == null || isFill == false) ? _strokeWidth : 0.5
…style = (isFill == null || isFill == false) ? PaintingStyle.stroke : PaintingStyle.fill;

Canvas.drawParagraph 绘制文字

之前小菜有简单介绍过 drawParagraph 文字绘制,其关键是对文字属性及定位进行处理;

1. 左侧文字

文字范围需要在梯形内,不能超过梯形长度,因此通过计算设置 ParagraphConstraints(width: _leftTextWidth) 文字宽度范围;通过 ParagraphStyle 设置文字属性,包括颜色,大小是否换行等;而最后通过 canvas.drawParagraph 设置文字起始位置(可以获取段落高度);

if (_leftTextWidth > 0.0) {
Color _leftColor;
if (leftTextColor != null) {
_leftColor = leftTextColor;
} else if (isFill != null && this.isFill == true) {
_leftColor = Colors.white;
} else if (leftColor != null) {
_leftColor = leftColor;
} else {
_leftColor = _kProLeftColor;
}
ParagraphBuilder _pb = ParagraphBuilder(ParagraphStyle(
textAlign: TextAlign.left, fontWeight: FontWeight.w500,
fontStyle: FontStyle.normal, maxLines: 1,
ellipsis: ‘…’, fontSize: 16))
…pushStyle(ui.TextStyle(color: _leftColor))
…addText(leftText);
ParagraphConstraints pc = ParagraphConstraints(width: _leftTextWidth);

尾声

面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。

不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

大厂面试真题

PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

《2017-2020字节跳动Android面试历年真题解析》

如果需要PDF版本可以自行领取!

C%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**

【Flutter 专题】114 图解自定义 ACEProgressPainter 对比进度图相关推荐

  1. Flutter专题1-环境搭建

    Flutter专题1-环境搭建和创建项目 这里以Mac+iOS为例,其他平台参考官网https://flutter.dev/docs/get-started/install 1. 系统要求 系统:ma ...

  2. [C# 网络编程系列]专题四:自定义Web浏览器

    前言: 前一个专题介绍了自定义的Web服务器,然而向Web服务器发出请求的正是本专题要介绍的Web浏览器,本专题通过简单自定义一个Web浏览器来简单介绍浏览器的工作原理,以及帮助一些初学者揭开浏览器这 ...

  3. [flutter专题]详解AppBar小部件

    大家好,我是坚果,公众号"坚果前端" AppBar 应用栏是各种应用程序中最常用的组件之一.它可用于容纳搜索字段.以及在页面之间导航的按钮,或者只是页面标题.由于它是一个如此常用的 ...

  4. android 自定义加载动画效果,Android 自定义View修炼-自定义加载进度动画LoadingImageView...

    一.概述 本自定义View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进度颜色. ...

  5. 文件对比8,单线程读,多线程对比,对比进度条,对比结果导出excel文件,已验收

    文件对比8,单线程读,多线程对比,对比进度条,对比结果导出excel文件,已验收 介绍 项目结构预览 base util CompareThreadUtil ExcelUtil Md5 ReadFil ...

  6. 基于canvas 2D实现微信小程序自定义组件-环形进度条

    基于canvas 2D实现微信小程序自定义组件-环形进度条 最近开发一个小程序项目博闻金榜答题小程序,需要使用到一个可以显示答题倒计时的组件,基于进度条实现,下面就主要介绍基于canvas2D实现一个 ...

  7. Flutter学习笔记 —— CustomPainter自定义画布绘制爱心

    Flutter学习笔记 -- CustomPainter自定义画布绘制爱心 前言 效果图 代码示例 温馨提示 结束语 前言 最近在学习Flutter中 Canvas相关内容,今天尝试写了一个爱心Dem ...

  8. android自定义View: 饼状图绘制(四)

    本系列自定义View全部采用kt 系统mac android studio: 4.1.3 kotlin version1.5.0 gradle: gradle-6.5-bin.zip 本篇效果: 画矩 ...

  9. 各种金融类的自定义 View,基金走势图、分时图、蜡烛图、各种指标等,一步一步构建庞大的基金自定 View...

    inancialCustomerView 项目地址:Tophold/FinancialCustomerView  简介:各种金融类的自定义 View,基金走势图.分时图.蜡烛图.各种指标等,一步一步构 ...

最新文章

  1. 【HDU】4706 Children's Day(模拟)
  2. Ubuntu下通过 PPA 安装 Komodo 编辑器
  3. c语言bim的题目,求助:几道简单C语言程序小题
  4. 4.Java中的关键字和标识符
  5. Idea左侧显示目录结构和.java文件的解决办法
  6. 实现linux cp 命令和修改配置文件
  7. 软件项目管理的质量保证
  8. Pytorch:Tensor和Numpy
  9. 基于web的通用文本标注工具MarkTool in NLP
  10. (转)思科VPP源码分析(feature机制分析)
  11. Latex中文简历制作
  12. Android修改源码实现root
  13. CSJ加人|cs如何加人|cs加人快捷键
  14. 假设检验及在机器学习中的应用
  15. 安装postgres10 后,使用自带的pgAdmin 4 访问数据库,出现The pgAdmin 4 server could not be contacted错误的最完美解决方案,另附安装步骤。
  16. 数据库概念整理(粗略)
  17. 区块链/BlockChain+ProofOfWork
  18. 1Tb 硬盘重做系统无法启动修复
  19. 计算机仿真严重拖稿,设计师100种拖稿借口!
  20. opencv - 简介

热门文章

  1. Vue使用Object标签对接IC读卡器硬件
  2. 博主联系方式汇总(非诚勿扰)
  3. 如何解决跨站脚本攻击
  4. 【论文阅读】DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning
  5. Efficient Image Dehazing with Boundary Constraint and Contextual Regularization
  6. MVC中的自定义过滤器
  7. onedrive手机登录出现 无法登录,管理员需要为你分配可执行此操作的SharePoint和OneDrive许可证
  8. librosa@soundFile音频读取和绘图@声道@通道@包络
  9. Navicat Mysql 破解教程(亲测可用)
  10. Html+Css+Js五星好评(完整代码+详解)