2014-06-11 21 views
1

我最近更新了我的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開始)。Canvas.drawRect()在更新到Android Studio後停止繪圖0.6.0

上述變化(在this commit),該應用程序被成功地描繪在畫布上方格顯示GLONASS衛星的信號強度(見編號87和88)之前:

enter image description here

更新我的Android後通過Android Studio中或gradlew installDebug工具和發射,正方形突然消失(見編號77,87,88):

enter image description here

Ť他的代碼,吸引了廣場上,用(x,y)中心,是:

canvas.drawRect(x - SAT_OFFSET, y + SAT_OFFSET, x + SAT_OFFSET, y - SAT_OFFSET, mSatelliteStrokePaint); 

(見Github爲滿級),與所有的變化更新到Android工作室0.6.0可以看出here

的承諾。

爲什麼canvas.drawRect()在更新Android工具後突然停止工作?

回答

4

顯然這與Android處理無效輸入值drawRect()有關,由Android Gradle Plugin 0.11 enabling the new manifest merging tool by default觸發。

如果我添加useOldManifestMerger truebuild.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 truebuild.gradle) 。

因此,解決此問題的正確方法是將正方形的頂部/底部座標反轉爲有效輸入,並仍使用新的清單合併器。

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); 
}