確認 - unity android 画面サイズ 取得




画面のサイズをピクセル単位で取得する (20)

いくつかのカスタム要素を作成しました。プログラムの右上隅(上端からnピクセル、右端からmピクセル)にプログラムを配置します。 したがって、私は画面の幅と画面の高さを取得し、位置を設定する必要があります:

int px = screenWidth - m;
int py = screenHeight - n;

メインアクティビティでscreenWidthscreenHeightを取得するにはどうすればよいですか?


Android搭載端末のステータスバーの高さにアクセスするには、プログラマティックな方法で取得することをおすすめします。

サンプルコード

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    result = getResources().getDimensionPixelSize(resId);
}

変数resultは、ピクセルの高さを返します。

クイックアクセスのため

Title barNavigation barContent View高さについては、 Androidデバイスの画面サイズをご覧ください。


DisplayMetrics(API 1)を使用してこれを行う非推奨の方法があり、try / catch messinessを回避しています:

 // initialize the DisplayMetrics object
 DisplayMetrics deviceDisplayMetrics = new DisplayMetrics();

 // populate the DisplayMetrics object with the display characteristics
 getWindowManager().getDefaultDisplay().getMetrics(deviceDisplayMetrics);

 // get the width and height
 screenWidth = deviceDisplayMetrics.widthPixels;
 screenHeight = deviceDisplayMetrics.heightPixels;

LinearLayoutをルートビューとしてスプラッシュ画面のアクティビティがあり、その幅と高さにmatch_parentがあります 。 これは、そのアクティビティのonCreate()メソッドonCreate()のコードです。 私はこれらの措置をアプリの他のすべての活動に使用します。

int displayWidth = getRawDisplayWidthPreHoneycomb();
int rawDisplayHeight = getRawDisplayHeightPreHoneycomb();
int usableDisplayHeight = rawDisplayHeight - getStatusBarHeight();
pf.setScreenParameters(displayWidth, usableDisplayHeight);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    LinearLayout myView = (LinearLayout) findViewById(R.id.splash_view);
    myView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
            if (left == 0 && top == 0 && right == 0 && bottom == 0) {
                return;
            }
            int displayWidth = Math.min(right, bottom);
            int usableDisplayHeight = Math.max(right, bottom);
            pf.setScreenParameters(displayWidth, usableDisplayHeight);
        }
    });
}

上記のメソッドの実装は次のとおりです:

private int getRawDisplayWidthPreHoneycomb() {
    WindowManager windowManager = getWindowManager();
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getMetrics(displayMetrics);

    int widthPixels = displayMetrics.widthPixels;
    int heightPixels = displayMetrics.heightPixels;

    return Math.min(widthPixels, heightPixels);
}

private int getRawDisplayHeightPreHoneycomb() {
    WindowManager w = getWindowManager();
    Display d = w.getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    d.getMetrics(metrics);

    int widthPixels = metrics.widthPixels;
    int heightPixels = metrics.heightPixels;

    return Math.max(widthPixels, heightPixels);
}

public int getStatusBarHeight() {
    int statusBarHeight = 0;

    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        statusBarHeight = getResources().getDimensionPixelSize(resourceId);
    }

    return statusBarHeight;
}

これにより、すべてのAPIバージョンとさまざまな種類のデバイス(電話機とタブレット)の棒の種類(ステータスバー、ナビゲーションバー)を除いた、使用可能なディスプレイの高さと幅が表示されます。


WindowManagers、Points、またはDisplayのオーバーヘッドを必要としない場合は、高さと幅がmatch_parentに設定されていれば、XMLの一番上のViewアイテムのheight属性とwidth属性を取得できます。 (レイアウトが画面全体を占める限り、これは当てはまります)。

たとえば、XMLが次のようなもので始まっているとします。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/entireLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

findViewById(R.id.entireLayout).getWidth()は画面の幅をfindViewById(R.id.entireLayout).getHeight()findViewById(R.id.entireLayout).getHeight()は画面の高さを返します。


(2012年の回答、古いかもしれません)pre Honeycombをサポートしたい場合、API13の前に下位互換性を置く必要があります:

int measuredWidth = 0;
int measuredHeight = 0;
WindowManager w = getWindowManager();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    Point size = new Point();
    w.getDefaultDisplay().getSize(size);
    measuredWidth = size.x;
    measuredHeight = size.y;
} else {
    Display d = w.getDefaultDisplay();
    measuredWidth = d.getWidth();
    measuredHeight = d.getHeight();
}

もちろん、廃止されたメソッドは最終的には最新のSDKから取り出されますが、Android 2.1,2.2,3.3を使用しているほとんどのユーザーに依然として依拠していますが、これが私たちに残されています。


WINDOW_SERVICEば、あなたがActivityではなくView (またはあなたのスコープでViewタイプの変数を持っている)場合は、 WINDOW_SERVICEを使う必要はありません。 次に、少なくとも2つの方法を使用できます。

最初:

DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();

二番目:

DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);

ここで呼び出すこれらのメソッドはすべて非推奨ではありません。


あなたの質問に答えることはできないかもしれませんが、ビューのディメンションが必要ですが、まだレイアウトがレイアウトされていないときにコードが実行されているということを知っておくと便利です(この質問には、 ( onCreate()ViewTreeObserver.OnGlobalLayoutListenerView.getViewTreeObserver().addOnGlobalLayoutListener()を使用してViewTreeObserver.OnGlobalLayoutListenerを設定し、ビューの次元が必要な関連するコードを配置できます。 リスナーのコールバックは、レイアウトがレイアウトされたときに呼び出されます。


これははるかに良い解決策ではありませんか? DisplayMetricsは、必要なものがすべて付属し、API 1から動作します。

public void getScreenInfo(){
    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

    heightPixels = metrics.heightPixels;
    widthPixels = metrics.widthPixels;
    density = metrics.density;
    densityDpi = metrics.densityDpi;
}

getRealMetricsを使用して実際の表示(ステータスバーやソフトウェアナビゲーションバーなどの画面デコルを含む)を取得することもできますが、これは17+のみで動作します。

何か不足していますか?


これは私がタスクに使用するコードです:

// `activity` is an instance of Activity class.
Display display = activity.getWindowManager().getDefaultDisplay();
Point screen = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    display.getSize(screen);
} else {            
    screen.x = display.getWidth();
    screen.y = display.getHeight();
}

まだ十分にきれいに見えますが、廃止予定を処理しています。


まず、XMLファイルをロードし、次のコードを記述します。

setContentView(R.layout.main);      
Display display = getWindowManager().getDefaultDisplay();
final int width = (display.getWidth());
final int height = (display.getHeight());

画面の解像度に応じて幅と高さを表示します。


アクティビティで次のコードを使用します。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;

アクティビティのonCreateでレイアウトに使用できるスペースの正確な大きさを知る必要がある場合があります。 いくつか考えた後、私はこのやり方でやった。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivityForResult(new Intent(this, Measure.class), 1);
        // Return without setting the layout, that will be done in onActivityResult.
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -1);
        // Width is now set to the precise available width, and a layout can now be created.            ...
    }
}

public final class Measure extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
       // Create a LinearLayout with a MeasureFrameLayout in it.
        // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
        LinearLayout linearLayout = new LinearLayout(this);
        LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
        measureFrameLayout.setLayoutParams(matchParent);
        linearLayout.addView(measureFrameLayout);
        this.addContentView(linearLayout, matchParent);
        // measureFrameLayout will now request this second activity to finish, sending back the width.
    }

    class MeasureFrameLayout extends FrameLayout {
        boolean finished = false;
        public MeasureFrameLayout(Context context) {
            super(context);
        }

        @SuppressLint("DrawAllocation")
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            if (finished) {
                return;
            }
            finished = true;
            // Send the width back as the result.
            Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
            Measure.this.setResult(Activity.RESULT_OK, data);
            // Tell this activity to finish, so the result is passed back.
            Measure.this.finish();
        }
    }
}

何らかの理由でAndroidマニフェストに別のアクティビティを追加したくない場合は、次のようにすることができます:

public class MainActivity extends Activity {
    static Activity measuringActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            extras = new Bundle();
        }
        int width = extras.getInt("Width", -2);
        if (width == -2) {
            // First time in, just start another copy of this activity.
            extras.putInt("Width", -1);
            startActivityForResult(new Intent(this, MainActivity.class).putExtras(extras), 1);
            // Return without setting the layout, that will be done in onActivityResult.
            return;
        }
        if (width == -1) {
            // Second time in, here is where the measurement takes place.
            // Create a LinearLayout with a MeasureFrameLayout in it.
            // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
            LinearLayout linearLayout = new LinearLayout(measuringActivity = this);
            LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
            measureFrameLayout.setLayoutParams(matchParent);
            linearLayout.addView(measureFrameLayout);
            this.addContentView(linearLayout, matchParent);
            // measureFrameLayout will now request this second activity to finish, sending back the width.
        }
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -3);
        // Width is now set to the precise available width, and a layout can now be created. 
        ...
    }

class MeasureFrameLayout extends FrameLayout {
    boolean finished = false;
    public MeasureFrameLayout(Context context) {
        super(context);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (finished) {
            return;
        }
        finished = true;
        // Send the width back as the result.
        Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
        MainActivity.measuringActivity.setResult(Activity.RESULT_OK, data);
        // Tell the (second) activity to finish.
        MainActivity.measuringActivity.finish();
    }
}    

ディスプレイの大きさをピクセルで表現したい場合、 getSizeを使うことができます:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

Activityていない場合は、 WINDOW_SERVICE経由でデフォルトのDisplayを取得できます:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

断片化しており、これを実現したい場合は、Activity.WindowManager(Xamarin.Android)またはgetActivity()。getWindowManager()(Java)を使用します。

getSizeが導入される前に(APIレベル13で)、現在推奨されていないgetWidthメソッドとgetHeightメソッドを使用getWidth getHeight

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated

しかし、あなたが説明しているユースケースでは、レイアウトのマージン/パディングがより適切なようです。

別の方法は: DisplayMetrics

サイズ、密度、フォントのスケーリングなど、ディスプレイに関する一般的な情報を記述する構造体。 DisplayMetricsメンバにアクセスするには、次のようにオブジェクトを初期化します。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

widthPixelsを使用してwidthPixels情報を取得できます。

msgstr "ディスプレイの絶対幅をピクセル単位で指定します。"

例:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);

一つの方法は:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();

これは推奨されていないので、代わりに次のコードを試してください。 最初の2行のコードは、DisplayMetricsオブジェクトを提供します。 このオブジェクトには、heightPixels、widthPixelsなどのフィールドが含まれます。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int height = metrics.heightPixels;
int width = metrics.widthPixels;

最も簡単な方法:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 

次のようにして高さのサイズを取得できます。

getResources().getDisplayMetrics().heightPixels;

および使用する幅のサイズ

getResources().getDisplayMetrics().widthPixels; 

画面の幅と高さを見つける:

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();

これを使用して、SDK 13以上の最新版を入手できます。

// New width and height
int version = android.os.Build.VERSION.SDK_INT;
Log.i("", " name == "+ version);
Display display = getWindowManager().getDefaultDisplay();
int width;
if (version >= 13) {
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    Log.i("width", "if =>" +width);
}
else {
    width = display.getWidth();
    Log.i("width", "else =>" +width);
}

私はこのようにgetSizeコードをラップします:

@SuppressLint("NewApi")
public static Point getScreenSize(Activity a) {
    Point size = new Point();
    Display d = a.getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        d.getSize(size);
    } else {
        size.x = d.getWidth();
        size.y = d.getHeight();
    }
    return size;
}

私は可能なすべての "ソリューション"を試してみましたが、Elliott Hughesの "Dalvik Explorer"アプリは常にAndroidデバイス/ OSバージョンに正しい次元を表示しています。 私は彼のオープンソースプロジェクトを見て、ここで見つけました: https://code.google.com/p/enh/ : https://code.google.com/p/enh/

関連するすべてのコードは次のとおりです。

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
try {
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
try {
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

編集:わずかに改善されたバージョン(サポートされていないOSバージョンで例外を発生させないでください):

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

DisplayMetrics dimension = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dimension);
int w = dimension.widthPixels;
int h = dimension.heightPixels;




dimensions