1925

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

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

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

4

46 に答える 46

3547

ピクセル単位の表示サイズが必要な場合は、次を使用できますgetSize

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

にいない場合は、Activity次の方法でデフォルトを取得できDisplayますWINDOW_SERVICE

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

フラグメントにいて、これを完了したい場合は、Activity.WindowManager (Xamarin.Android の場合) または getActivity().getWindowManager() (Java の場合) を使用してください。

が (API レベル 13 で) 導入される前は、非推奨になった メソッドとメソッドをgetSize使用できました。getWidthgetHeight

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

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

別の方法は次のとおりです

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

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

widthPixels以下の情報を取得するために使用できます。

「ピクセル単位のディスプレイの絶対幅。」

例:

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

API レベル 30 の更新

final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
 // Gets all excluding insets
 final WindowInsets windowInsets = metrics.getWindowInsets();
 Insets insets = windowInsets.getInsetsIgnoreVisibility(WindowInsets.Type.navigationBars()
         | WindowInsets.Type.displayCutout());

 int insetsWidth = insets.right + insets.left;
 int insetsHeight = insets.top + insets.bottom;

 // Legacy size that Display#getSize reports
 final Rect bounds = metrics.getBounds();
 final Size legacySize = new Size(bounds.width() - insetsWidth,
         bounds.height() - insetsHeight);
于 2009-06-19T08:41:04.510 に答える
387

1 つの方法は次のとおりです。

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;

API レベル 30 の更新

final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
 // Gets all excluding insets
 final WindowInsets windowInsets = metrics.getWindowInsets();
 Insets insets = windowInsets.getInsetsIgnoreVisibility(WindowInsets.Type.navigationBars()
         | WindowInsets.Type.displayCutout());

 int insetsWidth = insets.right + insets.left;
 int insetsHeight = insets.top + insets.bottom;

 // Legacy size that Display#getSize reports
 final Rect bounds = metrics.getBounds();
 final Size legacySize = new Size(bounds.width() - insetsWidth,
         bounds.height() - insetsHeight);
于 2011-01-31T02:01:11.193 に答える
123

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

于 2011-04-06T21:23:00.800 に答える
111

(2012年の回答、古くなっている可能性があります)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、および2.3を使用しているほとんどのユーザーに依存していますが、これが残っています。

于 2012-07-24T03:14:27.097 に答える
75

考えられるすべての「解決策」を試しましたが失敗しましたが、Elliott Hughes の「Dalvik Explorer」アプリは、どの Android デバイス/OS バージョンでも常に正しい寸法を表示することに気付きました。私はここで見つけることができる彼のオープンソースプロジェクトを見ました: 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) {
}
于 2013-03-29T08:15:43.890 に答える
48

Android デバイスのステータス バーの高さにアクセスするには、プログラムで取得する方法をお勧めします。

サンプルコード

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

この変数resultは高さをピクセルで指定します。

すばやくアクセスするには

ここに画像の説明を入力してください

Title barNavigation barおよびの高さの詳細についてはContent ViewAndroid デバイスの画面サイズをご覧ください。

于 2013-08-27T13:12:30.370 に答える
34

最初にビューを取得し (例: by ) 、ビュー自体でgetWidth()findViewById()を使用できます。

于 2009-06-19T08:38:30.083 に答える
29

2つの関数があります。1つはコンテキストを送信するためのもので、もう1つはピクセル単位で高さと幅を取得するためのものです。

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // Deprecated
    }
    return width;
}

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }
    else{
        height = display.getHeight();  // Deprecated
    }
    return height;
}
于 2012-10-17T14:44:20.433 に答える
20

XML を使用して動的にスケーリングするには、「android:layout_weight」という属性があります。

以下の例は、このスレッドに対する synic の応答を変更したもので、画面の 75% を占めるボタン (重み = .25) と、画面の残りの 25% を占めるテキスト ビュー (重み = .75) を示しています。

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="somebutton">

    <TextView android:layout_width="fill_parent"
        android:layout_height="Wrap_content"
        android:layout_weight=".75">
</LinearLayout>
于 2011-12-22T06:11:08.033 に答える
19

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

// `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();
}

十分にきれいに見えますが、非推奨を処理します。

于 2012-12-27T14:31:01.057 に答える
17

フランチェスコの答えに追加するだけです。ウィンドウ内の場所または画面内の場所を見つけたい場合、より適切な他のオブザーバーは ViewTreeObserver.OnPreDrawListener()です

これは、onCreate() の時点ではほとんど不明なビューの他の属性 (スクロール位置、スケーリング位置など) を見つけるためにも使用できます。

于 2012-03-16T07:15:23.577 に答える
17

画面の幅と高さを求める:

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);
}
于 2012-06-18T04:42:48.230 に答える
17

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

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;
于 2012-03-19T14:58:56.330 に答える
14

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

初め:

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

2番:

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

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

于 2013-03-16T02:21:42.937 に答える
14
public class AndroidScreenActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        String str_ScreenSize = "The Android Screen is: "
                                   + dm.widthPixels
                                   + " x "
                                   + dm.heightPixels;

        TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);
        mScreenSize.setText(str_ScreenSize);
    }
}
于 2012-06-27T12:18:12.173 に答える
12

これは、実際のピクセル単位での表示サイズが必要だったため、OP の回答ではありません。「device-independent-pixels」の寸法が欲しかったので、ここから答えまとめましたこれとともに:

    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
    int dpHeight = (int)(displayMetrics.heightPixels / displayMetrics.density + 0.5);
    int dpWidth = (int)(displayMetrics.widthPixels / displayMetrics.density + 0.5);
于 2013-08-16T21:44:02.923 に答える
10

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

 // 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;
于 2012-12-19T14:39:49.120 に答える
10

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;
}
于 2013-04-21T13:42:35.050 に答える
8

ステータスバーアクションバーなしで使用可能な画面サイズを探している人のために(Swapnilの回答にも感謝します):

DisplayMetrics dm = getResources().getDisplayMetrics();
float screen_w = dm.widthPixels;
float screen_h = dm.heightPixels;

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

TypedValue typedValue = new TypedValue();
if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)){
    screen_h -= getResources().getDimensionPixelSize(typedValue.resourceId);
}
于 2013-09-09T09:02:51.107 に答える
7

最初に XML ファイルをロードしてから、次のコードを記述します。

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

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

于 2012-12-17T11:22:09.263 に答える
5

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

たとえば、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()を返し、画面の高さを返します。

于 2013-06-26T18:35:05.657 に答える
3

幅と高さのmatch_parentを持つルート ビューとして LinearLayout を使用したスプラッシュ スクリーン アクティビティがあります。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 バージョンとさまざまな種類のデバイス (電話とタブレット) で使用可能な表示の高さと幅が得られます。バーの種類 (ステータス バー、ナビゲーション バー) は除きます。

于 2013-11-02T19:55:00.290 に答える
1

下位バージョンにも対応したシンプルな機能。

/**
 * @return screen size int[width, height]
 *
 * */
public int[] getScreenSize(){
    Point size = new Point();
    WindowManager w = getWindowManager();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){
        w.getDefaultDisplay().getSize(size);
        return new int[]{size.x, size.y};
    }else{
        Display d = w.getDefaultDisplay();
        //noinspection deprecation
        return new int[]{d.getWidth(), d.getHeight()};
    }
}

使用するには:

int width = getScreenSize()[0];
int height = getScreenSize()[1];
于 2014-06-11T17:19:01.307 に答える
1

これは、Kotlin 実装での上記のいくつかの回答からの簡単な適応です。上記のように、マニフェストで windowsSoftInput="adjustResize" が必要です。

class KeyboardWatcher(private val layoutRooView: View) {

    companion object {
        private const val MIN_KEYBOARD_HEIGHT = 200f
    }

    private val displayMetrics: DisplayMetrics = layoutRooView.resources.displayMetrics
    private var stateVisible = false

    var observer: ((Boolean) -> Unit)? = null

    init {
        layoutRooView.viewTreeObserver.addOnGlobalLayoutListener {
            val heightDiff = layoutRooView.rootView.height - layoutRooView.height
            if (!stateVisible && heightDiff > dpToPx(MIN_KEYBOARD_HEIGHT)) {
                stateVisible = true
                observer?.invoke(stateVisible)
            } else if(stateVisible) {
                stateVisible = false
                observer?.invoke(stateVisible)
            }
        }
    }

    private fun dpToPx(valueInDp: Float): Float {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, displayMetrics)
    }
}

そして使用するには:

val activityRootView = findViewById<ViewGroup>(R.id.activityRoot)
KeyboardWatcher(activityRootView).observer = { visible ->
    if (visible) do something here ...
}
于 2017-10-14T20:13:45.903 に答える
1

画面の幅と高さを取得するKotlin 拡張関数を作成-

fun Context?.screenWidthInPx(): Int {
    if (this == null) return 0
    val dm = DisplayMetrics()
    val wm = this.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    wm.defaultDisplay.getMetrics(dm)
    return dm.widthPixels
}
//comment
fun Context?.screenHeightInPx(): Int {
    if (this == null) return 0
    val dm = DisplayMetrics()
    val wm = this.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    wm.defaultDisplay.getMetrics(dm)
    return dm.heightPixels
}
于 2020-02-22T05:34:24.287 に答える
0
DisplayMetrics dm = getResources().getDisplayMetrics();
float fwidth = dm.density * dm.widthPixels;
float fheight = dm.density * dm.heightPixels;

minSDKVersionが原因でエラーが発生し、非推奨のメソッド ( & )getSizeを使用したくない場合、ソリューションはもともと Balaji.K によって 2011 年に投稿されました...そして Nikは、ステータス バーのサイズも考慮することを説明するコメントを追加しました。getWidthgetHeightgetMetricsgetDisplayMetrics

他のいくつかのコメントは、寸法の正確な float 値を取得するためにスケール ( density ) を乗算することを参照しています。Android v2.2 (API 8) および v4.0 でテストされ、良好な結果が得られ、エラーや警告は発生しませんでした。

于 2014-09-02T10:48:08.300 に答える
0

以下のようなクラスとメソッドを作成します。

public MyPoint getScreenDimensionsAsPixel(Context context){
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();

        Point point = new Point();
        display.getSize(point);

        return new MyPoint(point.x, point.y);
    }

    public class MyPoint{
        private int width;
        private int height;

        public MyPoint(int width, int height) {
            this.width = width;
            this.height = height;
        }

        public int getWidth() {
            return width;
        }

        public void setWidth(int width) {
            this.width = width;
        }

        public int getHeight() {
            return height;
        }

        public void setHeight(int height) {
            this.height = height;
        }
    }

コードでそれらを使用します。

MyPoint myPoint = getScreenDimensionsAsPixel(MainActivity.this);
                Toast.makeText(MainActivity.this, "width: " + String.valueOf(myPoint.getWidth()) + "|" +
                        "height: " + String.valueOf(myPoint.getHeight()), Toast.LENGTH_LONG).show();
于 2022-01-03T16:52:23.277 に答える