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

2、直接上图:

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

package com.example.bezier;

import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PathMeasure;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager; public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(new BezierView(this));
}
} class BezierView extends View {
/**
*
* @author liqiongwei
* @param context
*
*/
public BezierView(Context context) {
super(context);
} protected void onDraw(Canvas canvas) { List<Float> points = new ArrayList<Float>(); Paint paint = new Paint();
// 添加第一个点(118.0, 294.0),
points.add((float) 118.0);// X轴
points.add((float) 294.0);// Y轴
// 添加第二个点
points.add((float) 206.0);
points.add((float) 294.0);
// 添加第三个点
points.add((float) 294.0);
points.add((float) 118.0);
// 添加第四个点
points.add((float) 382.0);
points.add((float) 206.0); points.add((float) 470.0);
points.add((float) 118.0); // 通过画折线和贝塞尔曲线可以知道,点得位置是不一样的。
// 画折线
for (int i = 0; i < points.size() - 2; i = i + 2) {
canvas.drawLine(points.get(i), points.get(i + 1), points.get(i + 2), points.get(i + 3), paint);
canvas.drawCircle(points.get(i), points.get(i + 1), 3, paint);
}
canvas.drawCircle(points.get(points.size() - 2), points.get(points.size() - 1), 3, paint); // 贝塞尔曲线
paint.setColor(Color.BLUE);
Path p = new Path();
Point p1 = new Point();
Point p2 = new Point();
Point p3 = new Point();
float xp = points.get(0);
float yp = points.get(1);
// 设置第一个点开始
p.moveTo(xp, yp);
int length = points.size();
// 设置第一个控制点33%的距离
float mFirstMultiplier = 0.3f;
// 设置第二个控制点为66%的距离
float mSecondMultiplier = 1 - mFirstMultiplier; for (int b = 0; b < length; b += 2) {
int nextIndex = b + 2 < length ? b + 2 : b;
int nextNextIndex = b + 4 < length ? b + 4 : nextIndex;
// 设置第一个控制点
calc(points, p1, b, nextIndex, mSecondMultiplier);
// 设置第二个控制点
p2.setX(points.get(nextIndex));
p2.setY(points.get(nextIndex + 1));
// 设置第二个控制点
calc(points, p3, nextIndex, nextNextIndex, mFirstMultiplier);
// 最后一个点就是赛贝尔曲线上的点
p.cubicTo(p1.getX(), p1.getY(), p2.getX(), p2.getY(), p3.getX(), p3.getY());
// 画点
}
PathMeasure mPathMeasure;
mPathMeasure = new PathMeasure(p, false);
// 设置为线
paint.setStyle(Style.STROKE);
reSetPointWithPath(mPathMeasure, points);
for (int k = 0; k < points.size()-1; k +=2) {
canvas.drawCircle(points.get(k), points.get(k+1), 5, paint);
}
canvas.drawPath(p, paint); invalidate();
} /**
* 计算控制点
* @param points
* @param result
* @param index1
* @param index2
* @param multiplier
*/
private void calc(List<Float> points, Point result, int index1, int index2, final float multiplier) {
float p1x = points.get(index1);
float p1y = points.get(index1 + 1);
float p2x = points.get(index2);
float p2y = points.get(index2 + 1); float diffX = p2x - p1x;
float diffY = p2y - p1y;
result.setX(p1x + (diffX * multiplier));
result.setY(p1y + (diffY * multiplier));
} /**
* 重新设置点的位置,为曲线上的位置
* @param mPathMeasure
* @param pointsList
*/
public void reSetPointWithPath(PathMeasure mPathMeasure, List<Float> pointsList){
int length = (int) mPathMeasure.getLength();
int pointsLength = pointsList.size();
float[] coords = new float[2];
for (int b = 0; b < length; b++) {
mPathMeasure.getPosTan(b, coords, null);
double prevDiff = Double.MAX_VALUE;
boolean ok = true;
for (int j = 0; j < pointsLength && ok; j += 2) {
double diff = Math.abs(pointsList.get(j) - coords[0]);
if (diff < 1) {
pointsList.set(j + 1, coords[1]);
prevDiff = diff;
}
ok = prevDiff > diff;
}
}
}
}

4、定义点的类

package com.example.bezier;

import java.io.Serializable;

/**
* 点的类,来源于Achartengine
*/
public final class Point implements Serializable {
private float mX;
private float mY; public Point() {
} public Point(float x, float y) {
mX = x;
mY = y;
} public float getX() {
return mX;
} public float getY() {
return mY;
} public void setX(float x) {
mX = x;
} public void setY(float y) {
mY = y;
}
}

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. eclipse-统计代码行数

    使用Eclipse可以方便的统计工程或文件的代码行数,方法如下: 1.点击要统计的项目或许文件夹,在菜单栏点击Search,然后点击File...  2.选中正则表达式(Regular express ...

  2. linux下可以禁用的一些服务

    linux下多软件/多脚本之间的配合: 包括做好 “实体”和“配置”两个方面的事情 “实体”是指实实在在的脚本文件,服务脚本: “配置”是指其他与之交互的.协同工作的软件.脚本,要进行适当的配置,告知 ...

  3. ASP.NET MVC学习笔记-----使用自定义的View Engine

    我们都知道在ASP.NET MVC中自带了Razor View Engine,Razor十分的强大,可以满足我们绝大部分的需要.但是ASP.NET MVC的高度可扩展性,使我们可以使用自定义的View ...

  4. [置顶] Android应用开发之版本更新你莫愁

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 今天我们学习如何实现Android应用的自动更新版本功能,这是在各种语言编写的应用中都 ...

  5. Tomcat ClassLoader机制介绍

    本文旨在介绍JVM的类加载机制:同时分析Tomcat不能采用默认的加载机制的原因,并对其加载机制做了介绍. 1.JVM中的类加载机制 在Java2之后的版本中,类的加载采用的是一种称为双亲委派的代理模 ...

  6. Windows2003操作系统SQL Server 2008安装图解(详细)

    最近不少用户在windows2003 server 32位操作系统上安装SQL Server2008总是失败,出现大量错误.今天经过通过我反复测试安装,找出了一个便捷的安装方法,节省大家宝贵时间,具体 ...

  7. TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍

    首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...

  8. django-cms 代码研究(七)杂七杂八

    实体关系图 核心对象: cms_page/cms_placeholder/cms_cmsplugin. page模型类继承关系图 CMSPlugin&Placeholder模型类继承关系图 = ...

  9. Controller之间传递数据:属性传值

    在项目中,Controller之间传递数据非常之多,这里简单介绍一下属性传值.例如有FirstController 和 SecondController,数据从First传递到Second中,我们如何 ...

  10. 【leetcode】Interleaving String

    Interleaving String Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. Fo ...