Path绘图之平滑曲线
2018-02-05 15:26
309 查看
效果图
文章开头先放上效果图。
效果图中上面的阴影图是之前的文章
Path曲线下的阴影绘制
效果图中这个平滑曲线的效果是我比较早之前项目中的一个需求,MPchart在这种需求下不仅不合适,反而还比较复杂,所以完全自定义了一个View。
实现思路
结构还是很清晰的。可以分成三个部分曲线
Path画平滑曲线使用
cubicTo方法,使用两个控制点,根据贝赛尔曲线原理可以画出
mPath.reset(); mPath.moveTo(point.x, point.y); float preX = point.x; float preY = point.y; for (int i = 1; i < size; i++) { point = mPointList.get(i); float controlX = (preX + point.x) / 2; mPath.cubicTo(controlX, preY, controlX, point.y, point.x, point.y); preX = point.x; preY = point.y; }
数字
数字有 X轴上的时间显示、Y轴的最大值和最小值 以及最后一个点的圆圈和文字显示
public void drawXAxis(Canvas canvas) { float baseY = getHeight(); Paint.FontMetrics metrics = mTextPaint.getFontMetrics(); float top = baseY - metrics.bottom; canvas.drawText(mPathValue.startTime, mXaxisPaddingLeft, top, mTextPaint); canvas.drawText(mPathValue.endTime, mLastPoint.x - mTextPaint.measureText(mPathValue.endTime) / 2, top, mTextPaint); } public void drawYAxis(Canvas canvas) { float baseY = getHeight() / 2 - mPathHeight / 2; Paint.FontMetrics metrics = mTextPaint.getFontMetrics(); float top = baseY - metrics.bottom; final int padding = 5; canvas.drawText(String.valueOf(mMaxY), mYaxisPaddingLeft, top - padding, mTextPaint); canvas.drawText(String.valueOf(mMinY), mYaxisPaddingLeft, top + mPathH 4000 eight - metrics.top + padding, mTextPaint); } private void drawEnd(Canvas canvas) { drawEndString(canvas); drawEndPointCycle(canvas); drawQualityCycle(canvas); }
数值和坐标像素的转化
这里需要注意的是整个Path曲线图在View中是居中显示,而不是从顶部开始显示
因为需要满足需求,如果所有的点在一条直线上的话,需要居中。主要计算方法如下:
//计算水质点高低点和像素点高低点的比例 float disQuality = maxY - minY; final int startY = getHeight() / 2 - mPathHeight / 2; float disPixel = mPathHeight; float x; float y; float scale; if (disQuality == 0) { for (int i = 0; i < size; i++) { x = mPathPaddingLeft + (pecX * i); y = (startY + disPixel * 0.5f);//线段居中 points.add(new Point(x, y)); } } else { for (int i = 0; i < size; i++) { x = mPathPaddingLeft + (pecX * i); scale = (maxY - list.get(i)) / disQuality; y = (startY + disPixel * scale); points.add(new Point(x, y)); } }
代码地址
具体代码见Demo:https://github.com/xindasunday/ShareDemo相关文章推荐
- Path.quadTo《贝赛尔曲线》方法实现平滑曲线
- swing GeneralPath::cubicTo绘制平滑曲线
- 在android中使用Path类的quadTo()方法实现平滑曲线
- 利用SVG中path实现平滑曲线
- Path.quadTo《贝赛尔曲线》方法实现平滑曲线
- Qt用算法画平滑曲线(cubicTo)
- 重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
- Android 绘图基础:Path(绘制三角形、贝塞尔曲线、正余弦)
- Android自定义view之path类描绘二阶贝塞尔曲线+属性动画(模仿QQ账号信息曲线动画)
- 穿过已知点画平滑曲线(3次贝塞尔曲线)
- Android 穿过点画平滑曲线
- Android 使用贝塞尔曲线将多点连成一条平滑的曲线
- 曲线拟合(曲线平滑)
- matlab绘制平滑曲线
- 自定义控件三部曲之绘图篇(六)——Path之贝赛尔曲线和手势轨迹、水波纹效果
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
- Java基础之在窗口中绘图——显示曲线的控制点(CurveApplet 2 displaying control points)
- Qt 绘图表、曲线 第三方插件
- 自定义控件三部曲之绘图篇(六)——Path之贝赛尔曲线和手势轨迹、水波纹效果
- Android绘图:自定义View——路径(Path)、贝塞尔曲线(绘制可动的波浪线)、Bitmap