Я создал несколько пользовательских элементов и хочу программно поместить их в правый верхний угол (n
пикселей от верхнего края и m
пикселей от правого края). Поэтому мне нужно получить ширину и высоту экрана, а затем установить позицию:
int px = screenWidth - m;
int py = screenHeight - n;
Как мне получить screenWidth
и screenHeight
в основной Activity?
Если вам нужны размеры дисплея в пикселях, вы можете использовать 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).
До появления getSize
(на 13-м уровне API) вы могли использовать методы 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
, чтобы получить информацию для:
"Абсолютная ширина дисплея в пикселях."
Пример:
Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);
Один из способов:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
Он устарел, и вам следует попробовать следующий код вместо него. Первые две строки кода дают вам объект DisplayMetrics
. Этот объект содержит такие поля, как heightPixels
, widthPixels
.
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int width = metrics.widthPixels;
Он не может ответить на ваш вопрос, но это может быть полезно знать (я искал его сам, когда я пришел на этот вопрос), что если вам нужно посмотреть's размер, но код выполняется, когда его планировка не выкладывали еще (например в методе onCreate()) вы можете установить
ViewTreeObserver.OnGlobalLayoutListenerС
зрения.getViewTreeObserver().addOnGlobalLayoutListener () и поставить соответствующий код, который нуждается в представлении's размер есть. Слушатель'с обратного вызова будет вызвана, когда макет будет выложен.
(Ответ 2012, могут быть устаревшими) если вы хотите поддержать заранее Сота, вам необходимо поставить в обратной совместимости с API до 13. Что-то вроде:
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, но пока мы еще рассчитывать на большинство наших пользователей, имеющих Андроид 2.1, 2.2 и 2.3, это то, что нам остается.
Я пробовал все возможные и"решения" и безуспешно и я заметил, что Эллиот Хьюз' "и Далвик Обозреватель" и приложение всегда показывает правильный размер на любом устройстве Android/версия ОС. Я в конечном итоге глядя на его проект с открытым исходным кодом, который может быть найден здесь: https://code.google.com/p/enh/
Здесь's все соответствующий код:
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) {
}
Редактировать: немного улучшенная версия (избегайте стрельбы исключения на не поддерживаемой версии ОС):
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) {
}
Простой способ:
int screenHeight = getResources().getDisplayMetrics().heightPixels;
int screenWidth = getResources().getDisplayMetrics().widthPixels;
Для доступа к высота строки состояния для Android устройств, мы предпочитаем программный способ сделать это:
Образец ##код#
int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
result = getResources().getDimensionPixelSize(resId);
}
Результате переменная `дает высотой в пиксель.
Для получения дополнительной информации о высоте заголовок
, навигация
и `просматривать контент, пожалуйста, посмотрите на размеры экрана устройства Android.
Сначала получите представление (например, с помощью findViewById()
), а затем вы можете использовать getWidth() для самого представления.
У меня есть две функции, одна для отправки контекст и другие высота и ширина в пикселях:
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;
}
Это'т это гораздо лучшее решение? 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+.
Я что-то пропустила?
Для динамического масштабирования с использованием XML есть атрибут, называемый "для Android:layout_weight" и
Ниже пример, изменен справочник synic's в ответ на этот threadпоказывает кнопку, которая занимает до 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();
Используя это, мы можем получить самую последнюю и выше СДК 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;
DisplayMetrics dimension = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dimension);
int w = dimension.widthPixels;
int h = dimension.heightPixels;
Надо сказать, что если вы не в "активности", но в " вид "(или переменную " вид " типа в области), там не нужно использовать WINDOW_SERVICE
. Потом можно использовать как минимум двумя способами.
Первый:
DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();
Во-вторых:
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);
}
}
Для получения размеров экрана использовать экран metrices
DisplayMetrics displayMetrics = new DisplayMetrics();
if (context != null)
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display defaultDisplay = windowManager.getDefaultDisplay();
defaultDisplay.getRealMetrics(displayMetrics);
}
Получить высоту и ширину в пикселях
int width =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;