效果
几个要点:
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
相关推荐
Canvas是一个基于矢量图形的画布,通过JavaScript API提供了一系列方法,如`fillRect`、`strokeRect`、`beginPath`、`moveTo`、`lineTo`等,用于绘制各种形状和线条。对于动态心电图来说,我们需要频繁地清除画布(`...
3. **绘制线条**:在每次循环中,`clearRect()`方法用于清除上一帧的线条,然后根据解析出的数据在Canvas上用`moveTo()`和`lineTo()`定义新的路径,最后用`stroke()`描绘出来。 `Style.css`文件可能包含了页面布局...
- 可以通过设置Paint的`paint.setTextAlign(Paint.Align.RIGHT)`使文本右对齐,再配合`canvas.translate()`方法改变画布的坐标原点,使得每次绘制文本时都会向左移动一定的距离,从而达到竖排的效果。 4. **步骤...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面...通过设置Paint的各种属性和利用Canvas的方法,开发者可以绘制出各种形状、文本和图像,构建出独特且具有吸引力的用户界面。
在Canvas上绘制动态树视图,首先需要了解的基本概念有: 1. **Canvas元素**:HTML5中的`<canvas>`标签提供了一个可编程的2D渲染上下文,我们可以通过JavaScript对其进行操作。 2. **Canvas API**:这是一个图形...
我们可以在`Path`上使用`moveTo()`和`lineTo()`方法分别指定线的起始点和终点,然后在`onDraw()`中调用`canvas.drawPath(path, paint)`来绘制整个路径。为了创建动态效果,可以在`Runnable`或者`Handler`中定期更新...
总结来说,`canvas`绘制风场效果涉及数据解析、坐标转换、图形绘制、动画实现和服务器部署等多个环节。这是一项综合性的技术实践,能够帮助气象学家、开发者和公众更好地理解和呈现风场信息。通过不断优化和扩展,...
例如,你可以创建一个自定义的进度条,使用Canvas绘制背景和进度条,通过改变Paint的颜色和位置来显示进度。或者创建一个可交互的图表视图,根据数据动态更新Canvas上的图形。 通过深入理解和实践Paint和Canvas的...
在实际应用中,`Paint`和`Canvas`常常结合使用,先通过`Paint`设置好绘制样式,然后在`Canvas`上进行绘制操作。例如,你可以创建一个`Bitmap`,然后在它的`Canvas`上画一个红色的圆: ```java Bitmap bitmap = ...
总之,"基于openlayers和canvas绘制海量数据的实现"是一个高效处理和展示地理信息的技术方案,它结合了OpenLayers的灵活性和Canvas的高性能渲染能力,为开发者提供了强大的工具来应对大数据挑战。通过理解和掌握这些...
总之,"vue+canvas绘制图形"项目展示了如何利用Vue的组件化思想和Canvas的绘图能力,创建出具有动态效果和用户交互的前端应用。通过学习和实践这种方式,开发者可以提高自己的前端技能,为网页带来更丰富的视觉体验...
ECG html canvas绘制心电图
使用canvas绘制的实时时钟
这个例子展示了如何使用Canvas的基本绘图操作,如绘制线条和旋转坐标系,以及如何利用Android的View机制来实现动态效果。理解并熟练掌握这些概念对于任何Android开发者来说都是非常重要的,尤其是在创建自定义UI组件...
HTML5 canvas 是一种在网页上绘制图形的API,它允许开发者通过JavaScript动态创建和修改二维图形,从而实现丰富的视觉效果。在这个"HTML5 canvas仿屏保动态管道"项目中,我们利用canvas元素来模仿经典的Windows屏保...
在Android开发中,Canvas是图形绘制的核心类,它允许开发者在Bitmap或者其他可绘图对象上进行画图操作。本文将深入探讨如何利用...在实践中不断探索和学习,你将能够熟练地运用Canvas绘制出更多富有创意的图形和动画。
HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式2D图形和动画。"html5 canvas绘制管道里跳动小球动画特效"是一个利用Canvas API实现的典型应用场景,旨在创建一...
总结来说,通过HTML5的Canvas和Web Audio API,我们可以实现音频波形的动态绘制。这不仅有助于可视化音频,还可以用于音频编辑、分析等多种用途。在实际项目中,可以根据需求进一步优化和扩展这个基础示例。
Canvas是HTML5的一个核心特性,它提供了一个二维绘图环境,允许开发者通过JavaScript代码动态地绘制图形。要绘制心电图,我们需要理解几个关键概念: 1. **坐标系统**:Canvas是一个像素网格,它的左上角为(0, 0)...
在这个"html5 canvas自动绘制背景图片效果代码"示例中,我们将探讨如何利用Canvas API实现背景图片的动态加载和绘制。 首先,我们需要在HTML文件中创建一个`<canvas>`元素,并为其分配一个ID,以便通过JavaScript来...