我最近更新了我的Android应用(请参阅source on Github)以使用Android Studio 0.6.0,这需要将构建工具提升到v19.1.0(从v19.0.1开始),将Android Gradle插件提升到v0。 11(从0.9开始),Gradle包装器到1.12(从1.11开始)。
在上述更改之前(this commit),应用程序成功地在画布上绘制方块以显示GLONASS卫星的信号强度(参见ID 87和88):
更新我的Android工具并通过Android Studio或gradlew installDebug
启动后,方块突然消失(参见ID 77,87,88):
绘制正方形的代码,其中心为(x,y)
,为:
canvas.drawRect(x - SAT_OFFSET, y + SAT_OFFSET, x + SAT_OFFSET, y - SAT_OFFSET, mSatelliteStrokePaint);
(完整课程见Github)
可以看到更新到Android Studio 0.6.0的所有更改的提交here。
更新Android工具后,为什么canvas.drawRect()
突然停止工作?
答案 0 :(得分:4)
显然这与Android处理{Grage Plugin 0.11 enabling the new manifest merging tool by default触发的drawRect()
无效输入值有关。
如果我将useOldManifestMerger true
添加到build.gradle
,则广场会返回:
android {
compileSdkVersion 19
buildToolsVersion "19.1.0"
useOldManifestMerger true
...
}
根本问题是Canvas.drawRect()
接受参数(float left, float top, float right, float bottom, Paint paint)
我将矩形的顶部和底部坐标反转,因此顶部值(应该是最小的y值)是较大的y值,而底部值(应该是最大的y值)是最小的y值(原点(0,0)
位于左上角)。
在Android Studio 0.6.0工具更新之前,Android正在纠正无效输入并仍在绘制正方形。在使用新的清单合并工具启动Android Studio 0.6.0工具更新后,Android不再更正无效输入,而是不会绘制任何内容。
更改我的代码后,反转广场的顶部/底部y值:
c.drawRect(x - SAT_OFFSET, y - SAT_OFFSET, x + SAT_OFFSET, y + SAT_OFFSET, mSatelliteStrokePaint);
...广场重新出现(即使使用新的清单合并 - 即没有将useOldManifestMerger true
添加到build.gradle
)。
因此,解决此问题的正确方法是将方块的顶部/底部坐标反转为有效输入,并仍然使用新的清单合并。
答案 1 :(得分:0)
这太荒谬了 - 我们一直在向后绘制矩形'超过30年。有时候有一些有效的程序化理由可以倒退。
如果您需要此功能,请使用以下内容。
public static void drawRectOriented(Canvas g, float x1,float y1,float x2,float y2,Paint p) {
if (x1 > x2) {
float t = x2;
x2 = x1;
x1 = t;
}
if (y1 > y2) {
float t = y2;
y2 = y1;
y1 = t;
}
g.drawRect(x1,y1,x2,y2, p);
}