いくつかのカスタム要素を作成しましたが、それらをプログラムで右上隅 (上端n
からのm
ピクセルと右端からのピクセル) に配置したいと考えています。したがって、画面の幅と高さを取得してから位置を設定する必要があります。
int px = screenWidth - m;
int py = screenHeight - n;
メインのアクティビティを取得するscreenWidth
にはどうすればよいですか?screenHeight
いくつかのカスタム要素を作成しましたが、それらをプログラムで右上隅 (上端n
からのm
ピクセルと右端からのピクセル) に配置したいと考えています。したがって、画面の幅と高さを取得してから位置を設定する必要があります。
int px = screenWidth - m;
int py = screenHeight - n;
メインのアクティビティを取得するscreenWidth
にはどうすればよいですか?screenHeight
ピクセル単位の表示サイズが必要な場合は、次を使用できます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
使用できました。getWidth
getHeight
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);
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);
あなたの質問には答えないかもしれませんが、ビューのディメンションが必要であるが、レイアウトがまだレイアウトされていないときにコードが実行されている場合は、知っておくと便利です (この質問に来たときに自分で探していました)。 (たとえばonCreate()
) を使用して をセットアップしViewTreeObserver.OnGlobalLayoutListener
、View.getViewTreeObserver().addOnGlobalLayoutListener()
ビューのディメンションを必要とする関連コードをそこに配置できます。レイアウトがレイアウトされると、リスナーのコールバックが呼び出されます。
(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を使用しているほとんどのユーザーに依存していますが、これが残っています。
考えられるすべての「解決策」を試しましたが失敗しましたが、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) {
}
Android デバイスのステータス バーの高さにアクセスするには、プログラムで取得する方法をお勧めします。
int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
result = getResources().getDimensionPixelSize(resId);
}
この変数result
は高さをピクセルで指定します。
Title bar
、Navigation bar
およびの高さの詳細についてはContent View
、Android デバイスの画面サイズをご覧ください。
最初にビューを取得し (例: by ) 、ビュー自体でgetWidth()findViewById()
を使用できます。
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;
}
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>
これは私がタスクに使用するコードです:
// `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();
}
十分にきれいに見えますが、非推奨を処理します。
フランチェスコの答えに追加するだけです。ウィンドウ内の場所または画面内の場所を見つけたい場合、より適切な他のオブザーバーは ViewTreeObserver.OnPreDrawListener()です
これは、onCreate() の時点ではほとんど不明なビューの他の属性 (スクロール位置、スケーリング位置など) を見つけるためにも使用できます。
画面の幅と高さを求める:
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);
}
アクティビティで次のコードを使用します。
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;
にいるのではなく、Activity
にView
いる(またはスコープにタイプの変数がView
ある)場合は、を使用する必要はありませんWINDOW_SERVICE
。次に、少なくとも2つの方法を使用できます。
初め:
DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();
2番:
DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);
ここで呼び出すこのメソッドはすべて非推奨ではありません。
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);
}
}
これは、実際のピクセル単位での表示サイズが必要だったため、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);
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;
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;
}
ステータスバーとアクションバーなしで使用可能な画面サイズを探している人のために(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);
}
最初に XML ファイルをロードしてから、次のコードを記述します。
setContentView(R.layout.main);
Display display = getWindowManager().getDefaultDisplay();
final int width = (display.getWidth());
final int height = (display.getHeight());
画面の解像度に応じて幅と高さを表示します。
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()
を返し、画面の高さを返します。
幅と高さの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 バージョンとさまざまな種類のデバイス (電話とタブレット) で使用可能な表示の高さと幅が得られます。バーの種類 (ステータス バー、ナビゲーション バー) は除きます。
下位バージョンにも対応したシンプルな機能。
/**
* @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];
これは、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 ...
}
画面の幅と高さを取得する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
}
DisplayMetrics dm = getResources().getDisplayMetrics();
float fwidth = dm.density * dm.widthPixels;
float fheight = dm.density * dm.heightPixels;
minSDKVersionが原因でエラーが発生し、非推奨のメソッド ( & )getSize
を使用したくない場合、ソリューションはもともと Balaji.K によって 2011 年に投稿されました...そして Nikは、ステータス バーのサイズも考慮することを説明するコメントを追加しました。getWidth
getHeight
getMetrics
getDisplayMetrics
他のいくつかのコメントは、寸法の正確な float 値を取得するためにスケール ( density ) を乗算することを参照しています。Android v2.2 (API 8) および v4.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();