1、贝塞尔曲线:http://baike.baidu.com/view/60154.htm,在这里理解什么是贝塞尔曲线

2、直接上图:

3、100多行代码就可以画出贝塞尔曲线,直接上代码

  1. package com.example.bezier;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import android.app.Activity;
  7. import android.content.Context;
  8. import android.graphics.Canvas;
  9. import android.graphics.Color;
  10. import android.graphics.Paint;
  11. import android.graphics.PathMeasure;
  12. import android.graphics.Paint.Style;
  13. import android.graphics.Path;
  14. import android.os.Bundle;
  15. import android.view.View;
  16. import android.view.Window;
  17. import android.view.WindowManager;
  18.  
  19. public class MainActivity extends Activity {
  20. @Override
  21. public void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. requestWindowFeature(Window.FEATURE_NO_TITLE);
  24. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  25. setContentView(new BezierView(this));
  26. }
  27. }
  28.  
  29. class BezierView extends View {
  30. /**
  31. *
  32. * @author liqiongwei
  33. * @param context
  34. *
  35. */
  36. public BezierView(Context context) {
  37. super(context);
  38. }
  39.  
  40. protected void onDraw(Canvas canvas) {
  41.  
  42. List<Float> points = new ArrayList<Float>();
  43.  
  44. Paint paint = new Paint();
  45. // 添加第一个点(118.0, 294.0),
  46. points.add((float) 118.0);// X轴
  47. points.add((float) 294.0);// Y轴
  48. // 添加第二个点
  49. points.add((float) 206.0);
  50. points.add((float) 294.0);
  51. // 添加第三个点
  52. points.add((float) 294.0);
  53. points.add((float) 118.0);
  54. // 添加第四个点
  55. points.add((float) 382.0);
  56. points.add((float) 206.0);
  57.  
  58. points.add((float) 470.0);
  59. points.add((float) 118.0);
  60.  
  61. // 通过画折线和贝塞尔曲线可以知道,点得位置是不一样的。
  62. // 画折线
  63. for (int i = 0; i < points.size() - 2; i = i + 2) {
  64. canvas.drawLine(points.get(i), points.get(i + 1), points.get(i + 2), points.get(i + 3), paint);
  65. canvas.drawCircle(points.get(i), points.get(i + 1), 3, paint);
  66. }
  67. canvas.drawCircle(points.get(points.size() - 2), points.get(points.size() - 1), 3, paint);
  68.  
  69. // 贝塞尔曲线
  70. paint.setColor(Color.BLUE);
  71. Path p = new Path();
  72. Point p1 = new Point();
  73. Point p2 = new Point();
  74. Point p3 = new Point();
  75. float xp = points.get(0);
  76. float yp = points.get(1);
  77. // 设置第一个点开始
  78. p.moveTo(xp, yp);
  79. int length = points.size();
  80. // 设置第一个控制点33%的距离
  81. float mFirstMultiplier = 0.3f;
  82. // 设置第二个控制点为66%的距离
  83. float mSecondMultiplier = 1 - mFirstMultiplier;
  84.  
  85. for (int b = 0; b < length; b += 2) {
  86. int nextIndex = b + 2 < length ? b + 2 : b;
  87. int nextNextIndex = b + 4 < length ? b + 4 : nextIndex;
  88. // 设置第一个控制点
  89. calc(points, p1, b, nextIndex, mSecondMultiplier);
  90. // 设置第二个控制点
  91. p2.setX(points.get(nextIndex));
  92. p2.setY(points.get(nextIndex + 1));
  93. // 设置第二个控制点
  94. calc(points, p3, nextIndex, nextNextIndex, mFirstMultiplier);
  95. // 最后一个点就是赛贝尔曲线上的点
  96. p.cubicTo(p1.getX(), p1.getY(), p2.getX(), p2.getY(), p3.getX(), p3.getY());
  97. // 画点
  98. }
  99. PathMeasure mPathMeasure;
  100. mPathMeasure = new PathMeasure(p, false);
  101. // 设置为线
  102. paint.setStyle(Style.STROKE);
  103. reSetPointWithPath(mPathMeasure, points);
  104. for (int k = 0; k < points.size()-1; k +=2) {
  105. canvas.drawCircle(points.get(k), points.get(k+1), 5, paint);
  106. }
  107. canvas.drawPath(p, paint);
  108.  
  109. invalidate();
  110. }
  111.  
  112. /**
  113. * 计算控制点
  114. * @param points
  115. * @param result
  116. * @param index1
  117. * @param index2
  118. * @param multiplier
  119. */
  120. private void calc(List<Float> points, Point result, int index1, int index2, final float multiplier) {
  121. float p1x = points.get(index1);
  122. float p1y = points.get(index1 + 1);
  123. float p2x = points.get(index2);
  124. float p2y = points.get(index2 + 1);
  125.  
  126. float diffX = p2x - p1x;
  127. float diffY = p2y - p1y;
  128. result.setX(p1x + (diffX * multiplier));
  129. result.setY(p1y + (diffY * multiplier));
  130. }
  131.  
  132. /**
  133. * 重新设置点的位置,为曲线上的位置
  134. * @param mPathMeasure
  135. * @param pointsList
  136. */
  137. public void reSetPointWithPath(PathMeasure mPathMeasure, List<Float> pointsList){
  138. int length = (int) mPathMeasure.getLength();
  139. int pointsLength = pointsList.size();
  140. float[] coords = new float[2];
  141. for (int b = 0; b < length; b++) {
  142. mPathMeasure.getPosTan(b, coords, null);
  143. double prevDiff = Double.MAX_VALUE;
  144. boolean ok = true;
  145. for (int j = 0; j < pointsLength && ok; j += 2) {
  146. double diff = Math.abs(pointsList.get(j) - coords[0]);
  147. if (diff < 1) {
  148. pointsList.set(j + 1, coords[1]);
  149. prevDiff = diff;
  150. }
  151. ok = prevDiff > diff;
  152. }
  153. }
  154. }
  155. }

4、定义点的类

  1. package com.example.bezier;
  2.  
  3. import java.io.Serializable;
  4.  
  5. /**
  6. * 点的类,来源于Achartengine
  7. */
  8. public final class Point implements Serializable {
  9. private float mX;
  10. private float mY;
  11.  
  12. public Point() {
  13. }
  14.  
  15. public Point(float x, float y) {
  16. mX = x;
  17. mY = y;
  18. }
  19.  
  20. public float getX() {
  21. return mX;
  22. }
  23.  
  24. public float getY() {
  25. return mY;
  26. }
  27.  
  28. public void setX(float x) {
  29. mX = x;
  30. }
  31.  
  32. public void setY(float y) {
  33. mY = y;
  34. }
  35. }

5、下载地址:http://files.cnblogs.com/liqw/Bezier.zip

本文来源于:http://www.cnblogs.com/liqw/p/3631137.html

有问题,请提问,大家一起研究!

Android 贝塞尔曲线 折线图的更多相关文章

  1. Android -- 贝塞尔曲线公式的推导

    1,最近看了几个不错的自定义view,发现里面都会涉及到贝塞尔曲线知识,深刻的了解到贝塞尔曲线是进阶自定义view的一座大山,so,今天先和大家来了解了解. 2,贝塞尔曲线作用十分广泛,简单举几个的栗 ...

  2. Android -- 贝塞尔曲线公式的推导和简单使用

    1,最近看了几个不错的自定义view,发现里面都会涉及到贝塞尔曲线知识,深刻的了解到贝塞尔曲线是进阶自定义view的一座大山,so,今天先和大家来了解了解. 2,贝塞尔曲线作用十分广泛,简单举几个的栗 ...

  3. Android 贝塞尔曲线解析

    相信很多同学都知道"贝塞尔曲线"这个词,我们在很多地方都能经常看到.利用"贝塞尔曲线"可以做出很多好看的UI效果,本篇博客就让我们一起学习"贝塞尔曲线 ...

  4. Android 贝塞尔曲线库

    最近做的一个小项目需要绘制一些折线图,AChartEngine其实里面包含很多图,虽然是开源的,但毕竟不是自己写的,而且项目稍有点庞大,有些东西修改起来还是得花点时间的,所以最后打算自己写一个,参考了 ...

  5. Android 贝塞尔曲线的浅析

    博客也开了挺长时间了,一直都没有来写博客,主要原因是自己懒---此篇博客算是给2017年一个好的开始,同时也给2016年画上一个句点,不留遗憾. 那就让我们正式进入今天的主题:贝塞尔曲线. 首先,让我 ...

  6. Android AChartEngine 去除折线图黑边

    通常使用AChartEngine画出的折线图,如果背景不是黑色,则会在折线图的坐标轴旁边出现黑边,如图所示: 试了好多设置,最后终于发现,去除黑边的设置是: mRenderer.setMarginsC ...

  7. Android 贝塞尔曲线

    博客图片备份位置:

  8. iOS - 贝塞尔曲线,折线,曲线,波浪线

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHlsYW5fbHdiXw==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  9. Android贝塞尔曲线应用-跳动的水滴

    主要通过6个控制点实现. val startPoint = PointF() val endPoint = PointF() val control1 = PointF() val control2 ...

随机推荐

  1. 使用 GDB 调试多进程程序

    使用 GDB 调试多进程程序 GDB 是 linux 系统上常用的调试工具,本文介绍了使用 GDB 调试多进程程序的几种方法,并对各种方法进行比较. 3 评论 田 强 (tianq@cn.ibm.co ...

  2. C++ 的语言杂谈(一)--C++不是新手友好的

    C++的语言品味是独特的,喜欢的人特别喜欢,讨厌的人特别讨厌.虽然Bjane Stroustrup不断地宣称C++的发展方向是新手友好的,但实际上对新手来说,最重要的还是有强大方便的标准库可以使用(像 ...

  3. alipay iOS SDK

    我也是醉了,进支付宝主页找都找不到,好不容易找到赶紧记下来:https://b.alipay.com/order/productDetail.htm?productId=201308060460965 ...

  4. IIS假死状态处理

    为应用程序池 'DefaultAppPool' 提供服务的进程关闭时间超过了限制  服务器经常产生“应用程序池 'DefaultAppPool' 提供服务的进程关闭时间超过了限制.进程 ID 是 '2 ...

  5. MySQL数据库InnoDB引擎下服务器断电数据恢复

    说明: 线上的一台MySQL数据库服务器突然断电,造成系统故障无法启动,重新安装系统后,找到之前的MySQL数据库文件夹. 问题: 通过复制文件的方式对之前的MySQL数据库进行恢复,发现在程序调用时 ...

  6. UIWebView

    本地html string文件 loadHTMLString: 本地/远程文件 loadRequest

  7. 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)

    从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...

  8. PCL初步使用

    转载:http://blog.csdn.net/vbskj/article/details/7819828 本次试验的目的是利用PCL库来重建地形点云数据,并进行显示.总体流程是1)把DEM数据导入P ...

  9. PHP生成CSV文件

    CSV文件的定义这里就不多做介绍了,难能可贵的是用Excel可以直接打开CSV文件.用PHP输出CSV文件本身很简单,但是大家如果有业务需求,下面的代码可以作为参考. $tableheader = a ...

  10. spring boot实战(第十二篇)整合RabbitMQ

    前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...