AndroidStudioサイズに関して

端末ごとに画像のサイズや位置を揃える

アプリ開発を始めてまず最初にサイズをとるのに苦戦するんじゃないでしょうか?

viewのサイズを取得する場合、onCreateやonResumeで行ってもviewのサイズが取れません。

理由としてはこの時点ではまだviewが生成されていないため、要するに無いものの数値は取れないってことです。

そこでonFocusChangedで生成されてからサイズを取得する方法なんですが、この方法だとライフサイクルの関係上色々と都合が悪いと感じました。

そこで目的としている画面サイズから、起動させる画面の差分を倍率で取得すれば、問題なく数値が取れるのでは無いかと思い作成しました。

  

まずはこちらをご覧ください。

RealDisplaySizeクラス

public class RealDisplaySize {

    Activity activityInfo;
    //全体のレイアウトを取るための変数
    private final int VIEW_WIDTH_MAIN_SIZE = 1080;    // メインターゲットとなるwidth
    private final int VIEW_HEIGHT_MAIN_SIZE = 1920;   // メインターゲットとなるheight
    public static int viewRealWidth;        // 端末サイズ width
    public static int viewRealHeight;       // 端末サイズ height
    public static float magification;        // 倍率

    //コンストラクタ
    public RealDisplaySize(Activity activity) {
        activityInfo = activity;
        getRealSize();
        magification = magnificationWidth();
        Log.d("width", "" + viewRealWidth);
        Log.d("height", "" + viewRealHeight);
    }

    //端末の実際のサイズを取得するためのメソッド
    public Point getRealSize() {

        Display display = activityInfo.getWindowManager().getDefaultDisplay();
        Point point = new Point(0, 0);

        // Ver 4.2 以降
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            display.getRealSize(point);
            // 変数へ端末のサイズを格納
            viewRealWidth = point.x;
            viewRealHeight = point.y;
            return point;

            // Ver 3.2 以降  * 4.1 より前をサポートしないのならいらないかも。
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
            try {
                Method getRawWidth = Display.class.getMethod("getRawWidth");
                Method getRawHeight = Display.class.getMethod("getRawHeight");
                // 変数へ端末のサイズを格納
                viewRealWidth = (Integer)getRawWidth.invoke(display);
                viewRealHeight = (Integer)getRawHeight.invoke(display);
                point.set(viewRealWidth, viewRealHeight);
            } catch (Exception e) {}
        }
        return point;
    }

    //倍率を取るためのメソッド width
    public float magnificationWidth() {
        return (float)viewRealWidth / (float)VIEW_WIDTH_MAIN_SIZE;
    }

    // height
    public float magnificationHeight() {
        return  (float)viewRealHeight / (float)VIEW_HEIGHT_MAIN_SIZE;
    }
}

一番上の定数なんですが、これは実際に開発する端末のサイズでいいです。

ご利用の端末が小さいものや、大きいものであれば数値を変更する必要があります。

そしたらあとは、使用したいクラスに

// フィールドにまず変数を記述
private float scaleWidth;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

/*
先ほど作成したクラスをインスタンス化してメソッドを呼び出す
今回はwidthの要素だけ取得しています。
*/
RealDisplaySize realDispSize = new RealDisplaySize( this );
scaleWidth = realDispSize.magnification;
}

てな感じに入力します、するとあら不思議、scaleに倍率が格納されます。

 

最初に倍率を取得して置くことの最大の利点は、使い回しが効くと言うところです。

画像をセットするときに、setX * scaleWidth と記述して置けば端末のサイズを気にせずに同じ場所に設置することが可能です。

全ての端末で調べた訳ではありませんがHuaweiの機種はなぜかpointがずれてしまうことがあったので、全画面処理を専用に作成しなければなりません。

 

widthしか取らなかったのはスマホの端末は基本16:9の割合なのでwidthもheightも倍率が一緒になることが多いんですね。

 

Galaxyの一部の端末は16:10の物があったり、古い端末で4:3の比率もあるのでなるべく多くの端末に対応させた場合はしっかりheightもとった方がいいかもしれませんね。

画面サイズがうまく操れなくて困った時に考えたコードでした。

記事のサブ画像




コメント

コメントを追加

user-symbol

Stay in touch

ビジネスおよび開発者向けの実用的な最新情報をご希望ですか?

ソースコードプロジェクトに対するPieceXコミュニティのニーズについてご提供します。

PieceXの最新の無料コミュニティコードプロジェクトをいち早くお知らせします。