这绝对让我疯狂。
我有一个Thing类有这种设置:
public class Thing {
// ...
private Rect box;
public Rect box(){ return this.box; }
public void render(Canvas canvas, boolean selected){
_p.setPathEffect(null);
_p.setColor(0x00000000);
_p.setStyle(Paint.Style.FILL);
if(this.invisible) {
_p.setColor(Color.WHITE);
_p.setStyle(Paint.Style.STROKE);
_p.setStrokeWidth(3);
_p.setPathEffect(new DashPathEffect(new float[] {10,20}, 0));
canvas.drawRect(this.box, _p);
return;
}
if(!ResourceManager.isResource(background)){
_p.setColor(Color.parseColor(border_color));
Log.d("Before", this.box.toString());
canvas.drawRect(Utils.getBorder(this.box(), border_size, border_dx, border_dy), _p);
Log.d("After", this.box.toString());
// ...
}
}
请注意,box
具有私人访问权限和公共getter函数box()
。
这是Utils类:
public final class Utils {
public static Rect getBorder(Rect rect, int size, int dx, int dy){
rect = inflatedRect(rect, size);
rect.offset(dx, dy);
return rect;
}
public static Rect inflatedRect(Rect r, int d){
r.set(r.left - d, r.top - d, r.right + d, r.bottom + d);
return r;
}
}
您可能已经注意到我正在使用Android的Canvas,因此渲染函数必须有最少的分配。
是的,私有box
正在改变,即使它是从getter传递的。这导致元素的Rect在每次render()调用时迅速增加其大小。
什么是适当的解决方案?
编辑1:此问题完全来自我的Utils.getBorder
功能。如果border_size
为0或者具有此功能的行已被注释掉,则矩形不会出现异常。 canvas.drawRect(Utils.getBorder(this.box(), border_size, border_dx, border_dy), _p);
是代码中唯一出现的问题,并且在项目的其他任何地方都没有使用。
答案 0 :(得分:0)
一种可能的解决方案如下......
public final class Utils {
public static Rect getBorder(final Rect rect, int size, int dx, int dy){
Rect inflatedRect = inflatedRect(rect, size);
inflatedRect.offset(dx, dy);
return inflatedRect;
}
public static Rect inflatedRect(final Rect r, int d){
return new Rect(r.left - d, r.top - d, r.right + d, r.bottom + d);
}
}