簡體   English   中英

在 android 中查看 onDraw(Canvas c) 與 draw(Canvas c)?

[英]View onDraw(Canvas c) versus draw(Canvas c) in android?

我是 android 開發的新手,我正在探索View 我遇到了已知的兩種方法onDraw(Canvas c)draw(Canvas c)

請解釋一下這兩種方法的區別和用法? 使用圖像更新畫布時,哪種方法會提供更好的性能(FPS)?

他們之間是有區別的

  1. onDraw(Canvas c)是一種重寫方法,會在渲染視圖時自動調用。 在這里你可以做額外的繪圖,比如畫圓圈、線條或任何你想要的東西。

  2. draw(Canvas c)用於手動將此視圖(及其所有子視圖)渲染到給定的畫布。 在調用此函數之前,視圖必須已經完成了完整的布局。 實現視圖時,實現onDraw(android.graphics.Canvas)而不是覆蓋此方法。 如果確實需要覆蓋此方法,請調用超類版本。

或者簡單來說, draw(Canvas c)只是一個視圖函數,您可以在視圖首次呈現后調用它。 此功能可用於在任何視圖上自定義繪圖。 您需要提供此視圖將在其上呈現的畫布,並且您還必須在調用此函數之前在畫布上完成所有繪圖。

就好像有人像我一樣還在尋找答案但沒有找到。

當需要重新繪制視圖時,框架會調用 draw() 方法,然后 draw() 方法會調用 onDraw() 來繪制視圖的內容。

void draw(Canvas canvas)
{
     ..... do default stuff (background, layers)
     onDraw(canvas)
     ..... do other stuff ( scroll bars, fading edges, children)

}

由於笨拙的 API 文檔,人們對此存在誤解。
簡短的回答是draw(Canvas)是對 View 的入站調用以執行一些重要的事情,並且在draw(Canvas)實現中間的某個地方它還會觸發onDraw(Canvas)回調。

  • 在實現打算在布局內使用的自定義View時,不要覆蓋draw(Canvas)
  • 如果您的自定義視圖打算用作全屏游戲,那么重寫draw()將為您節省每個周期中一些不需要的調用。

更長的答案

  • 該框架在其繪制周期中使用draw(Canvas) 這是我在 View 代碼中可以找到的內容:
    • 第 1 步:根據需要繪制背景
    • 第 2 步:保存畫布的圖層
    • 第 3 步:繪制內容 --- onDraw()來了
    • 第四步:畫孩子們
    • 第五步:繪制淡入淡出效果和還原圖層
    • 第六步:繪制滾動條

有用的提示

  • 您可以將任何視圖渲染到您創建的離屏位圖中,然后在任何地方使用此位圖:

     Canvas c = new Canvas(); c.setBitmap(myOffscreenBitmap); myView.draw(c);
    • 對於簡單的情況(當它不是 ViewGroup 並且不需要滾動條時),簡單的onDraw(Canvas)也可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM