29

私は昨日、Androidのレイアウト(...またはより良いカスタムレイアウト)に苦労して過ごしました。一般的な目的では、Androidが提供するすぐに使えるレイアウトで十分です。しかし、より複雑なユースケース(楕円軌道上に配置された画像が重なっているカルーセルの例を見てみましょう)に関しては、AndroidAPIの制限と複雑さにすぐに気付きました。これが私のアプローチでした:

  1. すぐに使用できるレイアウトを使用することはできません(処理する多くの管理できない問題に対して)が、変換、回転、など...組み込みのアニメーションを介して。

  2. AbsoluteLayoutは、この目的に使用できる最も妥当なレイアウトのようです。派生ビューオブジェクトを追加し、それらを配置するための独自のアルゴリズムを作成できます。しかし...それは非推奨です。残念です!非推奨のAPIを使用したいのは誰ですか?

  3. 次に行うべき最も合理的なことは、神秘的なViewGroupをサブクラス化する独自のレイアウトを作成することです。ここで、すべてがバラバラになります(少なくとも私にとってはそうです)。スイング用に独自のカスタムレイアウトを作成するのと同じくらい、複雑で誤解を招きやすく、注意が必要です(実際には何年も前に作成しましたが、もっと簡単なことを覚えています)。

  4. 次に、(必死になって)ビューをサブクラス化し、onDrawメソッドをオーバーライドして、Canvasに直接描画することが、唯一の簡単な解決策のようです(ただし、これはjava2Dの時代を思い出させます...プロジェクト)、しかし、あなたはキャンバスに描かれたグラフィックスに適用したい便利な組み込みのアニメーションAPIをあきらめています。

結論として、私が何かを見逃していない限り、現在のandroidアーキテクチャは、flashやjavafxなどの他のUIテクノロジーによって提供されるプログラミングパラダイムから少し離れています(上記のカルーセルはjavafxとflashで簡単に実装できます)。その理由は、たとえばjavafxでは、Sceneオブジェクト(androidのViewの概念に匹敵する)がデフォルトで絶対レイアウトを提供するためです。その後、必要に応じて、他のすぐに使用できるレイアウトを適用できます。ただし、カスタムレイアウトが必要なシナリオでは、何もする必要はありません。

このオプションがAndroidで利用できないことに少し驚いています。結局のところ、他のUIテクノロジーによって対処される非常に一般的なニーズです。私はまだ私が見つけていないアンドロイドの5番目のオプションがあると思うのが好きです。トピックに関する情報を提供できる専門家はいますか?

ありがとう。

4

4 に答える 4

4

Android レイアウトは、ユーザーと対話するためのほとんどのユースケースに最適だと思いますが、(大きな問題ですが) レイアウト メカニズムは非常にデリケートで、正しく拡張するのが難しいです。わずかな 1 週間の場合は問題ありませんが、通常とは異なる何か (アニメーション化されたカルーセルなど) を実行したい場合は、いずれにせよ無料のグラフィックスを使用する可能性が高いため、レイアウトを拡張するための余分な複雑さは必要ありません。それは、正当な付加価値がなく、生活するための制約が増えるだけです。

ほとんどのアプリには、いくつかの標準的なもの (ActionBar、ボタン、設定、ダイアログなど) と、1 つ以上の「固有の」要素があります。したがって、標準的なものには標準レイアウトを使用することをお勧めしますが、独自の要素には次のいずれかを使用します。

1) SurfaceView - 非常に使いやすい。公式のLunar Lander コード例を参照してください。SurfaceView の動作を確認するには、アニメーション化された要素に SurfaceView を使用し、すべてが RelativeLayout でレイアウトされている私のアプリビデオもご覧ください。

2) opengl - Android でグラフィックスを行う最も強力な方法です。GPU で実行されるため、CPU は自由に他のことを行うことができます。そして、それは 3D (または 1 つの平面のみを使用する場合は 2D) です。私はlibgdxを使用しています。これは素晴らしく、短い学習の後では難しくありません。

SurfaceView と opengl (GLSurfaceView) はどちらもビューであるため、他のビューと同様にレイアウトに追加できます。

于 2012-05-22T20:50:44.753 に答える
2

これは素晴らしい質問です。私は現在 3.0 以降用にプログラミングしており、多くの場合、ほとんどの場合 AbsoluteLayouts を使用することに決めました。非推奨に設定されていますが、3.0ish 以下用にコンパイルすると、4 以降のシステムでもしばらくは実行できる可能性があります。私はこの答えを自分で探しています(それを切り取るOSの将来のバージョンのために)。彼らがそれを切り捨てている理由は、Android の画面解像度が標準化されていないためです。

私の提案は、可能な限り AbsoluteLayouts を使用することです。また、Google のプラットフォームにとって依然として非常に必要な API であることを Google に知らせるためのプッシュを開始する必要があると思います。

素晴らしい質問:-)

于 2012-05-22T16:29:31.817 に答える
1

http://www.google.com/events/io/2009/sessions/TurboChargeUiAndroidFast.htmlに良い例があります。

44分

http://www.google.com/events/io/2009/sessions/SupportingMultipleDevicesBinary.htmlをご覧ください。

于 2011-02-01T01:14:25.800 に答える
1

カスタム レイアウトに関する利用可能なドキュメントは、私にはかなり漠然としているように思えますが、最終的に役立つものを見つけました: これは、XML と Java コードを接続する方法を示す素敵でシンプルなサンプル レイアウトです: 画像の「グリッド」を中央に配置する方法screen そして、私が見逃していた 1 つの重要な問題を説明する投稿があります: http://www.arpitonline.com/blog/2012/07/01/creating-custom-layouts-for-android/。どうやら onMeasure をオーバーライドし、子ごとに measure() を呼び出す必要があります。

于 2012-12-20T22:08:39.343 に答える