微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 画布操作与元素操作

我正在开发一个小型库作为某些应用程序的基础.当我即将创建一个场景图(2D)时,我想知道在性能,可维护性,易用性等观点下,以下哪种方法看起来更有前途.

>我可以给每个可绘制元素一个矩阵,在那里我执行平移,旋转等等.
>我可以在画布上做所有事情而不是元素.

一个解决方案有一个缺点:对于像圆形这样的原始元素,我无法在绘制调用中传递矩阵,我必须从矩阵中访问转换后的值,如下所示:

private float get(int index) {
    final float[] values = new float[9];
    getValues(values);
    return values[index];
}

public float getX() {
    return get(Matrix.MTRANS_X);
}

public float getY() {
    return get(Matrix.MTRANS_Y);
}

因此,在每次绘制调用时,我为每个getter调用创建一个float数组(一个用于getX(),一个用于getY()).假设屏幕上有足够的元素,这可能会导致内存和性能影响.

第二种方法具有“消极”思维的缺点.如果我想在100/100点绘制一个元素,我必须将画布转换为-100 / -100,因为我会在0/0上绘制.如果我在那之后恢复画布,结果将是在想要的100/100上绘制的元素.我不确定这种消极的想法是否会对代码可维护性和理解能力产生重大影响(甚至从未考虑通过简单地忘记否定某些内容来引入错误……).

有人有提示哪种方式应该首选吗?

解决方法

看来确实必须将两种解决方案结合起来.

我对第二种方法的假设是完全错误的.如果我将元素转换为100/100,则原点将更改为100/100.当然,这同样适用于画布.消极的想法完全是胡说八道.

合并结果如下:

>将绘制的每个元素都有自己的Matrix,其中包含旋转,平移和缩放.
>画布将通过save()保存,使用提供的方法concat(Matrix矩阵)可以应用元素的矩阵.绘图将完成,画布将使用restore()恢复.
>每个可绘制元素是其他drawable的父级,它将循环遍历子节点并以相同的方式保存,连接和恢复.

这使得能够实现2D场景图而无需任何大的实现工作.

原文地址:https://www.jb51.cc/android/443418.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐