Android 高级绘图

网友投稿 695 2022-05-29

刷子

可以画什么?

从Paint中完成工作

使用透明度

// 使用红色,并让它50%透明

int opacity = 127;

int intColor = Color.argb(opacity, 255, 0, 0);

int parsedColor = Color.parseColor("#7FFF0000");

或者,也可以使用setAlpha方法来设置已存在的Paint对象的透明度:

// 让颜色50%透明

int opacity = 127;

myPaint.setAlpha(opacity);

Shader介绍

Paint shaderPaint = new Paint();

shaderPaint.setShader(myLinearGradient);

定义渐变Shader

int colorFrom = Color.BLACK;

int colorTo = Color.WHITE; LinearGradient linearGradientShader = new LinearGradient(x1, y1, x2, y2, colorFrom, colorTo, TileMode.CLAMP)

int[] gradientColors = new int[3];

gradientColors[0] = Color.GREEN;

gradientColors[1] = Color.YELLOW;

gradientColors[2] = Color.RED;

float[] gradientPositions = new float[3];

gradientPositions[0] = 0.0f;

gradientPositions[1] = 0.5f;

gradientPositions[2] = 1.0f;

RadialGradient radialGradientShader=new RadialGradient(centerX,centerY, radius, gradientColors, gradientPositions, TileMode.CLAMP);

使用Shader TileModes

CLAMP

使用Shader的边界颜色来填充剩余的空间。

MIRROR

在水平和垂直方向上拉伸Shader图像,这样每一个图像就都能与上一个缝合了。

REPEAT

在水平和垂直方向上重复Shader图像,但不拉伸它。

使用MaskFilter

BlurMaskFilter

指定了一个模糊的样式和半径来处理Paint的边缘。

EmbossMaskFilter

指定了光源的方向和环境光强度来添加浮雕效果。

// 设置光源的方向

float[] direction = new float[]{ 1, 1, 1 };

//设置环境光亮度

float light = 0.4f;

// 选择要应用的反射等级

float specular = 6;

// 向mask应用一定级别的模糊

float blur = 3.5f;

EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);

// 应用mask myPaint.setMaskFilter(emboss);

使用ColorFilter

ColorMatrixColorFilter

可以指定一个4×5的ColorMatrix并将其应用到一个Paint中。ColorMatrixes通常在程序中用于对图像进行处理,而且由于它们支持使用矩阵相乘的方法来执行链接转换,所以它们很有用。

LightingColorFilter

乘以第一个颜色的RGB通道,然后加上第二个颜色。每一次转换的结果都限制在0到255之间。

PorterDuffColorFilter

可以使用数字图像合成的16条Porter-Duff 规则中的任意一条来向Paint应用一个指定的颜色。

使用PathEffect

CornerPathEffect

可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。

DashPathEffect

可以使用DashPathEffect来创建一个虚线的轮廓(短横线/小圆点),而不是使用实线。你还可以指定任意的虚/实线段的重复模式。

DiscretePathEffect

与DashPathEffect相似,但是添加了随机性。当绘制它的时候,需要指定每一段的长度和与原始路径的偏离度。

PathDashPathEffect

这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。

SumPathEffect

顺序地在一条路径中添加两种效果,这样每一种效果都可以应用到原始路径中,而且两种结果可以结合起来。

ComposePathEffect

将两种效果组合起来应用,先使用第一种效果,然后在这种效果的基础上应用第二种效果。

borderPaint.setPathEffect(new CornerPathEffect(5));

修改Xfermode

AvoidXfermode

指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。

PixelXorXfermode

当覆盖已有的颜色时,应用一个简单的像素XOR操作。

PorterDuffXfermode

Android 高级绘图

这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。

AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID); borderPen.setXfermode(avoid);

使用抗锯齿效果提高Paint质量

myPaint.setSubpixelText(true);

myPaint.setAntiAlias(true);

2D图形的硬件加速

myActivity.requestWindowFeature(Window.FEATURE_OPENGL)

Canvas绘图最佳实践经验

考虑硬件加速

OpenGL硬件加速对2D图形的支持是非常好的,所以你总是应该考虑它是否适合你的活动。另一种比较优秀的方法是只用一个单独的View和迅速的、耗时的更新来组成活动。一定要保证你使用的基本图形能够被硬件支持。

考虑大小和方向

当在设计View和布局的时候,一定要保证考虑(和测试)它们在不同的分辨率和大小下的外观。

只创建一次静态对象

在Android中对象的创建是相当昂贵的。因此,在可能的地方,应用只创建一次像Paint对象、Path和Shader这样的绘图对象,而不是在View每次无效的时候都重新创建它们。

记住onDraw是很消耗资源的

执行onDraw方法是很消耗资源的处理,它会强制Android执行多个图片组合和位图构建操作。下面有几点建议可以让你修改Canvas的外观,而不用重新绘制它:

使用Canvas转换

可以使用像rotate和translate这样的转换,来简化Canvas中元素复杂的相关位置。例如,相比放置和旋转一个表盘周围的每一个文本元素,你可以简单地将canvas旋转22.5?,然后在相同的位置绘制文本。

使用动画

可以考虑使用动画来执行View的预设置的转换,而不是手动地重新绘制它。在活动的View中可以执行缩放、旋转和转换动画,并可以提供一种能够有效利用资源的方式来提供缩放、旋转或者抖动效果。

考虑使用位图和9 Patch

如果View使用了静态背景,那么你应该考虑使用一个图片,如位图或者9 patch,而不是手动地重新绘制。

Android Canvas

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Netty基础必备知识,ByteBuffer和ByteBuf底层原理
下一篇:ROS 2 Foxy Fitzroy:为生产和开发机器人设定新标准
相关文章