2010-07-16 135 views
29

我昨天花了一些時間與Android佈局掙扎(...或更好的自定義佈局)。對於一般用途來說,android提供的開箱即用的佈局綽綽有餘。但是當涉及到更復雜的用例時(讓我們以旋轉木馬的例子重疊放置在橢圓路徑上的圖像),我很快意識到了android API的侷限性和複雜性。這是我的方法:Android自定義佈局

  1. 使用開箱佈局是不是一種選擇(許多難以處理的問題處理),可以添加到一個容器圖形對象但需要(比如說例如ImageView的)是必要的,以便通過內置動畫輕鬆執行翻譯,旋轉等。

  2. AbsoluteLayout似乎是最合理的佈局可用於此目的。它允許添加派生視圖對象並編寫自己的算法來定位它們。但是......它被棄用了。真遺憾!誰想要使用已棄用的API?

  3. 下一個最合理的做法是編寫自己的佈局子類Mystic ViewGroup ..這裏是所有東西都分崩離析(至少它對我來說)。這很複雜,誤導和棘手,儘可能爲自己編寫自定義佈局的擺動(我實際上是在幾年前做過的,而且我記得更簡單)。

  4. 然後(由絕望驅動)對View進行子分類,覆蓋onDraw方法並直接在Canvas上繪圖似乎是唯一直接的解決方案(儘管這讓我想起了java2D的日子......花了很長時間來實現高1%的項目),但是你放棄了你想要應用到畫布上繪製的圖形的動畫API中構建的方便。

的結論是,除非我錯過了一些東西,目前的Android架構是有點遠從其他一些UI技術如閃存或JavaFX的提供的編程範式(我可以很容易地實現上述的旋轉木馬在javafx和flash中)。 原因在於,在javafx中,Scene對象(與Android的View概念相當)默認提供絕對佈局。如果您願意,您可以應用其他開箱即用的佈局。但對於需要自定義佈局的場景,您無需執行任何操作。

我有點驚訝,這個選項在android中不可用,畢竟是其他ui技術解決的常見需求。我仍然想認爲在Android中有第五個選項,我沒有找到。 那裏有哪些專家可以提供有關該主題的一些信息?

謝謝。

+2

好問題!繼承人我幾乎相同的問題:http://stackoverflow.com/questions/4953351/android-how-to-draw-a-letter-at-a-specific-point ...爲什麼有所有這些意見和動畫,如果你不能利用它們? – Mark 2011-02-10 05:07:15

回答

2

這是一個奇妙的問題。目前我正在爲3.0或更高版本編程,並且在很多情況下決定大部分都堅持使用AbsoluteLayouts。儘管它被設置爲不推薦使用,但編譯爲3.0ish和更低版本仍然可以在4系統和更高版本系統上運行一段時間。我自己尋找這個答案(爲未來版本的操作系統,將其切出)。他們之所以切斷它的原因是因爲Android上的屏幕分辨率沒有標準化。

我的建議是將AbsoluteLayouts用於我們儘可能長的時間。我也認爲我們應該開始推動,讓Google知道它們對於他們的平臺仍然是非常必要的API。

大問題:-)

+0

[Android開發小組的每Dianne Hackborn](http://androiddiscuss.com/1-android-discuss/38183.html),「我會再說一遍:我們不打算從未來版本中移除AbsoluteLayout,但我們強烈不鼓勵人們使用它。「所以如果它真的是最能滿足你的需求的,那就用它吧。 – jk7 2017-06-21 21:33:23

4

我認爲Android的佈局用例是偉大的與用戶進行交互,但(大但)的佈局機制是非常微妙和棘手的是要正確擴展。對於小型的tweeks來說很好,但如果你想做一些不尋常的事情(比如動畫輪播),那麼你可能會使用免費的圖形,所以你不需要額外的擴展Layout。這只是更多的限制,沒有正當的附加價值。

大多數應用程序都有一些標準的東西(ActionBar,按鈕,首選項,對話框等)以及一個或多個「獨特」元素。所以我的建議是使用標準佈局的標準東西,但爲您的獨特元素使用其中之一:

1)SurfaceView - 非常容易使用。請參閱官方Lunar Lander代碼示例。 要觀看SurfaceView的動作,您還可以看看my app視頻,該視頻使用SurfaceView作爲動畫元素,並且所有內容都使用RelativeLayout進行佈置。

2)opengl - 這是Android上最強大的圖形處理方式。它運行在GPU上,因此CPU可以自由地做其他事情。它是3D(或2D,如果你只是使用一架飛機)。 我使用的是libgdx,這很棒,並且在短暫的學習之後並不困難。

兩個SurfaceView和OpenGL(GLSurfaceView)的意見,這樣他們就可以將其添加到佈局的任何其他視圖

1

上自定義佈局可用的文件似乎相當含糊的給我,但我終於找到一些有用的東西: 下面是一個很好的簡單示例佈局,展示瞭如何連接XML和Java代碼: How to layout a 'grid' of images in the center of the screen 這裏是一篇文章,解釋我缺少的一個關鍵問題: http://www.arpitonline.com/blog/2012/07/01/creating-custom-layouts-for-android/。 顯然必須重寫onMeasure併爲每個孩子調用measure()。