2017-11-27 1 views
1

利用可能なスペースに応じて画像のサイズを決定します他のデバイスは小さすぎます。コードネームは一つの自動私は、ログイン画面の上部にあるロゴを持っている

たとえば、ロゴのサイズが最大で横の画面スペースの80%、最大で縦のスペースの20%(その最大値に応じて)のサイズを自動的に変更したいとします。ロゴがボーダーレイアウトの北にある場合、これをどのように達成できますか?

+0

私は私の解決策を共有重量は、幅、高さの割合のように動作します。 –

答えて

0

変更する必要があります(つまり、デバイスの向きや仮想キーボードの使用時にロゴのサイズが変わるはずです)。私はベクトル画像を使用して、サイズ変更時に画像の品質が損なわれないようにしています(このSVGファイルはAndroid 4で正しくレンダリングされているため、最新のデバイスで正しくレンダリングされていると思います)。 XMLのアンドロイドに

public class MyMainClass { 

    [...] 
    private static Label logo; 

    public void init(Object context) { 
     [...] 
    } 

    public void start() { 
     [...] 

     // Insert vectorial logo in the north 
     // Constraints: 
     // logoMaxWidth is the maximum horizontal screen space in percentage 
     // logoMaxHeight is the maximum vertical screen space in percentage 
     double logoMaxWidth = 0.75; 
     double logoMaxHeight = 0.15; 
     logo = new Label((theme.getImage("Logo.svg")).scaledSmallerRatio(Double.valueOf(Display.getInstance().getDisplayWidth() * logoMaxWidth).intValue(), Double.valueOf(Display.getInstance().getDisplayHeight() * logoMaxHeight).intValue())); 
     backgroundContainer.add(BorderLayout.NORTH, FlowLayout.encloseCenterMiddle(logo)); 

     [...] 

     // Recalculate the size of the logo when device size changes 
     Form logoForm = logo.getComponentForm(); 
     if (logoForm != null) { 
      logoForm.addSizeChangedListener(l -> { 
       logo.remove(); 
       logo = new Label((theme.getImage("Logo.svg")).scaledSmallerRatio(Double.valueOf(Display.getInstance().getDisplayWidth() * logoMaxWidth).intValue(), Double.valueOf(Display.getInstance().getDisplayHeight() * logoMaxHeight).intValue())); 
       backgroundContainer.add(BorderLayout.NORTH, FlowLayout.encloseCenterMiddle(logo)); 
       logoForm.revalidate(); 
      }); 
     } 
2

フローレイアウトを使用してコンポーネントをラップしています。フローレイアウトを使用すると、コンポーネントの推奨サイズが決まるので、希望のサイズが小さすぎるとスケーリングコンポーネントが重要でなくなります。

DPIに基づいてすべてのデバイスでうまく見え、ロゴのような要素のスケーリングを避けるマルチイメージを使用することをお勧めします。マルチ画像は、この目的のために正確に設計されています。別の方法としては、次のようなコードを使用してミリメートル単位でのサイズの画像をすることができます:シャイの答えは、一般的には正しいのですが、この特定のケースでは、私は画像サイズにより精度と制御を必要とする、それが利用可能な画面に応じて自動的に

Image img = logo.scaledHeight(Display.getInstance().convert(sizeInMM)); 
関連する問題