canvas教程

Android 自定义View学习(七)(5)

字号+ 作者:H5之家 来源:H5之家 2017-01-20 18:09 我要评论( )

Region.Op.XOR两次的非交集 异或,取两次交集外的区域 有点类似PorterDuffXfermode图像处理的效果 2.2 CilpPath 裁切不规则画布 裁切出一个圆形区域的画布 private void init() {mPaint = new Paint(Paint.ANTI_ALI


Region.Op.XOR两次的非交集

异或,取两次交集外的区域

有点类似PorterDuffXfermode图像处理的效果

2.2 CilpPath 裁切不规则画布

裁切出一个圆形区域的画布

private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(Color.WHITE); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5f); path = new Path(); path.addCircle(300,300,100, Path.Direction.CCW); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //绘制底色 蓝 canvas.drawColor(Color.BLUE); //裁切画布 canvas.clipPath(path); //绘制裁切后的区域底色 canvas.drawColor(Color.parseColor("#FF4081")); //绘制辅助圆形 canvas.drawCircle(300,300,100,mPaint); }


裁切圆形的画布

clip的方法基本就学到这里

3.其他方法

画布除了裁切外,还有可以进行旋转

3.1 rotate 旋转方法 private void init() { rectP1 = new Paint(Paint.ANTI_ALIAS_FLAG); rectP1.setColor(Color.BLUE); rectP2 = new Paint(Paint.ANTI_ALIAS_FLAG); rectP2.setColor(Color.parseColor("#FF4081")); rectF1 = new RectF(100,100,400,400); rectF2 = new RectF(200,200,300,300); } /** * 旋转画布 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //旋转30° canvas.rotate(30); canvas.drawRect(rectF1,rectP1); canvas.drawRect(rectF2,rectP2); }


旋转30度

整个画布进行了顺时针旋转30°,参数为正时,是顺时针旋转,负数为逆时针旋转

如果只想让小的红色的矩形进行旋转,而蓝色的大矩形不旋转,需要了解画布中的层

3.2 save和restore方法

简单修改代码,加入save和restore两个方法

private void init() { rectP1 = new Paint(Paint.ANTI_ALIAS_FLAG); rectP1.setColor(Color.BLUE); rectP2 = new Paint(Paint.ANTI_ALIAS_FLAG); rectP2.setColor(Color.parseColor("#FF4081")); rectF1 = new RectF(100,100,400,400); rectF2 = new RectF(200,200,300,300); } /** * 旋转画布 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawRect(rectF1,rectP1); canvas.save(); //旋转30° canvas.rotate(30); canvas.drawRect(rectF2,rectP2); canvas.restore(); }


旋转小矩形

save()就是保存当前图层
restore() 就是把图层恢复到最近一次save()方法前的状态

关于保存图层,还有一个更加强大的saveLayer(),这个方法就等用到时,再进行学习

3.3 translate 平移画布

这个方法使用很简单

@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //平移 canvas.translate(800,200); //绘制矩形 canvas.drawRect(rectF1,rectP1); canvas.drawRect(rectF2,rectP2); //在(100,100)处绘制一个小圆,用来辅助观察坐标系的改变 canvas.drawCircle(100,100,30,rectP2); }


平移

这个方法需要注意的是,Canvas的坐标系就进行了改变,观察小圆的位置

3.4 scale 缩放方法

缩放的使用也非常简单

protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.scale(0.5F, 1.0F); canvas.drawBitmap(bitmap,0,0,null); }


缩放

缩放有效值为0~1f,1表示不进行缩放,原始大小

缩放方法有个重载方法scale(float sx, float sy, float px, float py)

简单修改代码

canvas.scale(0.5F, 1.0F,540,0);


指定缩放中心

px,py确定缩放中心,canvas.scale(0.5F, 1.0F)默认为(0,0)为缩放中心,指定(540,0)为缩放中心时,屏幕宽度为1080,Canvas就在水平居中缩放

3.5 skew 错切

简单使用

protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.skew(0.5f,0); canvas.drawBitmap(bitmap,0,0,null); }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Android开发之50个常见实用技巧——添加悦目的动画效果

    Android开发之50个常见实用技巧——添加悦目的动画效果

    2017-01-15 08:02

  • 用Shader实现特殊效果

    用Shader实现特殊效果

    2017-01-14 17:00

  • 8.1.2 setAlpha方法:设置透明度

    8.1.2 setAlpha方法:设置透明度

    2017-01-11 12:03

  • Android使用ImageView制作透明圆弧实例代码

    Android使用ImageView制作透明圆弧实例代码

    2017-01-10 09:00

网友点评
p