我在RoundRectShape
的{{1}}函数中绘制了View
。
此形状的角可通过覆盖的onDraw()
函数(调用onTouchEvent
强制调用invalidate()
)来修改此视图上的任何拖动操作。
在onDraw()
初始化变量时,Eclipse会显示一条警告,说明在绘制/布局操作期间避免对象分配(预分配和重用)。
此问题解释如下:
您应避免在绘图或布局操作期间分配对象。这些是经常调用的,因此可以通过对象分配导致的垃圾收集暂停来中断平滑的UI。
通常处理此方法的方法是预先分配对象并为每次绘图操作重复使用
要做到这一点,我显然必须能够修改构造函数中设置的角半径。 RoundedRectShape class没有提供setter(我很确定相关的成员变量不可访问)。
我知道它是一个小对象和一个小问题,但是当类提供设置圆角半径的唯一方法是通过构造函数时,如何在不重新初始化Object的情况下更改这些角?
或者这只是一个必须用尽可能做的事情来取代做最好事情的情况?
谢谢,
P.S。在onDraw
方法中调用构造函数将删除警告,但由于每次通过onTouchEvent()
调用onDraw()
答案 0 :(得分:1)
我认为您根本不需要使用RoundRectShape
。 RoundRectShape
是不可变的,因此更改其值的唯一方法是使用反射。
您可以直接调用Canvas.drawRoundRect(RectF rect, float rx, float ry, Paint paint)
方法轻松完成相同的抽奖,而无需使用RoundRectShape
。或者,您可以查看RoundRectShape
implementation,并在onDraw()
方法中使用其代码。
修改强>
关于RoundRectShape
不是正确的方式来看待实施的评论是正确的。执行后发现了一个调用:
mPath.addRoundedRect()
有一个允许角半径浮动作为输入(Path.addRoundRect)
的变体在回答问题时:
使用路径而不是形状作为变量,并在必要时将新的圆角矩形绘制到路径