2012-06-08 21 views
9

我試着用這個爲什麼canvas在onDraw中與視圖大小不一樣? (安卓)

@Override 
protected void onDraw(Canvas canvas) 
{ 
    Log.e("TEST", "canvas width: " + canvas.getWidth() + ""); 
    Log.e("TEST", "view width: " + this.getWidth() + ""); 

    Log.e("TEST", "canvas height: " + canvas.getHeight() + ""); 
    Log.e("TEST", "view height: " + this.getHeight() + ""); 
    super.onDraw(canvas); 
    Log.e("TEST", "canvas width: " + canvas.getWidth() + ""); 
    Log.e("TEST", "view width: " + this.getWidth() + ""); 

    Log.e("TEST", "canvas height: " + canvas.getHeight() + ""); 
    Log.e("TEST", "view height: " + this.getHeight() + ""); 
} 

這是結果:

canvas width: 320 
view width: 480 
canvas height: 533 
view height: 300 
canvas width: 320 
view width: 480 
canvas height: 533 
view height: 300 

從我的main.xml

android:layout_width="480px" 
    android:layout_height="300px" 

一部分。根據我的記錄和打印的一部分我的XML,視圖的大小是正確的。 我的設備是480×800和兩個寬度和高度由登錄結果除以得到1.5(533分之800= 1.5和三百二十分之四百八十零= 1.5),因此它似乎我得到畫布從整個屏幕上繪製。爲什麼會這樣,爲什麼這麼小,我該如何正常畫畫?

回答

14

SuitUp,

視圖管理畫布對象將可能永遠是從你的屏幕大小不同。很大程度上取決於您使用上述邏輯的哪個對象。這是因爲Android會創建一個新的畫布或重新使用舊的畫布,具體取決於您父母和孩子的渲染方式以及處理循環中的位置。當你重寫的行爲和動態改變的意見(特別是如果你這樣做的佈局/措施/抽獎週期事情變得陌生了。

這是爲什麼,爲什麼會這樣小...

畫布的大小取決於其所在對象的佈局參數。如果您重寫onMeasure或onLayout,畫布將只重新調整重新調整所需的參數。如果畫布大小有問題,真的想看看你正在繪製的視圖的佈局參數。有時它會更大,有時會更小。它只會與頂級視圖中的屏幕大小相同/ ViewGroup中具有match_parent(或fill_parent),用於在作爲全屏一個活動的layout_width既和layout_height(沒有通知欄),而不是使用Theme.Dialog樣式。

...我應該怎麼做正常的方式吸引?

這取決於你的意思是正常的,你的需求是什麼。如果您嘗試手動管理整個用戶界面,則必須控制頂級對象。這通常通過擴展頂層視圖來完成,以便您可以覆蓋該行爲。啓動程序通過覆蓋頂級FrameLayout,然後覆蓋其子視圖來完成此操作。請注意,如果您有足夠大的畫布,您可以從屏幕上劃出東西,這可能代價很高。

大多數程序利用孩子的意見和簡單地覆蓋自己畫的方式,瞭解一個孩子查看不該管的方式,父視圖繪製。在這種情況下,畫布很小且有限,但它優化了邏輯並允許對象相應地移動,同時保持渲染穩定。

遊戲製作爲了完成自己的需求使用全屏SurfaceView。這提供了一個非常靈活的畫布,在手動和不斷變化的演示文稿上確定了優先順序。有許多示例和教程顯示如何執行此操作。只需在Google中搜索SurfaceView即可。

一般來說,對於大多數視圖,默認的渲染和繪圖方法可用於其面向對象的性質。正確使用onMeasure和onLayout等功能通常可以達到理想的效果。不知道更多關於您的特殊需求,這是可以給出的最佳建議。

更多信息(不確定關聯)

瞭解的Android如何呈現視圖可以實現理想的結果至關重要。如此多的進入引擎,它必須考慮多個屏幕,以及不同的方式來呈現給定許多不同參數的相同視圖。我會研究如何利用佈局參數來減少你必須做的工作量。此外,關於onMeasure,onLayout和onDraw之間的關係還有很多信息。在很多情況下,只要將正確的參數應用到正確的視圖中,就會在控制量上產生巨大的差異,爲了正確呈現對象,您必須採取相應的控制措施。

希望這有助於

FuzzicalLogic