用path画一个抽象的树叶

2024-06-22 12:48
文章标签 path 抽象 树叶

本文主要是介绍用path画一个抽象的树叶,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

源码地址:https://github.com/X-FAN/LeafView
只是个简单的demo,大家可以参考下

public class PathTestView extends View {private int mWidth;private int mHeight;private int mDuration = 5000;private int mState = 0;//当前状态;private float mFraction;private Paint mPaint;private PathMeasure mPathMeasure;private PathMeasure mPathMeasureLeft;private PathMeasure mPathMeasureRight;private ValueAnimator mAnimator;public PathTestView(Context context) {this(context, null);}public PathTestView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public PathTestView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initPaint();initPathAndMeasure();initAnimator();}private void initPaint() {mPaint = new Paint();mPaint.setStrokeWidth(10);mPaint.setStyle(Paint.Style.STROKE);mPaint.setColor(Color.WHITE);}private void initPathAndMeasure() {Path mPathLine = new Path();Path mPathLeft = new Path();Path mPathRight = new Path();mPathLine.lineTo(0, 400);mPathMeasure = new PathMeasure(mPathLine, false);mPathLeft.quadTo(-200, 200, 0, 400);//画贝赛尔曲线mPathMeasureLeft = new PathMeasure(mPathLeft, false);mPathRight.quadTo(200, 200, 0, 400);mPathMeasureRight = new PathMeasure(mPathRight, false);}private void initAnimator() {mAnimator = ValueAnimator.ofFloat(0f, 1.0f);mAnimator.setDuration(mDuration);mAnimator.setInterpolator(new DecelerateInterpolator());mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mFraction = (float) animation.getAnimatedValue();invalidate();}});mAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {if (mState < 3) {//更改状态mState++;} else {mState = 0;}mAnimator = mAnimator.clone();//本来想直接复用mAnimator,但是执行到onAnimationEnd,mAnimator貌似没有立即结束,直接start会有问题,mAnimator.start();           //问题待研究,若有知道具体原因的望告知}});mAnimator.start();}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mWidth = w;mHeight = h;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.translate(mWidth / 2, mHeight / 2);// 将画布坐标原点移动到中心位置canvas.scale(1, -1);//翻转y轴canvas.save();drawLine(canvas);drawLeaf(canvas);canvas.restore();}/*** 画叶子的边界** @param canvas*/private void drawLeaf(Canvas canvas) {Path dst = new Path();Path dstRight = new Path();switch (mState) {case 0:mPathMeasureLeft.getSegment(0, mPathMeasureLeft.getLength() * mFraction, dst, true);//取出要绘制部分的pathmPathMeasureRight.getSegment(0, mPathMeasureRight.getLength() * mFraction, dstRight, true);break;case 1:mPathMeasureLeft.getSegment(mPathMeasureLeft.getLength() * mFraction, mPathMeasureLeft.getLength(), dst, true);//取出要绘制部分的pathmPathMeasureRight.getSegment(mPathMeasureRight.getLength() * mFraction, mPathMeasureRight.getLength(), dstRight, true);break;case 2:mPathMeasureLeft.getSegment(mPathMeasureLeft.getLength() * (1 - mFraction), mPathMeasureLeft.getLength(), dst, true);//取出要绘制部分的pathmPathMeasureRight.getSegment(mPathMeasureRight.getLength() * (1 - mFraction), mPathMeasureRight.getLength(), dstRight, true);break;case 3:mPathMeasureLeft.getSegment(0, mPathMeasureLeft.getLength() * (1 - mFraction), dst, true);//取出要绘制部分的pathmPathMeasureRight.getSegment(0, mPathMeasureRight.getLength() * (1 - mFraction), dstRight, true);break;default:break;}canvas.drawPath(dst, mPaint);canvas.drawPath(dstRight, mPaint);}/*** 画主干*/private void drawLine(Canvas canvas) {Path dst = new Path();switch (mState) {case 0:mPathMeasure.getSegment(0, mPathMeasure.getLength() * mFraction, dst, true);break;case 1:mPathMeasure.getSegment(mPathMeasure.getLength() * mFraction, mPathMeasure.getLength(), dst, true);break;case 2:mPathMeasure.getSegment(mPathMeasure.getLength() * (1 - mFraction), mPathMeasure.getLength(), dst, true);break;case 3:mPathMeasure.getSegment(0, mPathMeasure.getLength() * (1 - mFraction), dst, true);break;default:break;}canvas.drawPath(dst, mPaint);}}

效果图
这里写图片描述

这篇关于用path画一个抽象的树叶的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084332

相关文章

工厂方法模式和抽象工厂模式的区别

区别  工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。    一个抽象工厂类,可以派生出多个具体工厂类。    每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。    一个抽象工厂类,可以派生出多个具体工厂类。    每个具体工厂类可以创建多个具体产品类的实例。    区别: 工厂方法模式只有一个抽象产品类

Java基础入门 【第七章 抽象、接口、内部类、枚举】(二)

匿名内部类书写格式: 父类或接口类型变量名=new父类或接口(构造方法实参列表){ //重写所有的抽象方法 @Override public返回值类型method1(形参列表){ 方法体实现 } @Override public返回值类型method2(形参列表){ 方法体实现 } //省略... }; //匿名内部类对象调用方法 变量名.重写方法(实参列表); 匿名

Flask 创建app 时候传入的 static_folder 和 static_url_path参数理解

Flask 在创建app的时候 是用 app = Flask(__name__) 来创建的,不传入 static_folder参数的话 ,默认的静态文件的位置是在 static目录下 我们可以进入 Flask的源码里面查看 ctrl+鼠标左键进入 这是Flask的 __init__源码(后面还有一些,我就选了需要的代码)     def __init__(self,import_

(4)SVG-path中的椭圆弧A(绝对)或a(相对)

1、概念 表示经过起始点(即上一条命令的结束点),到结束点之间画一段椭圆弧 2、7个参数 rx,ry,x-axis-rotation,large-arc-flag,sweep-flag,x,y (1)和(2)rx,ry rx:椭圆的x轴半径(即水平半径) ry:椭圆的y轴半径(即垂直半径) 这两个参数好理解,就是椭圆的两条对称轴半径,相等即为圆 也可以写比例,写比例时默认用符合条件

【ArcGIS Pro实操第二期】最小成本路径(Least-cost path)原理及实操案例

ArcGIS Pro实操第一期:最小成本路径原理及实操案例 概述(Creating the least-cost path)1.1 原理介绍1.2 实现步骤1.3 应用案例 2 GIS实操2.1 工具箱简介2.1.1 成本路径(Cost path)2.1.2 成本距离(Cost distance)2.1.2 路径距离(Path Distance) 2.2 案例: 参考 概述(Cre

大数据Java基础-JAVA IO 9】java IO流 (九) Path、Paths、Files的使用

1.NIO的使用说明: >Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO AP。 >NIO与原来的IO同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO操作。 >NIO将以更加高效的方式进行文件的读写操作。 >随着 JDK 7 的发布,Java对N

《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:可插入的Adapter(使用抽象操作)

 示例:可插入的Adapter(使用抽象操作) 说明: 当其他的类(如A)使用一个类(如C)时,如果所需的假定条件越少,这个类(如C)就更具可复用性。如果将接口匹配构建为一个类(如B),就不需要假定对其他的类可见的是一个相同的接口(如C接口)。也就是说,接口匹配使得我们可以将自己的类(如C)加入到一些现有的系统中去,而这些系统对这个类(如C)的接口可能会有所不同。 A  =〉 C

《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫

 示例:基于抽象工厂的迷宫   实现:     如果TMaze.Create是传递一个对象当作参数来建立rooms、walls及doors;如此你可以以不同的参数来改变rooms、walls及doors的类。  请注意MazeFactory也就是工厂方法(Factory Method)的一个集合;这是最通常实现抽象工厂模式的方式。同时请注意MazeFactory不是一个抽象类

最短路径(Shortest Path)

单源最短路径问题 Dijkstra算法:基于递推的思想设计 未达顶点的最短路径一定是由已到达顶点的最短路径求出 所有顶点之间的最短路径,任意两个顶点之间的最短路径 Floyd算法:只是Dijkstra最短路径算法的加强,其本质还是递推

【ArcGIS Pro实操第一期】最小成本路径(Least-cost path)原理及实操案例

ArcGIS Pro实操第一期:最小成本路径原理及实操案例 概述(Creating the least-cost path)1.1 原理介绍1.2 实现步骤1.3 应用案例 2 GIS实操2.1 工具箱简介2.1.1 成本路径(Cost path)2.1.2 成本距离(Cost distance)2.1.2 路径距离(Path Distance) 2.2 案例: 参考 概述(Cre