我创建了一些自定义元素,我想以编程方式将它们放置在右上角(顶部边缘n
像素,右侧边缘m
像素)。因此,我需要获取屏幕宽度和屏幕高度,然后设置位置:
int px = screenWidth - m;
int py = screenHeight - n;
如何在主要活动中获得screenWidth
和screenHeight
?
如果要以像素为单位显示尺寸,可以使用getSize
:
getSize
如果您不在Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
中,则可以通过Activity
获得默认的Display
:
WINDOW_SERVICE
[如果您在一个片段中并且想要完成此操作,则只需使用Activity.WindowManager(在Xamarin.Android中)或getActivity()。getWindowManager()(在Java中)。
在引入WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
之前(在API级别13中,您可以使用现在不推荐使用的getSize
和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
为了使用XML动态缩放,有一个名为“ android:layout_weight”的属性
这是我用于任务的代码:
这不是更好的解决方案吗? // `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();
}
包含您需要的所有内容,并且可以从API 1使用。
只需添加Francesco的答案即可。如果您想找出窗口中的位置或屏幕中的位置,则另一个比较合适的观察者是getRealMetrics
查找屏幕的宽度和高度:
在活动中使用以下代码。
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;
我发现这可以解决问题。
[需要说,如果您不在Rect dim = new Rect();
getWindowVisibleDisplayFrame(dim);
中,但是在Activity
中(或在您的作用域中具有View
类型的变量),则无需使用View
。然后,您可以至少使用两种方式。
DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);
一种方法是:
Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);
已弃用,您应该尝试使用以下代码。代码的前两行为您提供Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
objecs。该对象包含DisplayMetrics
,heightPixels
之类的字段。
widthPixels
为了获得屏幕尺寸,请使用显示指标
这不是OP的答案,因为他希望显示尺寸以实像素为单位。我想要“独立于设备的像素”中的尺寸,然后从此处int width =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;
和此处https://stackoverflow.com/a/17880012/253938汇总答案,我想出了这一点:
[使用DisplayMetrics(API 1)可以避免这种情况,这避免了try / catch混乱:
我会像这样包装getSize代码:
您可以使用:
对于谁在没有状态栏
首先加载XML文件,然后编写此代码:
遵循以下方法:
有时,在活动的onCreate中,您需要知道布局的可用空间的精确尺寸。经过一番思考,我想出了这样做的方法。
如果不需要WindowManagers,Points或Displays的开销,则可以将XML中最顶部View项目的height和width属性,只要将其高度和宽度设置为match_parent即可。 (这是正确的,只要您的布局占据了整个屏幕。)
它可能无法回答您的问题,但了解(当我遇到此问题时我一直在寻找它)可能很有用(如果您需要View的尺寸,但是在未放置其布局时执行代码)出来(例如在DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int width = metrics.widthPixels;
中),您可以将onCreate()
设置为ViewTreeObserver.OnGlobalLayoutListener
,然后在其中放置需要视图尺寸的相关代码。布置好布局后,将调用侦听器的回调。
((2012年的答案,可能已经过时),如果要支持Honeycomb之前的版本,则需要在API 13之前具有向后兼容性。类似:
View.getViewTreeObserver().addOnGlobalLayoutListener()
当然,不推荐使用的方法最终将从最新的SDK中删除,但是尽管我们仍然依赖大多数拥有Android 2.1、2.2和2.3的用户,但这是我们剩下的。
我尝试了所有可能的“解决方案”均未成功,但我注意到Elliott Hughes的“ Dalvik Explorer”应用始终在任何Android设备/ OS版本上都显示正确的尺寸。我最终查看了他的开源项目,可以在这里找到: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();
}
这里是所有相关代码:
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) {
}
最简单的方法:
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 screenHeight = getResources().getDisplayMetrics().heightPixels;
int screenWidth = getResources().getDisplayMetrics().widthPixels;
变量int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
result = getResources().getDimensionPixelSize(resId);
}
给出像素的高度。
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8xSHhsTS5wbmcifQ==” alt =“在此处输入图像描述”>“ >>
有关result
,Title bar
和Navigation bar
的高度的更多信息,请查看Content View
首先获取视图(例如,按Android Device Screen Sizes),然后可以在视图本身上使用findViewById()
。
我有两个功能,一个用于发送上下文,另一个用于获取像素的高度和宽度: