三个绘图工具类详解Paint(画笔)Canvas(画布)Path(路径)_setstrokecap-程序员宅基地

技术标签: java  android  开发语言  

1)Paint(画笔):

就是画笔,用于设置绘制风格,如:线宽(笔触粗细),颜色,透明度和填充风格等 直接使用无参构造方法 就可以创建Paint实例: Paint paint = new Paint( );

我们可以通过下述方法来设置Paint(画笔)的相关属性,另外,关于这个属性有两种, 图形绘制相关与文 本绘制相关:

setARGB(int a,int r,int g,int b): 设置绘制的颜色, a代表透明度, r, g, b代表颜色值。

setAlpha(int a): 设置绘制图形的透明度。

setColor(int color): 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜 色。

setAntiAlias(boolean aa): 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变 慢。

setDither(boolean dither): 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑 和饱满,图像更加清晰

setFilterBitmap(boolean filter): 如果该项设置为true,则图像在动画进行中会滤掉对

Bitmap图像的优化操作, 加快显示速度,本设置项依赖于dither和xfermode的设置

setMaskFilter(MaskFilter maskfilter): 设置MaskFilter,可以用不同的MaskFilter实现滤 镜的效果,如滤化,立体等

setColorFilter(ColorFilter colorfilter): 设置颜色过滤器,可以在绘制颜色时实现不用颜色 的变换效果

setPathEffect(PathEffect effect) 设置绘制路径的效果,如点画线等

setShader(Shader shader): 设置图像效果,使用Shader可以绘制出各种渐变效果

setShadowLayer(float radius ,float dx,float dy,int color):在图形下面设置阴影层,产生 阴影效果, radius为阴影的角度, dx和dy为阴影在x轴和y轴上的距离, color为阴影的颜色

setStyle(Paint.Style style): 设置画笔的样式,为FILL, FILL_OR_STROKE,或STROKE

setStrokeCap(Paint.Cap cap): 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的 图形样式, 如圆形样Cap.ROUND,或方形样式Cap.SQUARE

setSrokeJoin(Paint.Join join): 设置绘制时各图形的结合方式,如平滑效果等

setStrokeWidth(float width): 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的 粗细度

setXfermode(Xfermode xfermode): 设置图形重叠时的处理方式,如合并,取交集或并 集,经常用来制作橡皮的擦除效果

setFakeBoldText(boolean fakeBoldText): 模拟实现粗体文字,设置在小字体上效果会非 常差

setSubpixelText(boolean subpixelText): 设置该项为true,将有助于文本在LCD屏幕上的 显示效果

setTextAlign(Paint.Align align): 设置绘制文字的对齐方向

setTextScaleX(float scaleX): 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果

setTextSize(float textSize): 设置绘制文字的字号大小

setTextSkewX(float skewX): 设置斜体文字, skewX为倾斜弧度

setTypeface(Typeface typeface): 设置Typeface对象,即字体风格,包括粗体,斜体以及 衬线体,非衬线体等

setUnderlineText(boolean underlineText): 设置带有下划线的文字效果

setStrikeThruText(boolean strikeThruText): 设置带有删除线的效果

setStrokeJoin(Paint.Join join): 设置结合处的样子, Miter:结合处为锐角, Round:结合处 为圆弧: BEVEL:结合处为直线

setStrokeMiter(float miter):设置画笔倾斜度

setStrokeCap (Paint.Cap cap):设置转弯处的风格 其他常用方法:

float ascent( ):测量baseline之上至字符最高处的距离

float descent(): baseline之下至字符最低处的距离

int breakText(char[] text, int index, int count, float maxWidth, float[] measuredWidth): 检测一行显示多少文字

clearShadowLayer( ):清除阴影层 其他的自行查阅文档~

2)Canvas(画布):

画笔有了,接着就到画布(Canvas),总不能凭空作画是吧~常用方法如下: 首先是构造方法, Canvas的构造方法有两种:

Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布。

Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,将内容都绘制在bitmap上,因此

bitmap不得为null。 接着是

1.drawXXX()方法族:以一定的坐标值在当前画图区域画图,另外图层会叠加, 即后面绘画的图 层会覆盖前面绘画的图层。 比如:

drawRect(RectF rect, Paint paint) :绘制区域,参数一为RectF一个区域

drawPath(Path path, Paint paint) :绘制一个路径,参数一为Path路径对象

drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) : 贴图,参数一就是我们常 规的Bitmap对象,参数二是源区域(这里是bitmap), 参数三是目标区域(应该在canvas的位 置和大小),参数四是Paint画刷对象, 因为用到了缩放和拉伸的可能,当原始Rect不等于目 标Rect时性能将会有大幅损失。

drawLine(float startX, float startY, float stopX, float stopY, Paintpaint) : 画线,参数一起 始点的x轴位置,参数二起始点的y轴位置,参数三终点的x轴水平位置, 参数四y轴垂直位 置,最后一个参数为Paint 画刷对象。

drawPoint(float x, float y, Paint paint): 画点,参数一水平x轴,参数二垂直y轴,第三个 参数为Paint对象。

drawText(String text, float x, floaty, Paint paint) : 渲染文本, Canvas类除了上面的还可 以描绘文字,参数一是String类型的文本, 参数二x轴,参数三y轴,参数四是Paint对象。

drawOval(RectF oval, Paint paint):画椭圆,参数一是扫描区域,参数二为paint对象;

drawCircle(float cx, float cy, float radius,Paint paint): 绘制圆,参数一是中心点的x轴, 参数二是中心点的y轴,参数三是半径,参数四是paint对象;

drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint): 画弧,参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电 弧,参数二是起始角 (度)在电弧的开始,参数三扫描角(度)开始顺时针测量的,参数四是如果 这是真的话,包括椭圆中心的电 弧,并关闭它,如果它是假这将是一个弧线,参数五是Paint对象;

2.clipXXX()方法族:在当前的画图区域裁剪(clip)出一个新的画图区域,这个画图区域就是canvas

对象的当前画图区域了。比如: clipRect(new Rect()),那么该矩形区域就是canvas的当前画图区 域

3.save()和restore()方法: save( ):用来保存Canvas的状态。 save之后,可以调用Canvas的平 移、放缩、旋转、错切、裁剪等操作! restore():用来恢复Canvas之前保存的状态。防止

save后对Canvas执行的操作对后续的绘制有影响。 save()和restore()要配对使用(restore可以比

save少,但不能多),若restore调用次数比save多,会报错!

4.translate(float dx, float dy): 平移,将画布的坐标原点向左右方向移动x,向上下方向移动

y.canvas的默认位置是在(0,0)

5.scale(float sx, float sy):扩大, x为水平方向的放大倍数, y为竖直方向的放大倍数

6.rotate(float degrees):旋转, angle指旋转的角度,顺时针旋转

3)Path(路径)

简单点说就是描点,连线~在创建好我们的Path路径后,可以调用Canvas的

drawPath(path,paint) 将图形绘制出来~常用方法如下:

addArc(RectF oval, float startAngle, float sweepAngle:为路径添加一个多边形

addCircle(float x, float y, float radius, Path.Direction dir):给path添加圆圈

addOval(RectF oval, Path.Direction dir):添加椭圆形

addRect(RectF rect, Path.Direction dir):添加一个区域

addRoundRect(RectF rect, float[] radii, Path.Direction dir):添加一个圆角区域

isEmpty():判断路径是否为空

transform(Matrix matrix):应用矩阵变换

transform(Matrix matrix, Path dst):应用矩阵变换并将结果放到新的路径中,即第二个参 数。 更高级的效果可以使用PathEffect类! 几个To:

moveTo(float x, float y):不会进行绘制,只用于移动移动画笔

lineTo(float x, float y):用于直线绘制,默认从(0, 0)开始绘制,用moveTo移动! 比如 mPath.lineTo(300, 300); canvas.drawPath(mPath, mPaint);

quadTo(float x1, float y1, float x2, float y2): 用于绘制圆滑曲线,即贝塞尔曲线,同样可 以结合moveTo使用!

rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 同样是用来实现贝塞尔曲线 的。 (x1,y1) 为控制点, (x2,y2)为控制点, (x3,y3) 为结束点。 Same as cubicTo, but the coordinates are considered relative to the current point on this contour.就是多一个控制 点而已~ 绘制上述的曲线: mPath.moveTo(100, 500); mPath.cubicTo(100, 500, 300, 100, 600, 500); 如果不加上面的那个moveTo的话:则以(0,0)为起点, (100,500)和(300,100)为控 制点绘制贝塞尔曲线

arcTo(RectF oval, float startAngle, float sweepAngle): 绘制弧线(实际是截取圆或椭圆的 一部分) ovalRectF为椭圆的矩形, startAngle 为开始角度, sweepAngle 为结束角度。

2.示例

public class MyView extends View {
    private Paint paint;

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

    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }
    private void init(){
        paint=new Paint();
        paint.setAntiAlias(true);//抗锯齿
        paint.setColor(getResources().getColor(R.color.teal_200));//画笔的颜色
        paint.setStyle(Paint.Style.FILL);//画笔风格
        paint.setTextSize(36);//绘制文字大小
        paint.setStrokeWidth(5);//画笔粗细
    }
/重写该方法,在这里绘图
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
}
}

然后布局那里设置下这个View就好,下述代码都写在onDrawable中

1)设置画布颜色:

//设置画布颜色
canvas.drawColor(getResources().getColor(R.color.white));

2)绘制圆形:

canvas.drawCircle(getWidth()/2,getHeight()/2,100,paint);

3)绘制矩形:

canvas.drawRect(100,100,300,200,paint);

4)绘制Bitmap:

canvas.drawBitmap(BitmapFactory.decodeResource(getResources(),R.mipmap.img1),200,100,paint);

5)绘制弧形区域:

canvas.drawArc(new RectF(0,0,100,100),0,90,true,paint);

6)绘制圆角矩形

canvas.drawRoundRect(new RectF(10,10,210,110),15,15,paint);

7)绘制椭圆

canvas.drawOval(new RectF(0 , 0 , 200 , 300) ,Paint) ; //画椭圆

8)绘制多边形:

​
        Path path=new Path();
        path.moveTo(20,30);//移动坐标
        path.lineTo(100,50);
        path.lineTo(200,40);
        path.lineTo(300,20);
        path.close();
        canvas.drawPath(path,paint);
        path.moveTo(50,50);
        path.lineTo(100,100);
        path.lineTo(200,200);
        path.lineTo(300,300);
        path.close();
        canvas.drawTextOnPath("哈哈哈哈哈哈哈哈哈hhhhh哈哈哈哈哈",path,50,50,paint);

​

9)绘制文字:

canvas.drawText("哈哈哈哈哈哈哈",50,50,paint);
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shuo277/article/details/126235305

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签