【问题标题】:Android: RoundRectShape: Modify corner radiiAndroid:RoundRectShape:修改角半径
【发布时间】:2012-07-17 11:50:05
【问题描述】:

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

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

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

这个问题解释如下:

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

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

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

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

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

谢谢,

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

【问题讨论】:

    标签: android ondraw shapedrawable


    【解决方案1】:

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

    编辑: 关于 RoundRectShape 不是正确的方法并查看实现的 cmets 是正确的。执行后发现调用:

    mPath.addRoundedRect() 
    

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

    在回答问题时:

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

    【讨论】:

    • 我看过那个绘图命令。我遇到的问题是,并非我的形状的所有角都具有相同的半径。而且我只能找到将它们设置为相同的调用。该实现链接是一个很好的建议,但是,谢谢。我没想到会真正做到这一点,但我喜欢这个主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2014-06-12
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多