2011-10-31 31 views
1

すべてのデバイスでよく見えるようにレイアウトとコードを一度書きたいと思います。 私はDPを使い、複数のレイアウトファイルを追加するなど、多くの方法を試しましたが、ランダムに新しいデバイスがあるたびに新しい状況に対処しなければならないという問題は本当に解決できません解像度と密度。 DPの使用法は、ディメンションをルーラーのようなすべての画面で同じにするXMLトリックです(たとえば、1cmはすべての画面で1cmのままです)ので、実際は解決策ではありません。アンドロイド画面の断片化を処理する方法は?

また、正しいサイズと位置を設定するためにウェイトとコードトリックを使用しましたが、このような単純な作業にはあまりにも多くの作業が必要です。

私はこの問題の解決策と新しいアイスクリームサンドイッチバージョンのバージョンの断片化に取り組んでいたと聞いたことがありますが、このことについては何も聞いたり聞いたりしませんでした。 ないだけでなく、Androidのニーズをサポートするために、複数の密度のチャート&解像度がますます大きくなっている。 http://developer.android.com/guide/practices/screens_support.html

それは非常に多くの他の技術は、すでにこの問題の解決策を持っていたことは残念だ:リンゴが(それを持っていますiphone 3gからiphone 4へのアプリケーションの自動拡張)、Adobe(Flash)、Microsoft(Silverlight、WPF、WP)のビューボックスを使用しています。テレビでさえこの問題を処理しなければならず、彼らはそれをうまくやっています。

私は魔法を求めているわけではありません。ビューのサイズがW%、スクリーンのH%で、スクリーンのX%、Y%の位置にある場合は、すべての画面でこのようにしておく必要があります。また、重要であればアスペクト比を維持できます私たちのために十分です。 なぜ解像度と密度を気にする必要がありますか?私たちとグラフィックチームの両方が混乱するだけです。

結論として、私は多くの人が私のように思うと思うし、誰かがそれをすべて解決するすばらしいSDKを作ったと思う?


@chubbard:それは物事がちょうど定規として正確にすべての画面で同じに滞在できるようになるので、DPがうまく動作しません。画面の3/4に何かがあった場合、それは別の画面にも表示されません(画面の外にあっても、選択したレイアウトに応じて別の奇妙なことが起こることさえあります)。 DPは固定値であり、密度のみに基づいて各装置の画素に変換されるだけである。したがって、wvga800(hdpi-480x800)とwvga854(hdpi-480x854)の違いは、DPに何も変更されず、54ピクセルが得られます。 wvga854のために何かを配置したい場合は、wvga800のために表示されません。さらに悪いことに、アンドロイドのレイアウトについて話すときに、2つの画面の間に違いはありません。彼らはどちらも同じカテゴリのnormal-hdpiの下にあります。

また、DPを使用すると、画像/ボタンは画面に表示されますが、他の画面では画面の他の部分と比べて非常に小さく見えるので、本当に良い解決策にはなりません。 私は、なぜ密度に依存するように設定された複数の描画可能なフォルダを持っているのかわかりません。それはグラフィックスチームのためのより多くの仕事をして、それよりもはるかに大きなサイズにするアプリを作るため、市場はそれを受け入れることができない(大きすぎるため)または悪い - デバイスはアプリケーションをダウンロードすることができます(例えば、銀河Sの古いOSバージョン、&は30MB以上のサイズのアプリケーションをダウンロードできません)。

@adamp:私はabsoluteLayoutについて何も言いませんでした。それは私が残りのレイアウトとして克服したい、正確な悪い振る舞いを持っています。何らかの形でスケーリングが可能な唯一のレイアウトは、(重みを使用して)linearLayoutですが、単純な作業を行うには多くのタグと文章が必要です。 私がしたいことについて、私はすでにそれを書いています。あなたがそれがうまくフラッシュでも動作することを見ることができるインターネット上の例のトンがあります。フルウィンドウのフラッシュ/シルバーライトのコンテンツを開き、ウィンドウのサイズを変更するだけです。プログラマーが正しく設定していれば、その中のすべてが元のサイズに比べて新しいサイズに応じて拡大縮小されます。 btw、gridlayoutのメモをありがとうございます。私はそれを知らなかった。しかし、それはまた、何も拡大縮小できないようです。

@andreasg:今これは興味深いものです。どのように画像を扱ったのですか?あなたは次の「謎」を試してみていただけますか? 画面に合った(そしてアスペクト比を維持する)人の顔(またはアンドロイド:)のイメージがあり、その目の別のイメージが別の色で表示されているとしますあなたが風景モードやポートレートモードになっていても、すべてのデバイスで同じ(スケーリングされた)ように見えるように、もう一方の上に(おそらくframelayoutを使用して)各画面サイズのために右のスケールでカスタムビューを描画する

+3

なぜ私はdpが解決策ではないのかをあなたの推論に結びつけません。 dpを使用しても期待される結果が得られなかった具体的な状況を記述できますか? – chubbsondubs

答えて

0

私の方法は、実際の画面密度を得ることです:

float density = context.getResources().getDisplayMetrics().density; 

例えば16個の密度の独立したピクセル

とカスタムビューのフォントサイズを設定します全体の魔法のthats
paint.setTextSize(density * 16); 

。これがあなたの問題を解決することを願っています。

1

あなただけではない、電話機などの単一のデバイスクラス内の画面サイズでのマイナーな変動のために、あなたのアプリが動作するようにする方法に大きな変化のために完全に異なるレイアウトを使用する必要があります。あなたは、風景モード用に最適化されているあなたのレイアウトの-landバリアントを提供するかもしれない、またはあなたの周り7" 以上のタブレットのためのさまざまな情報アーキテクチャを提示する-sw600dpバリアントを提供するかもしれない。あなたはWVGAのために異なるレイアウトを提供するためにこれを使用しないでくださいQHDの電話ディスプレイと対比すると、あなた自身のために余分な作業がたくさん作成されます。

dpは、さまざまな密度で作業するためのツールです。サイズとアスペクト比の違いには役立ちません。画面サイズとアスペクト比の分散は現在のデバイスに適応するためのフレームワークで提供レイアウトマネージャを使用することであると。あなたは、あなたの状況に来ている場合は、非常に簡単にViewGroupを拡張し、onMeasureonLayoutメソッドをオーバーライドすることで独自のものを書くことができます本当に必要カスタム動作。 API 14にはGridLayoutが追加されています。これらの分散のための設計

は問題に異なるアプローチを必要としません。あなたはあなた自身のために多くの仕事をしたくない限り、絶対的な画面座標で考えて問題に近づくことはできません。レイアウト内のコンポーネントがどのように相互にフィットしているか、また、使用可能な場合に最小構成よりも多くの領域を消費するように拡張するコンポーネントを検討してください。割合の観点で考える

は良いスタートであり、それは正確にあなたがLinearLayoutの重み機能を使用して取得します結果のようなものです。しかし、特定のビューが特定のアスペクト比を維持するように指定したい場合は、その境界をどのようにするべきか、余分なスペースを埋めるべきか、それらの決定があなたのアプリにとって優れたユーザーエクスペリエンスを生み出すかどうかを考える必要があります。 (例えば、ユーザーは自分自身のレターボックスのアプリケーションを使用したいのではなく、真ん中の固定されたアスペクト比のボックスにしか実際のコンテンツを表示しません)。

これは魔法の解決策ではないので、あなたのアプリで。 Androidはあなたを助けますが、あなたが望むものを伝える必要があります。

恐らく、あなたが問題を抱えている特定のデザインに関する質問を投稿することができます。そして、stackoverflowの誰かがいくつかの提案を提供する可能性があります。

関連する問題