0

我有一个在 a的函数RoundRectShape中绘制的。ViewonDraw()

这个形状的角会被这个视图上的任何拖动操作通过一个重写的onTouchEvent函数(调用invalidate()来强制调用onDraw())修改。

在 中初始化变量时onDraw,Eclipse 会显示一条警告,指出在绘制/布局操作期间避免对象分配(改为预分配和重用)

这个问题解释如下:

您应该避免在绘图或布局操作期间分配对象。这些被频繁调用,因此流畅的 UI 可能会因对象分配导致的垃圾收集暂停而中断。

通常处理的方式是预先分配对象并为每个绘图操作重用它们

为此,我显然必须能够修改构造函数中设置的角半径。RoundedRectShape没有提供设置器(我很确定相关的成员变量是不可访问的)。

我知道这是一个小对象和一个小问题,但是当类提供的用于设置圆角半径的唯一方法是通过构造函数时,如何在不重新初始化对象的情况下更改这些角?

或者这只是一个例子,做最好的事情必须用做可能的事情来代替?

谢谢,

PS 在方法中调用构造函数将删除警告,但由于每次都调用onTouchEvent()的事实,无论如何都不会完成任何事情onDraw()invalidate()

4

1 回答 1

1

我认为你根本不需要使用RoundRectShapeRoundRectShape是不可变的,因此更改其值的唯一方法是使用反射。您可以通过直接调用方法轻松完成相同的绘图,Canvas.drawRoundRect(RectF rect, float rx, float ry, Paint paint)而无需使用RoundRectShape. 或者您可以查看RoundRectShape 实现并在您的onDraw()方法中使用它的代码。

编辑: 关于RoundRectShape不是正确的方法和查看实施的评论是正确的。在实现之后发现调用:

mPath.addRoundedRect() 

它有一个变体,允许将角半径的浮点数作为输入(Path.addRoundRect

在回答问题时:

使用路径而不是形状作为变量,并在必要时将新的圆角矩形绘制到路径

于 2012-07-15T11:57:23.347 回答