android 中 获取各种高度,控件,状态栏,底部导航栏

您所在的位置:网站首页 android设置控件高度 android 中 获取各种高度,控件,状态栏,底部导航栏

android 中 获取各种高度,控件,状态栏,底部导航栏

2023-05-03 12:52| 来源: 网络整理| 查看: 265

状态栏即statusBar,导航栏即某些手机底部有返回键的虚拟键那一栏,叫navigationBar。

在页面未加载出来前,直接通过getWidth()获取的宽度为0,即使你在onResume()方法中执行这个方法也是一样。

  先很负责任的说一下,这个内容也是百度来的,但是很不负责任的是,当初只记录解决方案,忘了记录是查看的哪篇博客了,这里先对不知道借鉴的谁表示感谢。无法分享链接,就厚着脸皮把(转)字去掉了,请大家谅解。

  先提供一下 Android知识点——目录 的链接,然后让我们进入正题。

  实际上,这篇博客所说的内容并不是所有人都可以用到,毕竟大多数时候,我们只需要展示,而并不需要知道的宽高;有的时候我们只需要知道展示的宽高(即ImageView)的宽高,不需要知道资源的实际尺寸。

  但是需求千千万万嘛,以程序员的脑洞,怎么能想到产品的脑洞究竟有多大呢?我这里就遇到了一个需求,那就是需要在一个可缩放的上标注icon(类似地图上的marker)。这还不算完,毕竟在找到的缩放控件 PhotoView 中,我们点击到上后,是有点击点位在整个上的百分比坐标回调的。而多端通过百分比是很容易就能在中获取到相同的点位,并回显出对应的icon的(没办法,谁让我找的是方便计算百分比的呢),结果Web端优先做了这部分功能,使用的是在原图上的具体坐标。这样我百分比的计划自然就落空了,只能想办法计算出具体的点位。

  因此获取的原始尺寸就是一个必不可少的环节,我刚刚百度了一下,查到 wangke_king 的 Android获取的宽度和高度 中使用的方法是:

  我这里没有亲测过,不过应该是没有问题,但是很遗憾我们的需求是在网络上做测量,所以这个方法也无法使用,不过如果其他有类似本地需求的,不妨尝试一下。而我之前找到的解决方案为:

  首先说明,上述的方法是可以实现的尺寸测量的,只是有一个小小的问题,那就是想要计算出Drawable的宽高,需要必须等到加载完成之后,尝试了使用viewpost(),监听组件加载完成,但是并不是每次都能获取到Drawable的宽高,因此当初的解决方案是写了个两秒钟的定时器,每50毫秒测量一次,直到获取到值为止。这样的解决方案可谓是相当无脑了,而且还要消耗很多不必要的资源。

  还好皇天不负有心人啊,终于找到了通过Glide获取宽高的方式:

  这样我们就可以通过回调,在Glide将网络注入到对应的组件的时候,得到的Bitmap,然后在通过Bitmap来获取的宽高。但是需要注意的一点是,Bitmap的泛型是需要手动去设置的哦。

  另外SimpleTarget现在已经过时,暂时还没有查到。我搜索过SimpleTarget过时使用什么替换,有一些说法是使用BitmapImageViewTarget ,不过下面是实际测试结果。

链接:

百度-景色

测量结果:

信息:

如果不是我使用有误的话,BitmapImageViewTarget 是无法替换SimpleTarget ,实现测量原始宽高的功能的。

我们都知道在onCreate()里面获取控件的高度是0,这是为什么呢我们来看一下示例:

首先我们自己写一个控件,这个控件非常简单:

 

public class MyImageView extends ImageView {

public MyImageView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public MyImageView(Context context) {

super(context);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

superonMeasure(widthMeasureSpec, heightMeasureSpec);

Systemoutprintln("onMeasure 我被调用了"+SystemcurrentTimeMillis());

}

@Override

protected void onDraw(Canvas canvas) {

superonDraw(canvas);

Systemoutprintln("onDraw 我被调用了"+SystemcurrentTimeMillis());

}

}

布局文件:

测试的Activity的onCreate():

@Override

public void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutmain);

Systemoutprintln("执行完毕"+SystemcurrentTimeMillis());

}

现在我们现在来看一下结果:

说明等onCreate方法执行完了,我们定义的控件才会被度量(measure),所以我们在onCreate方法里面通过viewgetHeight()获取控件的高度或者宽度肯定是0,因为它自己还没有被度量,也就是说他自己都不知道自己有多高,而你这时候去获取它的尺寸,肯定是不行的

有如下两种方法可以解决这个问题:

----------------------------------

方法一:使用view的measure方法。

------------------------------

优点:可以立即获得宽和高

缺点:人为的多了一次测量过程

这种方法适用于需要在onCreate完成之前就获得一个view的宽和高的情况。

比如获得一个LinearLayout宽和高

//宽

public int getViewWidth(LinearLayout view){

viewmeasure(LayoutParamsWRAP_CONTENT, LayoutParamsWRAP_CONTENT);

return viewgetMeasuredWidth();

}

//高

public int getViewHeight(LinearLayout view){

viewmeasure(LayoutParamsWRAP_CONTENT, LayoutParamsWRAP_CONTENT);

return viewgetMeasuredHeight();

}

这种方法的原理是直接调用一个view或者viewgroup的measure方法去测量,测量之后该view的getMeasuredHeight()就会返回刚才测量所得的高,getMeasuredWidth返回测量所得宽。本来在布局加载的过程中,view的measure方法一定会被系统调用,但这发生在我们所不知道的某个时间点,为了在这之前提前得到测量结果,我们主动调用measure方法,但是这样做的好处是可以立即获得宽和高,坏处是多了一次测量过程。

至于为什么参数是LayoutParamsWRAP_CONTENT,那是因为我假设这个view的layout_width和layout_height为wrap_content,因为如果为一个确切的值,还有必要测量吗?

-------------------------------------------------------------------

方法二:布局监听类ViewTreeObserver的OnGlobalLayoutListener

-------------------------------------------------------------

当一个view的布局加载完成或者布局发生改变时OnGlobalLayoutListener可以监听到,利用这点我们可以在布局加载完成的瞬间获得一个view的宽高。

int mHeaderViewHeight;

mHeaderViewgetViewTreeObserver()addOnGlobalLayoutListener(

new OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

mHeaderViewHeight = mHeaderViewgetHeight();

getViewTreeObserver()

removeGlobalOnLayoutListener(this);

}

});

这种方法无法像第一种方法那样通过一个函数返回值,因为他是基于listener的,OnGlobalLayoutListener的onGlobalLayout被回调之前是没有值的。由于布局状态可能会发生多次改变,因此OnGlobalLayoutListener的onGlobalLayout可能被回调多次,所以我们在 第一次获得值之后就将listener注销掉。

//设置控件高度为宽度的一半

//screenWidth 为屏幕的宽度

//View为你要设置的控件

//LinearLayoutLayoutParams 为这个控件外部的布局

LinearLayoutLayoutParams layoutParams = (LinearLayoutLayoutParams) ViewgetLayoutParams();

layoutParamsheight = screenWidth / 2;

问题一:js 中怎么获取当前屏幕的宽度 documentdocumentElementclientWidth 这个方法返回页面在当前窗口中可见部分的宽度(不包括滚动条宽度);

windowinnerWidth 这个方法返回页面在当前窗口中可见部分宽度(包括滚动条宽度);

windowouterWidth 返回浏览器窗口自身宽度,包括菜单和边框;

screenwidth 返回设备的(屏幕宽度)

问题二:js网页如何获取手机屏幕宽度 ]@]@]

@sssss

var x = navigator;

var w=windowinnerWidth

|| documentdocumentElementclientWidth

|| documentbodyclientWidth;

var h=windowinnerHeight

|| documentdocumentElementclientHeight

|| documentbodyclientHeight;

documentgetElementById(p1)innerHTML=屏幕分辨率:+screenwidth + + screenheight+内部窗口: + w + + h

不知道是不是这个 屏幕分辨率 :pc上的桌面分辨率 。手机上是 一个型号固定的分辨率比如

华为8813的分辨率是480854。。 内部窗口是 改变窗口大小刷新一下就有新的数据

问题三:用javascript 怎样才能很好的获取手机的屏幕宽度和高度 一般来说在移动浏览器上是拿不到屏幕真实分辨率的,因为页面渲染是在一个叫viewport的页面绘制区域内(说的通俗点就是手机浏览器是用一个虚拟的屏幕来显示网页的)。viewport和屏幕的真实尺寸并不是对应的,如在Safari Mobile中viewport默认宽度(320px)是屏幕真实尺寸(640px)的一半,这里不管是用windowinnerHeight还是windowscreenwidth拿到的都是320px。当然我们可以通过meta设置改变viewport的比例,如initial-scale=5就可以让viewport和屏幕一致的尺寸,但这个比例在不同的手机上并不一定是2倍关系,特别是Android手机,在大屏手机(5寸以上)上这个值是3倍甚至4倍。而且改变viewport比例后可能会导致后续制作中出现一系列问题。所以我认为不要纠结一定要拿到屏幕真实尺寸,就把viewport的尺寸当成屏幕的尺寸进行页面设计和制作肯定是没有问题的。

有一个非常曲线的解决办法,就是:css的媒体查询(@media)是能够检测屏幕尺寸(其实是浏览器窗体的真实尺寸,并不是屏幕的真实物理尺寸,介意的朋友就不要看了)的,通过它来给网页内的某个元素设置一个特殊的属性,然后再用JavaScript来获取这个属性值。当然这样只能获得一个阶梯值(比如480px到540px之间、540px到600px之间等等),不是精确值,所以可能得不偿失,因此我是不推荐的。

问题四:如何获得当前屏幕的高度 windowonload = function(){ 获取屏幕高度 documentdocumentElementclientHeightconsolelog(documentdocumentElementclientHeight); 获取屏幕宽度 documentdocumentElementclientWidthconsolelog(documentdocumentElementclientWidth);}

问题五:html中 如何获取屏幕宽度 把以下这段代码放到之间或之间预览即可看到数据

/将获取的值存到变量里/

width_screen=screenwidth;

height_screen=screenheight;

availWidth_screen=screenavailWidth;

availHeight_screen=screenavailHeight;

colorDepth_screen=screencolorDepth;

/end/

/输出值/

documentwrite(你的屏幕宽为:+width_screen+

你的屏幕高为:+height_screen+

你的屏幕可用宽为:+availWidth_screen+

你的屏幕可用高为:+availHeight_screen+

你的颜色设置所有为数为:+colorDepth_screen);

/end/

问题六:怎么用jquery来获取屏幕的宽度和高速 $(window)width();$(window)height();严格来说,获取window才对

问题七:javascript怎么获取屏幕大小 1

2

3

4

5

6

7

8

9

windowonload = function(){

获取屏幕高度 documentdocumentElementclientHeight

consolelog(documentdocumentElementclientHeight);

获取屏幕宽度 documentdocumentElementclientWidth

consolelog(documentdocumentElementclientWidth);

}

问题八:PHP怎么获取屏幕的宽度与高度? 10分 PHP是无法获取屏幕的高度和宽度的,你可以用JS来获取

Javascript:

网页可见区域宽: documentbodyclientWidth网页可见区域高: documentbodyclientHeight网页可见区域宽: documentbodyoffsetWidth (包括边线的宽)网页可见区域高: documentbodyoffsetHeight (包括边线的高)网页正文全文宽: documentbodyscrollWidth网页正文全文高: documentbodyscrollHeight网页被卷去的高: documentbodyscrollTop网页被卷去的左: documentbodyscrollLeft网页正文部分上: windowscreenTop网页正文部分左: windowscreenLeft屏幕分辨率的高: windowscreenheight屏幕分辨率的宽: windowscreenwidth屏幕可用工作区高度: windowscreenavailHeight屏幕可用工作区宽度: windowscreenavailWidth

JQuery:

$(document)ready(function(){alert($(window)height()); 浏览器当前窗口可视区域高度alert($(document)height()); 浏览器当前窗口文档的高度alert($(documentbody)height());浏览器当前窗口文档body的高度alert($(documentbody)outerHeight(true));浏览器当前窗口文档body的总高度 包括border padding marginalert($(window)width()); 浏览器当前窗口可视区域宽度alert($(document)width());浏览器当前窗口文档对象宽度alert($(documentbody)width());浏览器当前窗口文档body的宽度alert($(documentbody)outerWidth(true));浏览器当前窗口文档body的总宽度 包括border padding margin})

问题九:怎样用 JavaScript 准确获取手机屏幕的宽度和高度 屏幕分辨率的高:windowscreenheight

屏幕分辨率的宽:windowscreenwidth

网页可见区域宽:documentbodyoffsetWidth

网页可见区域高:documentbodyoffsetHeight

问题十:Android开发 怎样获取屏幕的宽高是多少厘米 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸

下面的代码即可获取屏幕的尺寸。

在一个Activity的onCreate方法中,写入如下代码:

[java] view plain copy print

DisplayMetrics metric = new DisplayMetrics();

getWindowManager()getDefaultDisplay()getMetrics(metric);

int width = metricwidthPixels; 屏幕宽度(像素)

int height = metricheightPixels; 屏幕高度(像素)

float density = metricdensity; 屏幕密度(075 / 10 / 15)

int densityDpi = metricdensityDpi; 屏幕密度DPI(120 / 160 / 240)

DisplayMetrics metric = new DisplayMetrics();

getWindowManager()getDefaultDisplay()getMetrics(metric);

int width = metricwidthPixels; 屏幕宽度(像素)

int height = metricheightPixels; 屏幕高度(像素)

float density = metricdensity; 屏幕密度(075 / 10 / 15)

int densityDpi = metricdensityDpi; 屏幕密度DPI(120 / 160 / 240)

但是,需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。比如说,一部240x320像素的低密度手机,如果运行上述代码,获取到的屏幕尺寸是320x427。因此,研究之后发现,若没有设定多分辨率支持的话,Android系统会将240x320的低密度(120)尺寸转换为中等密度(160)对应的尺寸,这样的话就大大影响了程序的编码。所以,需要在工程的AndroidManifestxml文件中,加入supports-screens节点,具体的内容如下:

[html] view plain copy print

>

一个View或ViewGroup中什么什么时候能拿到宽高的值?

width 表示 View 在屏幕上可显示的区域大小;

measuredWidth 表示 View 的实际大小,包括超出屏幕范围外的尺寸;

甚至有这样的公式总结到:

getMeasuredWidth() = visible width + invisible width

getMeasuredWidth() 在执行setMeasuredDimension(一般在onMeasure方法中执行)后才有值;

getWidth()在onLayout方法执行后才有值。

Constructor : 构造方法,View初始化的时候调用,在这里是无法获取其子控件的引用的更加无法获取宽高了

onFinishInflate : 当布局初始化完毕后回调,在这里可以获取所有直接子View的引用,但是无法获取宽高

onMeasure : 当测量控件宽高时回调,当调用了requestLayout()也会回调onMeasure在这里一定可以通过getMeasuredHeight()和getMeasuredWidth()来获取控件的高和宽,但不一定可以通过getHeight()和getWidth()来获取控件宽高,因为getHeight()和getWidth()必须要等onLayout方法回调之后才能确定

onSizeChanged : 当控件的宽高发生变化时回调,和onMeasure一样,一定可以通过getMeasuredHeight()和getMeasuredWidth()来获取控件的高和宽,因为它是在onMeasure方法执行之后和onLayout方法之前回调的

onLayout : 当确定控件的位置时回调,当调用了requestLayout()也会回调onLayout在这里一定可以通过getHeight()和getWidth()获取控件的宽高,同时由于onMeasure方法比onLayout方法先执行,所以在这里也可以通过getMeasuredHeight()和getMeasuredWidth()来获取控件的高和宽

addOnGlobalLayoutListener : 当View的位置确定完后会回调改监听方法,它是紧接着onLayout方法执行而执行的,只要onLayout方法调用了,那么addOnGlobalLayoutListener的监听器就会监听到在这里getMeasuredHeight()和getMeasuredWidth()和getHeight()和getWidth()都可以获取到宽高

onWindowFocusChanged : 当View的焦点发送改变时回调,在这里getMeasuredHeight()和getMeasuredWidth()和getHeight()和getWidth()都可以获取到宽高Activity也可以通过重写该方法来判断当前的焦点是否发送改变了;需要注意的是这里View获取焦点和失去焦点都会回调

(部分内容参考于网络,如有不妥,请联系删除~)

1

WindowManager windowManager = getWindowManager();

Display display = windowManagergetDefaultDisplay();

screenWidth = displaygetWidth();

screenHeight = displaygetHeight();

2

DisplayMetrics dm = new DisplayMetrics();

thisgetWindowManager()getDefaultDisplay()getMetrics(dm);//this指当前activity

screenWidth =dmwidthPixels;

screenHeight =dmheightPixels;

以上两种方法在屏幕未显示的时候,还是处于0的状态,即要在setContentView调用之后才有效。

3

还可以在onDraw中由canvas来获得

screenWidth =canvasgetWidth();

screenHeight =canvasgetHeight();

以上就是关于android 中 获取各种高度,控件,状态栏,底部导航栏全部的内容,包括:android 中 获取各种高度,控件,状态栏,底部导航栏、Android知识点——Glide获取图片宽高、如何正确的获得一个view的宽和高等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://outofmemory.cn/web/9292449.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3