GVKun编程网logo

canvas中剪辑、阴影以及曲线的绘制(canvas 线条阴影)

6

对于想了解canvas中剪辑、阴影以及曲线的绘制的读者,本文将是一篇不可错过的文章,我们将详细介绍canvas线条阴影,并且为您提供关于AndroidCanvas绘制带下划线的文本、Android中贝

对于想了解canvas中剪辑、阴影以及曲线的绘制的读者,本文将是一篇不可错过的文章,我们将详细介绍canvas 线条阴影,并且为您提供关于Android Canvas绘制带下划线的文本、Android中贝塞尔曲线的绘制方法示例代码、Android用Canvas绘制贝塞尔曲线、Android通过交互实现贝塞尔曲线的绘制的有价值信息。

本文目录一览:

canvas中剪辑、阴影以及曲线的绘制(canvas 线条阴影)

canvas中剪辑、阴影以及曲线的绘制(canvas 线条阴影)

区域剪辑

<!DOCTYPE html>
<html lang="en"head>
    Meta charset="UTF-8"title>canvas</style>
        .canvas{border:1px solid #abcdef;background-color #a9add2}
    bodycanvas class="canvas" id width="600" height="400">您的浏览器不支持canvascanvas>

    script>
        var canvas=document.getElementById("canvas);
         ctxcanvas.getContext(2d);//上下文,绘图环境

        在矩形右上角绘制一个圆
        ctx.arc(300,10020002*Math.PI,1)">true进行区域剪辑
        后面绘制的所有图形都会在这个原型区域内绘制,超出部分被剪辑
        ctx.clip();

        ctx.fillStylepink;
        绘制矩形
        ctx.fillRect();
       
    
    html>

 

 

);

        再绘制一个圆
        ctx.fillStyle#abcdef;
        ctx.beginPath();
        ctx.arc(400);
        ctx.fill();
       
    
    >

 

 

取消区域剪辑,使用save和restore

上下文,绘图环境

        ctx.save();

        );

        ctx.restore();
        
        >

 

 

绘制四色圆

绘制一个圆
);

        ctx.fillStylelightgreenorange>

 

 

阴影


        ctx.fillStyle阴影x轴偏移
        ctx.shadowOffsetX10阴影y轴偏移
        ctx.shadowOffsetY阴影颜色
        ctx.shadowColorrgba(0,.2)模糊程度
        ctx.shadowBlur1);

    
    >

 

 

文字阴影

绘制文字
        ctx.font20px sans-serif;
        ctx.fillText(cyy呀>

@H_439_301@

 

 

补充一下,设置文字的大小,这个ctx.font中,必须要加字体

我刚开始只是单纯设置了20px,发现是不生效的

必须加上字体如sans-serif才可以

 

);
        ctx.fillText(小仙女>

 

 

绘制曲线

圆弧的绘制 arc


        ctx.arc(50/2,true);逆时针
        ctx.stroke();

        ctx.beginPath();
        ctx.arc(顺时针
        ctx.stroke();

    
    >

 

 

二次贝塞尔曲线生成工具:

http://blogs.sitepointstatic.com/examples/tech/canvas-curves/quadratic-curve.html

三次贝塞尔曲线生成工具

http://blogs.sitepointstatic.com/examples/tech/canvas-curves/bezier-curve.html

 

二次贝塞尔曲线由三个点完成

 

 最左边的点对应的是moveto的坐标

中间的点对应的是quadraticCurveto的第一个坐标点参数

最右边的点对应的是quadraticCurveto的第二个坐标点参数

 

三次贝塞尔曲线由4个点完成

 

 

最左边的点对应的是moveto的坐标

第一个柄对应的是quadraticCurveto的第一个坐标点参数

第二个柄对应的是quadraticCurveto的第二个坐标点参数

最右边的点对应的是quadraticCurveto的第三个坐标点参数

 

总结

以上是小编为你收集整理的canvas中剪辑、阴影以及曲线的绘制全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Android Canvas绘制带下划线的文本

Android Canvas绘制带下划线的文本

如何在带有Android的画布上绘制带下划线的文本?
我知道Bold和Italic是如何工作的,但是我如何绘制带有下划线的文本呢?
它是否可能,或者我是否必须找到解决此问题的解决方法?

解决方法:

你可以使用Paint. UNDERLINE_TEXT_FLAG,

例如:

class SampleView extends View {
        public SampleView(Context context) {
            super(context);
        }

        @Override
        protected void onDraw(Canvas canvas) {

            Paint paint = new Paint();
            paint.setTextSize(25);
            paint.setColor(Color.RED);

            paint.setFlags(Paint. UNDERLINE_TEXT_FLAG);
            paint.setColor(Color.GREEN);
            canvas.drawText("My Underline Text", 50, 140, paint);

        }
    }

Android中贝塞尔曲线的绘制方法示例代码

Android中贝塞尔曲线的绘制方法示例代码

       贝塞尔曲线,很多人可能不太了解,什么叫做贝塞尔曲线呢?这里先做一下简单介绍:贝塞尔曲线也可以叫做贝济埃曲线或者贝兹曲线,它由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋。一般的矢量图形软件常利用贝塞尔曲线来精确画出曲线。

       上面的介绍中,“线段像可伸缩的皮筋”这句话非常关键,但也特别好理解。至于贝塞尔曲线的详细内容大家可以查阅相关资料。

       Android提供的贝塞尔曲线绘制接口

       在Android开发中,要实现贝塞尔曲线其实还是很简单的,因为Android已经给我们提供了相关接口,但此接口方法被藏的有点深,藏于Path类中。此方法如下:

       android.graphics.Path.quadTo(float x1,float y1,float x2,float y2)

       Since: API Level 1

       参数说明:

       x1:操作点的x坐标

       y1:操作点的y坐标

       x2:结束点的x坐标

       y2:结束点的y坐标

       从API中看出,贝塞尔曲线从API-1就开始支持了。

       Android贝塞尔曲线的绘制实例

       熟悉方法后,下面就来实现:

       SurfaceView框架不多讲,看过我博客的都应该知道的。

       直接看MySurfaceView类,此类继承SurfaceView,是游戏的主视图。

       这里为了更清晰的讲解:这里部分代码先不贴出来了,最后会整体贴出。

       首先是定义相关的成员变量:

Java代码

// 贝赛尔曲线成员变量(起始点,控制(操作点),终止点,3点坐标) 
private int startX,startY,controlX,controlY,endX,endY; 
// Path 
private Path path; 
// 为了不影响主画笔,这里绘制贝赛尔曲线单独用一个新画笔 
private Paint paintQ; 
// 随机库(让贝赛尔曲线更明显) 
private Random random; 

          本类构造函数:

Java代码

/** 
 * SurfaceView初始化函数 
 */ 
public MySurfaceView(Context context) { 
 super(context); 
 ... 
  //贝赛尔曲线相关初始化 
  path = new Path(); 
  paintQ = new Paint(); 
  paintQ.setAntiAlias(true); 
  paintQ.setStyle(Style.stroke); 
  paintQ.setstrokeWidth(5); 
  paintQ.setColor(Color.WHITE); 
  random = new Random(); 
 ... 
} 

            接着我把贝赛尔曲线的绘制封装成一个方法了,函数如下:

Java代码

/** 
 * 绘制贝赛尔曲线 
 * 
 * @param canvas 主画布 
 */ 
public void drawQpath(Canvas canvas) { 
 path.reset();// 重置path 
 // 贝赛尔曲线的起始点 
 path.moveto(startX,startY); 
 // 设置贝赛尔曲线的操作点以及终止点 
 path.quadTo(controlX,endY); 
 // 绘制贝赛尔曲线(Path) 
 canvas.drawPath(path,paintQ); 
} 

          最后是用户触屏监听函数以及逻辑函数:

Java代码

/** 
 * 触屏事件监听 
 */ 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
 endX = (int) event.getX(); 
 endY = (int) event.getY(); 
 return true; 
} 
/** 
 * 游戏逻辑 
 */ 
private void logic() { 
 if (endX != 0 && endY != 0) { 
  // 设置操作点为线段x/y的一半 
  controlX = random.nextInt((endX - startX) / 2); 
  controlY = random.nextInt((endY - startY) / 2); 
 } 
} 

       整个代码很easy,主要是贝赛尔函数的参数,尤其是操作点,操作点的各种不同可以实现不同的效果,这里我简单的统一的讲操作点设置成用户触屏点的x、y的一半,呵呵偷懒了~~

       我把贝赛尔的操作点写在了逻辑logic()函数中,不断的执行,并且每次利用nextInt函数得到随机的操作点,主要为了让其曲线不断的变化从而形成一个震动的曲线运动轨迹。

       运行效果截图如下:

        这里可能由于图片是静止的,所以效果看起来不是很明显,大家可以运行源码来观察。

       下面贴出整个MySurfaceView的源码:

Java代码

package com.qpath; 
import java.util.Random; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Paint.Style; 
import android.graphics.Path; 
import android.view.KeyEvent; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceHolder.Callback; 
import android.view.SurfaceView; 
/** 
 * 赛贝尔曲线 
 * @author Himi 
 * 
 */ 
public class MySurfaceView extends SurfaceView implements Callback,Runnable { 
 private SurfaceHolder sfh; 
 private Paint paint; 
 private Thread th; 
 private boolean flag; 
 private Canvas canvas; 
 public static int screenW,screenH; 
 // -----------以上是SurfaceView游戏框架 
 // 贝赛尔曲线成员变量(起始点,控制(操作点),终止点,3点坐标) 
 private int startX,endY; 
 // Path 
 private Path path; 
 // 为了不影响主画笔,这里绘制贝赛尔曲线单独用一个新画笔 
 private Paint paintQ; 
 // 随机库(让贝赛尔曲线更明显) 
 private Random random; 
 /** 
  * SurfaceView初始化函数 
  */ 
 public MySurfaceView(Context context) { 
  super(context); 
  sfh = this.getHolder(); 
  sfh.addCallback(this); 
  paint = new Paint(); 
  paint.setColor(Color.WHITE); 
  paint.setAntiAlias(true); 
  setFocusable(true); 
  // -----------以上是SurfaceView游戏框架 
  //贝赛尔曲线相关初始化 
  path = new Path(); 
  paintQ = new Paint(); 
  paintQ.setAntiAlias(true); 
  paintQ.setStyle(Style.stroke); 
  paintQ.setstrokeWidth(5); 
  paintQ.setColor(Color.WHITE); 
  random = new Random(); 
 } 
 /** 
  * SurfaceView视图创建,响应此函数 
  */ 
 public void surfaceCreated(SurfaceHolder holder) { 
  screenW = this.getWidth(); 
  screenH = this.getHeight(); 
  flag = true; 
  // 实例线程 
  th = new Thread(this); 
  // 启动线程 
  th.start(); 
  // -----------以上是SurfaceView游戏框架 
 } 
 /** 
  * 游戏绘图 
  */ 
 public void myDraw() { 
  try { 
   canvas = sfh.lockCanvas(); 
   if (canvas != null) { 
    canvas.drawColor(Color.BLACK); 
    // -----------以上是SurfaceView游戏框架 
    drawQpath(canvas); 
   } 
  } catch (Exception e) { 
   // Todo: handle exception 
  } finally { 
   if (canvas != null) 
    sfh.unlockCanvasAndPost(canvas); 
  } 
 } 
 /** 
  * 绘制贝赛尔曲线 
  * 
  * @param canvas 主画布 
  */ 
 public void drawQpath(Canvas canvas) { 
  path.reset();// 重置path 
  // 贝赛尔曲线的起始点 
  path.moveto(startX,startY); 
  // 设置贝赛尔曲线的操作点以及终止点 
  path.quadTo(controlX,endY); 
  // 绘制贝赛尔曲线(Path) 
  canvas.drawPath(path,paintQ); 
 } 
 /** 
  * 触屏事件监听 
  */ 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
  endX = (int) event.getX(); 
  endY = (int) event.getY(); 
  return true; 
 } 
 /** 
  * 游戏逻辑 
  */ 
 private void logic() { 
  if (endX != 0 && endY != 0) { 
   // 设置操作点为线段x/y的一半 
   controlX = random.nextInt((endX - startX) / 2); 
   controlY = random.nextInt((endY - startY) / 2); 
  } 
 } 
 /** 
  * 按键事件监听 
  */ 
 @Override 
 public boolean onKeyDown(int keyCode,KeyEvent event) { 
  return super.onKeyDown(keyCode,event); 
 } 
 public void run() { 
  while (flag) { 
   long start = System.currentTimeMillis(); 
   myDraw(); 
   logic(); 
   long end = System.currentTimeMillis(); 
   try { 
    if (end - start < 50) { 
     Thread.sleep(50 - (end - start)); 
    } 
   } catch (InterruptedException e) { 
    e.printstacktrace(); 
   } 
  } 
 } 
 /** 
  * SurfaceView视图状态发生改变,响应此函数 
  */ 
 public void surfaceChanged(SurfaceHolder holder,int format,int width,int height) { 
 } 
 /** 
  * SurfaceView视图消亡时,响应此函数 
  */ 
 public void surfaceDestroyed(SurfaceHolder holder) { 
  flag = false; 
 } 
} 

          以上就是对Android 贝塞尔曲线的绘制的示例代码,后续继续补充相关知识,谢谢大家对本站的支持!

Android用Canvas绘制贝塞尔曲线

Android用Canvas绘制贝塞尔曲线

用Canvas画贝塞尔曲线,要画贝塞尔曲线首先了解贝塞尔曲线:

由于用计算机画图大部分时间是操作鼠标来掌握线条的路径,与手绘的感觉和效果有很大的差别。即使是一位精明的画师能轻松绘出各种图形,拿到鼠标想随心所欲的画图也不是一件容易的事。这一点是计算机万万不能代替手工的工作,所以到目前为止人们只能颇感无奈。使用贝塞尔工具画图很大程度上弥补了这一缺憾。

贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一。它通过控制曲线上的四个点(起始点、终止点以及两个相互分 离的中间点)来创造、编辑图形。其中起重要作用的是位于曲线中央的控制线。这条线是虚拟的,中间与贝塞尔曲线交叉,两端是控制端点。移动两端的端点时贝塞 尔曲线改变曲线的曲率(弯曲的程度);移动中间点(也就是移动虚拟的控制线)时,贝塞尔曲线在起始点和终止点锁定的情况下做均匀移动。注意,贝塞尔曲线上 的所有控制点、节点均可编辑。这种“智能化”的矢量线条为艺术家提供了一种理想的图形编辑与创造的工具。

在安卓开发中Canvas提供了画贝塞尔曲线的方法,在Canvas中的quadTo方法只能画3次的贝塞尔曲线,不过还提供了rQuadTo方法实现了以结束点为原点的续接。用这个做一个滚动的波浪线,如果把这个波浪线截取一块可以做成类似加速球的东西

/**
 * Created by Administrator on 2015/9/17.
 */
public class MyPathView extends View {
private int height;
private int width;
private Path path;//路径
private Paint mPaint;
private Paint mPaintpoint;
private int count;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0x23://这应该写一个static final的变量
count++;
if (count < 80) {//形成循环,因为波浪线是两段40所以一个周期80
                        setCount(count);
handler.sendEmptyMessageDelayed(0x23, 20);
                    } else {
count = 0;
handler.sendEmptyMessageDelayed(0x23, 20);
                    }
break;
            }

        }
    };

public void setCount(int count) {
this.count = count;
        invalidate();
    }

public MyPathView(Context context) {
super(context);
    }

public MyPathView(Context context, AttributeSet attrs) {
super(context, attrs);
path = new Path();
mPaint = new Paint();
mPaintpoint = new Paint();
mPaintpoint.setStrokeWidth(10);
mPaintpoint.setColor(Color.YELLOW);
mPaint.setAntiAlias(true);
mPaint.setTextSize(50);
mPaint.setStyle(Paint.Style.STROKE);
handler.sendEmptyMessage(0x23);//
    }

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(width, height);
    }

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

path.reset();
path.moveTo(count, 100);
for (int i = 0; i < 10; i++) {
path.rQuadTo(20, 10, 40, 0);//以(count=0,100)为原点开始画,控制点、结束点
path.rQuadTo(20, -10, 40, 0);//以(40,0)为原点开始画,形成一个类似余弦的波浪周期
        }
        canvas.drawPath(path, mPaint);
使用quadTo绘制曲线
//      path.moveTo(100, 100);
//        path.quadTo(100, 400, 300, 300);//控制点终点
//        canvas.drawPoint(100,100,mPaintpoint);//起点
//        canvas.drawPoint(100,400,mPaintpoint);//控制点
//        canvas.drawPoint(300,300,mPaintpoint);//终点
}
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:
  • Android使用贝塞尔曲线画心形
  • Android自定义View绘制贝塞尔曲线的方法
  • Android贝塞尔曲线实现加入购物车抛物线动画
  • Android自定义view贝塞尔曲线
  • android实现贝塞尔曲线之波浪效果
  • Android通过交互实现贝塞尔曲线的绘制
  • Android 贝塞尔曲线绘制一个波浪球
  • android贝塞尔曲线实现波浪效果
  • Android自定义View绘制贝塞尔曲线实现流程

Android通过交互实现贝塞尔曲线的绘制

Android通过交互实现贝塞尔曲线的绘制

前言

之前几篇我们介绍了贝塞尔曲线的原理、绘制曲线和动效实现,这些都是代码预设好的,如果我们要根据需要自行绘制曲线,就需要使用交互来实现了。本篇我们先来介绍简单的交互式绘图,通过获取触控位置来设定贝塞尔曲线的控制点,从而实现交互式绘制曲线。

获取触控位置

第一个要解决的问题是如何获取手指在屏幕的触控位置。在 Flutter 中,提供了一个 Listener 组件,可以监听各类触控事件。Listener 的组件构造方法定义如下:

const Listener({
  Key? key,
  this.onPointerDown,
  this.onPointerMove,
  this.onPointerUp,
  this.onPointerHover,
  this.onPointerCancel,
  this.onPointerSignal,
  this.behavior = HitTestBehavior.deferToChild,
  Widget? child,
}) 

其中onPointerXX都是触控事件的回调方法,在回调里会携带触控的位置信息,具体的参数如下:

  • onPointerDown:触控点按下去(类似鼠标按下未释放)时的回调方法,携带了一个PointerDownEvent参数,该参数会包含点按信息,其中有一个localPosition参数,即当时点按时的位置。
  • onPointerUp:触控点按 松开(类似鼠标按下后释放)时的回调方法,携带了一个PointerUpEvent参数,该参数会包含点按信息,其中有一个localPosition参数,即当时点按时的位置。
  • onPointerMove:按下后移动(拖动)时的回调方法,携带了 PointerMoveEvent参数,包含了起始位置和移动的距离等信息。
  • onPointerHover:这个很好理解,hover 状态时的事件,不过在触控设备上没有 hover 事件。
  • onPointerCancel:产生 onPointerDown 事件的指针(Pointer)不再指向该接收器(有点费解,目前没想到具体的应用场景,后续遇到了再研究一下)。
  • onPointerSignal:当指针发出其他信息时的回调,目前也没想到具体的场景,可能是桌面应用会涉及到。
  • behavior:这个参数需要注意,也就是触控事件的检测方式,是一个HitTestBehavior枚举,默认是deferToChild,只允许子组件响应触控事件。opaque自身可以响应触控事件(子组件和自己都可以),但下层的组件无法响应触控事件。translucent为穿透类型,下层组件也能够响应到触控事件。我们可以根据需要来确定触控事件的响应方式。

下面是点按后获取触控位置为例代码,使用的话还是比较简单的。当然,这里要说明一下,如果只是单纯地获取触控事件,而不需要触控的细节(比如位置,触控力度等),那么官方推荐是使用更高封装层级的手势识别组件 GestureDetector

Listener(
  onPointerUp: ((event) {
    print(''position: ${event.localPosition}'');
  }),
  behavior: HitTestBehavior.opaque,
  child: ...
),

交互绘制实现

有了上面的基础,我们获取到触控点位置后,刷新界面触发 Canvas 重绘即可。不过这里有个问题,我们希望是可以连续绘制,而不是只能绘制一条曲线。比如说我们点按了2个点,那就绘制直线;3个点就绘制2阶贝塞尔曲线;4个点绘制3阶贝塞尔曲线;4个点以上,把前一条曲线的结束点当做新的曲线的起点,按上述的方式循环绘制。这样我们就能够保证曲线是连续的了。这里可以通过递归方式实现,代码如下:

void drawCurves(Canvas canvas, Paint paint, List<Offset> points) {
    if (points.length <= 1) {
      return;
    }
    if (points.length == 2) {
      canvas.drawLine(points[0], points[1], paint);
      return;
    }
    if (points.length == 3) {
      _draw2OrderBezierCurves(canvas, paint, points);
      return;
    }
    if (points.length == 4) {
      _draw3OrderBezierCurves(canvas, paint, points);
      return;
    }
    var subPoints = points.sublist(0, 4);
    drawCurves(canvas, paint, subPoints);
    drawCurves(canvas, paint, points.sublist(3));
}

此外,考虑可能绘制的不是我们想要的效果,要支持撤销功能,因此我们加了一个按钮,点击按钮可以删除最近添加的点,从而实现撤销功能。我们用 ScaffoldfloatingActionButton 实现,逻辑很简单,就是如果点数组不为空的话,就删除最后一个点,然后刷新界面就好了。

floatingActionButton: IconButton(
  onPressed: () {
    if (points.isNotEmpty) {
      points.removeLast();
      setState(() {});
    }
  },
  icon: Icon(
    Icons.backspace,
    color: Colors.blue,
  ),
),

绘制代码

有了上面的基础,绘制代码就简单很多了,我们用一个数组存储已经点击的点,然后通过这些点递归调用绘制方法就可以 实现交互式绘制了,完整代码如下所示,这里我们把控制点使用圆圈绘制出来了。

class GestureBezierDemo extends StatefulWidget {
  GestureBezierDemo({Key? key}) : super(key: key);

  @override
  State<GestureBezierDemo> createState() => _GestureBezierDemoState();
}

class _GestureBezierDemoState extends State<GestureBezierDemo> {
  var points = <Offset>[];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Listener(
        onPointerUp: ((event) {
          points.add(event.localPosition);
          setState(() {});
        }),
        behavior: HitTestBehavior.opaque,
        child: CustomPaint(
          foregroundPainter: GestureBezierPainter(points: points),
          child: Container(
            width: MediaQuery.of(context).size.width,
            height: MediaQuery.of(context).size.height,
            color: Color(0xFFF5F5F5),
          ),
        ),
      ),
      floatingActionButton: IconButton(
        onPressed: () {
          if (points.isNotEmpty) {
            points.removeLast();
            setState(() {});
          }
        },
        icon: Icon(
          Icons.backspace,
          color: Colors.blue,
        ),
      ),
    );
  }
}

class GestureBezierPainter extends CustomPainter {
  GestureBezierPainter({required this.points});
  final List<Offset> points;
  @override
  void paint(Canvas canvas, Size size) {
    print(size);
    canvas.drawColor(Color(0xFFF1F1F1), BlendMode.color);
    var paint = Paint()..color = Color(0xFFE53020);
    paint.strokeWidth = 2.0;
    paint.style = PaintingStyle.stroke;
    for (var point in points) {
      canvas.drawCircle(point, 2.0, paint);
    }
    paint.color = Color(0xFF2480F0);
    drawCurves(canvas, paint, points);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return true;
  }

  void drawCurves(Canvas canvas, Paint paint, List<Offset> points) {
    if (points.length <= 1) {
      return;
    }
    if (points.length == 2) {
      canvas.drawLine(points[0], points[1], paint);
      return;
    }
    if (points.length == 3) {
      _draw2OrderBezierCurves(canvas, paint, points);
      return;
    }
    if (points.length == 4) {
      _draw3OrderBezierCurves(canvas, paint, points);
      return;
    }
    var subPoints = points.sublist(0, 4);
    drawCurves(canvas, paint, subPoints);
    drawCurves(canvas, paint, points.sublist(3));
  }

  _draw3OrderBezierCurves(Canvas canvas, Paint paint, List<Offset> points) {
    assert(points.length == 4);
    var yGap = 60.0;
    var path = Path();
    path.moveTo(points[0].dx, points[0].dy);
    for (var t = 1; t <= 100; t += 1) {
      var curvePoint = BezierUtil.get3OrderBezierPoint(
          points[0], points[1], points[2], points[3], t / 100.0);

      path.lineTo(curvePoint.dx, curvePoint.dy);
    }
    canvas.drawPath(path, paint);
  }

  _draw2OrderBezierCurves(Canvas canvas, Paint paint, List<Offset> points) {
    assert(points.length == 3);
    var path = Path();
    path.moveTo(points[0].dx, points[0].dy);
    for (var t = 1; t <= 100; t += 1) {
      var curvePoint = BezierUtil.get2OrderBezierPoint(
          points[0], points[1], points[2], t / 100.0);

      path.lineTo(curvePoint.dx, curvePoint.dy);
    }
    canvas.drawPath(path, paint);
  }
}

运行效果

运行效果如下图所示。

总结

本篇其实更多地是介绍获取屏幕触控位置的内容,要实现交互式绘制就需要掌握用户的触控行为,从而绘制对应的图案。接下来我们会继续探索更多交互行为,做更多的交互式绘制探索。

到此这篇关于Android通过交互实现贝塞尔曲线的绘制的文章就介绍到这了,更多相关Android绘制贝塞尔曲线内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • Android使用贝塞尔曲线画心形
  • Android自定义View绘制贝塞尔曲线的方法
  • Android贝塞尔曲线实现加入购物车抛物线动画
  • Android用Canvas绘制贝塞尔曲线
  • Android自定义view贝塞尔曲线
  • android实现贝塞尔曲线之波浪效果
  • Android 贝塞尔曲线绘制一个波浪球
  • android贝塞尔曲线实现波浪效果
  • Android自定义View绘制贝塞尔曲线实现流程

我们今天的关于canvas中剪辑、阴影以及曲线的绘制canvas 线条阴影的分享就到这里,谢谢您的阅读,如果想了解更多关于Android Canvas绘制带下划线的文本、Android中贝塞尔曲线的绘制方法示例代码、Android用Canvas绘制贝塞尔曲线、Android通过交互实现贝塞尔曲线的绘制的相关信息,可以在本站进行搜索。

本文标签: