Path相关评论的方法(一)
以前的主要是关于Canvas的translate(平移) 、scale(缩放) 、rotate(旋转) 、skew(错切)。接下来几篇主要讲下android里的Path(封装了贝塞尔曲线)& Canvas里的drawPath(path,paint);
非常多人听到贝塞尔曲线,就认为似乎挺高端大气上档次。后面会和大家一起揭开它的面纱,一睹真容;
Path(路径):
我们先看看Path类里有哪些方法
咱们从上往下看:
构造函数有两个。各自是
/**
* Create an empty path
*/
public Path() {
mNativePath = init1();
mDetectSimplePaths = HardwareRenderer.isAvailable();
}
和
/**
* Create a new path, copying the contents from the src path.
*
* @param src The path to copy from when initializing the new path
*/
public Path(Path src) {
int valNative = 0;
if (src != null) {
valNative = src.mNativePath;
}
mNativePath = init2(valNative);
mDetectSimplePaths = HardwareRenderer.isAvailable();
}
这没啥好说的,另外一种就是直接复用src 里设置的属性创建一个新的Path对象。
path.reset():清除掉path里的线条和曲线,可是不会改变它的fill-type(后面setFillType再说);
path.rewind():清除掉path里的线条和曲线,可是会保留内部的数据结构以便重用;
path.set(Path src);用src的内容替换原path的内容,一起看个小样例:
创建一个path,加入一个实心圆到path里
mEndPath = new Path();
mEndPath.addCircle(300, 300, 100, Direction.CW);
绘制该path:
canvas.drawPath(mEndPath, mPaint);
效果例如以下,无可厚非:
此时在path里再加入一个矩形:
mEndPath = new Path();
mEndPath.addCircle(300, 300, 100, Direction.CW);
mEndPath.addRect(new RectF(50, 50, 250, 200), Direction.CW);
效果例如以下:
做例如以下修改:
mEndPath = new Path();
mEndPath.addCircle(300, 300, 100, Direction.CW);
//mEndPath.addRect(new RectF(50, 50, 250, 200), Direction.CW); mSrcPath = new Path();
mSrcPath.addRect(new RectF(50, 50, 250, 200), Direction.CW);
mEndPath.set(mSrcPath);
直接执行,假设在4.0以上的机器上(4.0及以上硬件加速默认开启),会发现屏幕上什么都没有了,说明该方法会受到硬件加速的影响,关掉硬件加速,再看效果:
以下一起来看看Path 的 FillType - 填充模式:
android里定义了四种FillType,各自是:
WINDING (0),
EVEN_ODD (1),
INVERSE_WINDING (2),
INVERSE_EVEN_ODD (3)
有张图能够专门用来说明这四种模式的区别:
以上图示已经很清晰,我们还是用例如以下代码做下測试:
mEndPath = new Path();
mEndPath.addCircle(300, 300, 150, Direction.CW);
mEndPath.addCircle(380, 380, 150, Direction.CW);
mEndPath.setFillType(FillType.INVERSE_EVEN_ODD); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Style.FILL);
mPaint.setColor(Color.RED);
測试结果例如以下图:
不设置FillType:
setFillType(FillType.WINDING) setFillType(FillType.EVEN_ODD):
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGlhbmppYW40NTky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGlhbmppYW40NTky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
setFillType(FillType.INVERSE_WINDING): setFillType(FillType.INVERSE_EVEN_ODD):
依据以上图示,Path的FillType能够总结例如以下:
1.Path的默认FillType为 FillType.WINDING;
2.作用的范围为绘制 Path 的 Canvas 总体。而非 path 所在区域;
3.FillType.WINDING:取path全部所在区域;
4.FillType.EVEN_ODD:取path所在并不相交区域;
5.FillType.INVERSE_WINDING:取path全部未占区域;
6.FillType.INVERSE_EVEN_ODD:取path未占或相交区域;
以下看看和填充模式相关的几个方法:
getFillType():不用多说。返回 Path 的填充模式;
setFillType():设置 Path 的填充模式;
isInverseFillType():是否是 逆 填充模式:
WINDING 和 EVEN_ODD 返回false,INVERSE_WINDING 和 INVERSE_EVEN_ODD 返回true。
toggleInverseFillType():切换相反的填充模式。举个小样例:
mEndPath = new Path();
mEndPath.addCircle(300, 300, 150, Direction.CW);
mEndPath.addCircle(380, 380, 150, Direction.CW);
mEndPath.setFillType(FillType.WINDING);
mEndPath.toggleInverseFillType(); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Style.FILL);
mPaint.setColor(Color.RED);
此时给Path设置了WINDING的填充模式,调用toggleInverseFillType()。终于的模式为:
FillType.INVERSE_WINDING
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGlhbmppYW40NTky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
isEmpty():path是否为空,假设path不包括不论什么线条和曲线,则返回true,否则返回false;
isRect(RectF rect):假设path指定的是一个rect,则返回true,否则返回false。假设返回true & rect 不为null。则将该rect设置为path 的区域;
computeBounds(RectF bounds,boolean exact):计算path所在区域,并将结果写入bounds,假设整个path仅仅包括0或1个点,将返回(0,0,0,0):
用例如以下代码做下測试:
mComputeRect = new RectF();
mEndPath = new Path();
mEndPath.addCircle(380, 380, 150, Direction.CW);
mEndPath.addRect(new RectF(200, 300, 500, 500), Direction.CW);
mEndPath.computeBounds(mComputeRect, false);
Toast.makeText(
mContext,
"" + mComputeRect.left + "," + mComputeRect.top + "," + mComputeRect.right + ","
+ mComputeRect.bottom,
Toast.LENGTH_LONG).show();
返回结果为(200,230,530,530),即path所含内容的边界区域
incReserve(int extraPtCount):提示path将会添加extraPtCount个点。这能使path有效率的分配它的存储空间。
好了,这篇就主要介绍这些方法。后面主要介绍 Path 里 XXXTo 和 addXXX 相关的方法,最后我们再一起用Path做个样例!
Path相关评论的方法(一)的更多相关文章
- Java Learning Path(四) 方法篇
Java Learning Path(四) 方法篇 Java作为一门编程语言,最好的学习方法就是写代码.当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类 ...
- Android随笔之——Android时间、日期相关类和方法
今天要讲的是Android里关于时间.日期相关类和方法.在Android中,跟时间.日期有关的类主要有Time.Calendar.Date三个类.而与日期格式化输出有关的DateFormat和Simp ...
- Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。
#29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...
- Tomcat异常 Multiple Contexts have a path of "/qqshl".解决方法
Tomcat异常 Multiple Contexts have a path of "/qqshl".解决方法 找到tomcat映射文件Service.xml,将文件中的conte ...
- 三种dedecms调用相关文章的方法
在文章的末尾或侧边栏添加相关文章可以提高用户的黏度,提高pv,增加se的好印象(哈哈),那么dedecms如何调用相关文章呢?有三种方法可以实现. 第一种dedecms调用相关文章的方法,用默认的li ...
- Path类型的扩展方法 z
写了一个基于System.IO.Path类型方法的扩展类型,用于快速对文件系统路径进行操作.如下图: 其中有许多方法就是直接调用Path类型的静态方法.比如AppendPath方法内部会直接调用Pat ...
- WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流、IPersistStreamInit接口的声明和一些相关的小方法
原文:WinForms C#:html编辑器工程源码,含直接写WebBrowser的文件流.IPersistStreamInit接口的声明和一些相关的小方法 首先多谢朋友们的捧场: 今天给大家带来一个 ...
- IE6浏览器的bug问题及相关解决的方法
IE6浏览器的bug问题及相关解决的方法 1.css浮动边距加倍错误(双倍边距BUG)的解决办法 该错误只影响ie而不影响其他浏览器,我们可以考虑用hack来解决!!! 解决方法:_displ ...
- 转载:(Mac)在bash和zsh配置环境变量path的几种方法
参考文献 老习惯,列出本文参考或引用或转载的文档和博客,致以崇高的敬意,感兴趣的可以去看看 1.http://postgresapp.com/ 2.http://postgresapp.com/doc ...
随机推荐
- <摘录>详谈高性能TCP服务器的开发
对于开发一款高性能服务器程序,广大服务器开发人员在一直为之奋斗和努力.其中一个影响服务器的重要瓶颈就是服务器的网络处理模块.如果一款服务器程序不能及时的处理用户的数据.则服务器的上层业务逻辑再高效也是 ...
- [置顶] Ftp客户端概要设计
Ftp客户端概要设计 1.概述 ftp是基于TCP的文件传输协议,主要是用于控制远程文件,如下载.上传.续传.重命名.删除等.其命令是基于可见字符,易于理解的方式交互的.客户端与服务器端的交互遵循一应 ...
- tmd123.com
赞!完胜百度的搜索!比baidu.com好多了! 搜索用!非常像!比baidu.com好多了! mark一下 发现有人录制了101集swift视频教程好像持续更新中......
- [ExtJS5学习笔记]第第二十四次 Extjs5形式上gridpanel或表单数据后台传输remoteFilter设定
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39667533 官方文档:http://docs.sencha.com/extjs/5. ...
- android百度地图打包混淆 用不了No such file or directory (2) com.baidu.mapapi.BMapManager.init(Unknown Source)
调用了百度地图地图开发包是baidumapapi_v2_1_1.jar,定位SDK版本是locSDK_3.3.jar 调试的时候能运行!可是打包签名后就运行不了! baidu google 了好久! ...
- Photoshop图象切片保存为网页HTML(DIV+CSS布局)的方法
首先,制作图象切片(以一张图片为例子) 一.选择“切片”工具,在图像上拖动以分割图像(例如:一张图像切割2次就形成3个切片)切片后如下图 二.设置切片选项(如大小.目标链接.图片说明等等):选择“切片 ...
- UNIX下改动时间简单一例
UNIX下改动时间简单一例 仅仅输入date就显示当前的工作站时间,假设有root超级用户权限,加上參数能够改动 工作站的时间. 格式:date mmddHHMM[cc]yy mm--月份,dd--日 ...
- dsp下基于双循环缓冲队列的视频采集和显示记录
对最近在设计的视频采集和显示缓冲机制做一个记录,以便以后使用. 视频采集和显示缓冲机制,其实是参考了Linux下v4L2的驱动机制,其采用输入多缓冲frame,输出多缓冲的切换机制.简单的就是ping ...
- 成都Java培训机构太多,该如何选择呢?
Java培训的势头愈发火热.越来越多的人看到了Java培训的前途所在,可是最好的Java培训机构是哪家呢?如何推断一家Java培训机构的专业性呢?140610lscs" target=&qu ...
- [Erlang危机](5.0)执行时指标
原创文章.转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface . Then, in times of need, it's also po ...