效果
几个要点:
1. 坐标系以左上角为原点,横X竖Y
2. 笔刷Paint
Paint paint = new Paint(); //设置画笔颜色 paint.setColor(getResources().getColor(R.color.arc_fail_color)); //设置画笔的宽度 paint.setStrokeWidth(lineThick); //设置图形为空心 paint.setStyle(Paint.Style.STROKE); //消除锯齿 paint.setAntiAlias(true);
3. 绘制直线
/** Canvas * Draw a line segment with the specified start and stop x,y coordinates, * using the specified paint. * * @param startX The x-coordinate of the start point of the line * @param startY The y-coordinate of the start point of the line * @param paint The paint used to draw the line */ public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
4. 绘制圆弧
/** * <p>Draw the specified arc, which will be scaled to fit inside the * specified oval.</p> * * <p>If the start angle is negative or >= 360, the start angle is treated * as start angle modulo 360.</p> * * <p>If the sweep angle is >= 360, then the oval is drawn * completely. Note that this differs slightly from SkPath::arcTo, which * treats the sweep angle modulo 360. If the sweep angle is negative, * the sweep angle is treated as sweep angle modulo 360</p> * * <p>The arc is drawn clockwise. An angle of 0 degrees correspond to the * geometric angle of 0 degrees (3 o'clock on a watch.)</p> * * @param oval The bounds of oval used to define the shape and size * of the arc * @param startAngle Starting angle (in degrees) where the arc begins * @param sweepAngle Sweep angle (in degrees) measured clockwise * @param useCenter If true, include the center of the oval in the arc, and close it if it is being stroked. This will draw a wedge * @param paint The paint used to draw the arc */ public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
注:
以时钟三点为0度;
完整角度以360°来计算;
oval限定绘图区域
startAngle为起始角度;
sweepAngle表示划过的角度,如果为负值则逆时针画
useCenter如果为true则画出扇形效果,否则只有一个圆弧
RectF的初始化
/** * Create a new rectangle with the specified coordinates. Note: no range * checking is performed, so the caller must ensure that left <= right and * top <= bottom. * * @param left The X coordinate of the left side of the rectangle * @param top The Y coordinate of the top of the rectangle * @param right The X coordinate of the right side of the rectangle * @param bottom The Y coordinate of the bottom of the rectangle */ public RectF(float left, float top, float right, float bottom)
5. 获取用户在xml中自定义的宽度值 layout_width
public DrawCrossMarkView(Context context, AttributeSet attrs) { super(context, attrs); Pattern p = Pattern.compile("\\d*"); Matcher m = p.matcher(attrs.getAttributeValue("http://schemas.android.com/apk/res/android", "layout_width")); if (m.find()) { totalWidth = Float.valueOf(m.group()); } init(); }
注:
在构造函数中通过getWidth来获取宽度得到的结果往往是0,在执行到onDraw的时候,控件大小才划定;
本例中默认用户以dp为单位设置layout_width。
6. 重写onDraw方法,在没有绘制完成前,通过postInvalidateDelayed定义重绘间隔,每一次重绘,之前绘制的图案都会被清除
//绘制 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Log.w("check mark", "drawing... # progress=" + progress); if (progress < 100) progress+=step; //根据进度画圆弧 canvas.drawArc(rectF, 235, -360 * progress / 100, false, paint); //先等圆弧画完,画叉 if (progress >= 100) { if (line1X < maxLineIncrement) { line1X+=step; line1Y+=step; } //画第一根线 canvas.drawLine(line1StartX, lineStartY, line1StartX - line1X, lineStartY + line1Y, paint); if (line1X >= maxLineIncrement) { line2X+=step; line2Y+=step; //画第二根线 canvas.drawLine(line2StartX, lineStartY, line2StartX + line2X, lineStartY + line2Y, paint); } } //每隔6毫秒界面刷新 if (line2X < maxLineIncrement) postInvalidateDelayed(6); }
7. 调用
在布局文件中添加控件
<com.xuanzhui.animations.view.DrawCrossMarkView android:layout_width="50dp" android:layout_height="50dp" android:layout_margin="50dp"/>
在color总定义颜色
<color name="arc_fail_color">#D93549</color>
8. 完整代码见 https://github.com/xuanzhui/Animations
相关推荐
这里我们可以利用`Path`对象来构建形状,并在`onDraw()`中用`canvas.drawPath(path, paint)`进行绘制。 ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 创建Path对象 ...
开发者会在`onDraw()`中使用`Canvas`对象进行绘图,例如画圆和打勾的图形,使用`Paint`对象设置颜色、线宽等属性。 2. **使用Path对象**:`Path`对象在Android中用于存储路径信息,可以用来画复杂的形状,比如这里...
总结来说,DrawHookView利用了Java和Android的图形绘制能力,通过自定义View实现了一个动态画圆弧打勾的效果。这种效果的实现涉及到Canvas、Paint、Path、RectF等图形绘制对象,以及动画和事件处理机制。了解并掌握...
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
基于java的学生网上请假系统的开题报告.docx