Android 绘图学习

android绘图之Paint(1)
android绘图之Canvas基础(2)
Android绘图之Path(3)
Android绘图之drawText绘制文本相关(4)
Android绘图之Canvas概念理解(5)
Android绘图之Canvas变换(6)
Android绘图之Canvas状态保存和恢复(7)
Android绘图之PathEffect (8)
Android绘图之LinearGradient线性渐变(9)
Android绘图之SweepGradient(10)
Android绘图之RadialGradient 放射渐变(11)
Android绘制之BitmapShader(12)
Android绘图之ComposeShader,PorterDuff.mode及Xfermode(13)
Android绘图之drawText,getTextBounds,measureText,FontMetrics,基线(14)
Android绘图之贝塞尔曲线简介(15)
Android绘图之PathMeasure(16)
Android 动态修改渐变 GradientDrawable

1 Canvas 与屏幕

前面讲解了Canvas的基本概念,Android绘图之Canvas概念理解(5) ,
对Canvas的概念进行了分析,但是没有说明和屏幕的关系,Canvas不等于屏幕,屏幕不会动的,我们也无法对屏幕进行(平移,缩放等)操作,只能对Canvas进行操作,所以对Canvas进行操作,屏幕不动,最终会导致看到的图像不同。

下面开始讲解Canvas的变幻操作:
包括:translate,rotate,scale,skew,clip,clipout,matrix

2 translate 平移

先从最简单的平移开始:

/*** Preconcat the current matrix with the specified translation** @param dx The distance to translate in X* @param dy The distance to translate in Y
*/
public void translate(float dx, float dy) {if (dx == 0.0f && dy == 0.0f) return;nTranslate(mNativeCanvasWrapper, dx, dy);
}

对Canvas进行平移,
dx: x轴方向进行平移,正值向屏幕右侧
dy:y轴方向进行平移,正值向屏幕下方

mPaint1.setStrokeWidth(50);
canvas.drawPoint(0,0,mPaint1);
mPaint1.setColor(Color.RED);
canvas.translate(300,300);
canvas.drawPoint(0,0,mPaint1);

绘制两个点查看原点位置。

//绘制矩形:
canvas.drawRect(200,200,700,700,mPaint1);
mPaint1.setColor(Color.RED);
canvas.translate(200,200);
canvas.drawPoint(0,0,mPaint1);
canvas.drawRect(200,200,700,700,mPaint1);mPaint1.setColor(Color.GRAY);
canvas.drawRect(300,300,800,800,mPaint1);


原点显然改变了,以后再绘制任何形状都是以translate后的原点开始绘制。

3 scale 缩放

/*** Preconcat the current matrix with the specified scale.** @param sx The amount to scale in X* @param sy The amount to scale in Y*/
public void scale(float sx, float sy) {if (sx == 1.0f && sy == 1.0f) return;nScale(mNativeCanvasWrapper, sx, sy);
}/*** Preconcat the current matrix with the specified scale.** @param sx The amount to scale in X* @param sy The amount to scale in Y* @param px The x-coord for the pivot point (unchanged by the scale)* @param py The y-coord for the pivot point (unchanged by the scale)*/
public final void scale(float sx, float sy, float px, float py) {if (sx == 1.0f && sy == 1.0f) return;translate(px, py);scale(sx, sy);translate(-px, -py);
}

参数说明
sx:横向的缩放,默认为1,小数缩小,整数放大
sy:纵向的缩放,默认为1,小数缩小,整数放大

px,py,看源码知道是先translate,执行sx,sy然后再translate反方向。
第二次translate的坐标为(-pxsx,-pxsy),最终的效果就是px,py是缩放后不动的点。

canvas.drawRect(200,200,700,700,mPaint1);
canvas.scale(0.5f,0.5f);
mPaint1.setColor(Color.GRAY);
canvas.drawRect(200,200,700,700,mPaint1);

缩放后坐标减半。

如果想控制缩放后的位置,如何控制呢,这就需要第二个函数。

canvas.drawRect(200,200,700,700,mPaint1);
canvas.scale(0.5f,0.5f,200,200);
mPaint1.setColor(Color.GRAY);
canvas.drawRect(200,200,700,700,mPaint1);

还可以控制其他位置,例如控制缩放后在中心。

canvas.drawRect(200,200,700,700,mPaint1);
canvas.scale(0.5f,0.5f,450,450);
mPaint1.setColor(Color.GRAY);
canvas.drawRect(200,200,700,700,mPaint1);

4 Canvas 的旋转rotate

/*** Preconcat the current matrix with the specified rotation.** @param degrees The amount to rotate, in degrees*/
public void rotate(float degrees) ;
/** ** @param degrees The amount to rotate, in degrees* @param px The x-coord for the pivot point (unchanged by the rotation)* @param py The y-coord for the pivot point (unchanged by the rotation)*/
public final void rotate(float degrees, float px, float py) {if (degrees == 0.0f) return;translate(px, py);rotate(degrees);translate(-px, -py);
}

rotate有两个函数:
rotate(float degrees)
rotate(float degrees, float px, float py)
Degree:旋转的角度,正值为顺时针,负值为逆时针
Px,py:旋转的中心,如果不指定旋转中心默认为(0,0)点

canvas.drawRect(400,400,900,900,mPaint1);
canvas.rotate(-10);
mPaint1.setColor(Color.GRAY);
canvas.drawRect(400,400,900,900,mPaint1);

指定旋转中心为矩形中心

canvas.drawRect(400,400,900,900,mPaint1);
canvas.drawPoint(100,100,mPaint1);
canvas.rotate(10,650,650);mPaint1.setColor(Color.GRAY);
canvas.drawRect(400,400,900,900,mPaint1);

5 Skew 倾斜 画布

/*** Preconcat the current matrix with the specified skew.** @param sx The amount to skew in X* @param sy The amount to skew in Y*/
public void skew(float sx, float sy) {if (sx == 0.0f && sy == 0.0f) return;nSkew(mNativeCanvasWrapper, sx, sy);
}

参数说明:
sx:画布在x方向上倾斜相应的角度,sx倾斜角度的tan值,
sy:画布在y轴方向上倾斜相应的角度,sy为倾斜角度的tan值,

canvas.drawRect(200,200,700,700,mPaint1);
canvas.save();
canvas.skew(tan(30),0);
mPaint1.setColor(Color.GRAY);
canvas.drawRect(200,200,700,700,mPaint1);
canvas.restore();
mPaint1.setColor(Color.BLUE);
canvas.drawRect(200,800,700,1300,mPaint1);
canvas.save();
canvas.skew(0,tan(30));
mPaint1.setColor(Color.GRAY);
canvas.drawRect(200,800,700,1300,mPaint1);
canvas.restore();public float tan(int degree){return (float) Math.tan(degree*1.0/180*Math.PI);
}

6 clip 切割画布

根据矩形或者路径裁剪画布,画布被切割之后,只有部分区域可用,其他区域无法绘制内容。
Clip函数切割的区域可用,clipOut未被切割的区域可用。(过时函数不再讲解)

clipRect(@NonNull RectF rect)
clipRect(@NonNull Rect rect)
clipRect(float left, float top, float right, float bottom)
clipRect(int left, int top, int right, int bottom)clipPath(@NonNull Path path)一下函数需要api26以上
clipOutRect(@NonNull RectF rect)
clipOutRect(@NonNull Rect rect)
clipOutRect(float left, float top, float right, float bottom)
clipOutRect(int left, int top, int right, int bottom)
clipOutPath(@NonNull Path path)canvas.drawRect(200,200,700,700,mPaint1);
mPaint1.setColor(Color.GRAY);
canvas.drawRect(200,800,700,1300,mPaint1);
canvas.clipRect(200, 200, 700, 700);//截取画布大小为
canvas.drawCircle(100,100,100,mPaint1);//画布被剪切,无法画上
canvas.drawCircle(300,300,100,mPaint1);//可以画上

canvas.drawRect(200,200,700,700,mPaint1);
mPaint1.setColor(Color.GRAY);
canvas.drawRect(200,800,700,1300,mPaint1);
canvas.clipOutRect(200, 200, 700, 700);//截取画布大小为
canvas.drawCircle(100,100,100,mPaint1);//可以画上
canvas.drawCircle(300,300,100,mPaint1);//无法画上

7 matrix 变换

Matrix提供了一些方法来控制变换:

setTranslate(float dx,float dy):平移操作
setSkew(float kx,float ky):skew操作
setSkew(float kx,float ky,float px,float py):
setRotate(float degrees):旋转
setRotate(float degrees,float px,float py):
setScale(float sx,float sy):缩放
setScale(float sx,float sy,float px,float py):

Matrix的pre XXX和postXXX是左乘右乘的区别,是为了组合各种操作,因为矩阵不符合交换率,所以左乘右乘效果不同,一般利用matrix的效果需要反着乘得到最终的matrix.
以上的效果和canvas的set操作效果一样。

canvas.drawRect(200,200,700,700,mPaint1);
mPaint1.setColor(Color.GRAY);
Matrix matrix = new Matrix();
matrix.setRotate(10);
canvas.setMatrix(matrix);
canvas.drawRect(200,200,700,700,mPaint1);

Android绘图之Canvas变换(6)相关推荐

  1. android 绘图之Canvas,Paint类

    Canvas,Paint 1.在android 绘图但中经常要用到Canvas和Paint类,Canvas好比是一张画布,上面已经有你想绘制图画的轮廓了,而Paint就好比是画笔,就要给Canvas进 ...

  2. android绘图之Paint(1)

    Android 绘图学习 android绘图之Paint(1) android绘图之Canvas基础(2) Android绘图之Path(3) Android绘图之drawText绘制文本相关(4) ...

  3. Android绘图之LinearGradient线性渐变(9)

    Android 绘图学习 android绘图之Paint(1) android绘图之Canvas基础(2) Android绘图之Path(3) Android绘图之drawText绘制文本相关(4) ...

  4. Android绘图机制与处理技巧-更新中

    概述 这里我们主要来探讨下 Android屏幕的相关只是 Android绘图技巧 Android图像处理技巧 SurfaceView的使用 绘图技巧中,医生讲的比较粗略,更多的细节参考了 Keegan ...

  5. Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    前言 上一篇<Android绘图Canvas十八般武器之Shader篇(上)> 我们知道了Bitmap的用法,及TileMode的详细情况.接下来,这一篇作为整个知识体系的下半部要讲的是S ...

  6. Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有java层的,也有jni层深入到Frame ...

  7. android:绘图

    android:绘图 View:组件,理解为画布 Drawable:所有可见对象的描述,理解为:素材类 Bitmap:图片类 Canvas:画笔 Paint:画笔样式与颜色.特效的集合 近期很多网友对 ...

  8. 第六章Android绘图机制与处理技巧(Android群英传)

    本章将介绍关于Andorid绘图机制的一些高级技巧与分析 6.1.屏幕的尺寸信息 一般我们以720x1280为标准原稿,那么1dp = 2px 6.2.2D绘图基础 Canvas提供了很多api 如: ...

  9. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧...

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息 屏幕大小:屏幕对角线长度,单位"寸": 分辨率:手机屏幕像素点个数,例如720x1280分辨率: PPI(Pixels ...

最新文章

  1. php从数据库中读取特定的行
  2. 英雄探长的机器人怎么拼_LOL路人局都畏惧的辅助英雄,新版机器人布里兹上手指南...
  3. 1过程流程图 3 apqp_如何绘制流程图?这里有3种绘制方法,既简单又高效!1分钟可学会...
  4. Centos7环境安装Kibana5.2.2
  5. QuickContactBadge--------------关联联系人-----------------------
  6. elementui的css文件没有引入_Python中引入模块详细介绍,使用模块的过程中注意事项教程...
  7. 新建maven工程问题001
  8. 设计一个安全对外的API接口,需要考虑哪些方面?
  9. python day 02
  10. 2.Shell 编程从入门到精通 --- Shell编程基础
  11. java 字符串转long_如何在Java中将String转换为long?
  12. uvalive 3126 Taxi Cab Scheme
  13. 安装python时无法安装python包_无法安装Python包
  14. vs2015安装编辑神器:resharper10.0
  15. CUDA的旋转R ROI Align的OPENCL实现1(原理理解)
  16. 9月【笔耕不辍】勋章活动获奖名单公布
  17. 永久免费的专业二维码生成器和二维码扫描器
  18. Intel Realsense D455 D435i D415 T265 3D实感硬件对比
  19. 毕业了,让我们唱起这十首歌!
  20. java case 的错误_关于java:switch case语句错误:case表达式必须是常量表达式

热门文章

  1. 成都c++语言青少年培训,成都小孩学信息学奥赛的好处-成都童程童美少儿编程培训金沙校区...
  2. 安全的应用程序开发和应用程序安全防御
  3. 安全资讯|SurfingAttack –通过超声波入侵手机
  4. 外包人员:互联网公司【二等公民】...
  5. 印章如何去蜡_印章抛光上蜡保养【图解】
  6. html制作在线视频音乐播放器,用html5制作音乐播放器,这3款就足够了!
  7. 使用tkinter开发GUI程序4 -- tkinter常见控件的特征属性(第二部分)
  8. 【网络驱动器的映射】
  9. SWIFT国际资金清算系统
  10. Node Classification with Graph Neural Networks(使用GNN进行节点分类)