有两种方式:(获取到的大小准确度与手机的类型有关,google手机你还需要加上底部栏)
1
WindowManager
wm
=
(WindowManager)
getContext()
getSystemService(ContextWINDOW_SERVICE);
int
width
=
wmgetDefaultDisplay()getWidth();
int
height
=
wmgetDefaultDisplay()getHeight();
2
WindowManager
wm
=
thisgetWindowManager();
int
width
=
wmgetDefaultDisplay()getWidth();
int
height
=
wmgetDefaultDisplay()getHeight();
在写前一篇文章 浅述Android Apk打包流程 的时候发现解压后的apk里res的资源文件,有多于我本地项目中的res资源文件夹。
如果我的项目中依赖了Android的一些库,比如design库,design里面有自己的res,那么在打包我的项目的时候,这些res会合并一起打包。
我查看了下,我确实依赖了design等库。
对比一下前三张图,我本地项目没有建anim、anim-v21、animator-v21(不再截图了)等资源文件夹,但是design库有,最终一并打包到我的项目中。
res目录下的文件夹是有命名规则的,不能随便起,为的是要适配不同的设备,而且是要做到最佳的资源匹配。
21、资源标签属性及优先级
除了分辨率外,同种资源之间可以有下面许多资源属性标签,它们在匹配过程中是有优先级顺序的。大家可以快速浏览一下即可。以下资源标签修饰语按照优先级从高到低的顺序排列。
3、Locale(语言和区域)
例如en表示英语,fr表示法语,en-rUS表示英语和美国地区。不区分大小写,r用于区分区域码。
4、Layout Direction(布局方向)
ldrtl,布局方向从右到左(阿拉伯语等会这样布局);ldltr,布局方向从左到右,是默认的隐式值。(这就解答了我前面第二个提的问题了)
5、Smallest Screen Width(最小宽度)
sw<N>dp,屏幕的基本尺寸。
sw320dp:适用于320 320 ldpi、320 480 mdpi、480 480 hdpi
sw600dp:适用于600 1024mdpi (7英寸的平板电脑)
sw720dp:适用于7201280 mdpi (10英寸平板电脑)
当你的屏幕的绝对宽度大于600dp时,屏幕就会自动调用layout-sw600dp文件夹里面的布局。这里的绝对宽度是指手机的实际宽度,即与手机是否横屏没关系,也就是手机较小的边的长度。
6、Screen Width(屏幕宽度)
w<N>dp ,设备的可用宽度值随着当前是横屏还是竖屏会产生变化,即它表示的是当前真实的宽度值。即当手机竖屏时,为较小边的长度;当手机横屏时,为较长边的长度。
7、Screen Height(屏幕高度)
h<N>dp,与lScreen Width的使用一样,只是这里指的是相对的高度。指手机相对放置的高度;即当手机竖屏时,为较长边的长度;当手机横屏时,为较小边的长度。
8、Size(屏幕大小)
samll:低密度,最小布局尺寸为320 426dp
normal:中等密度,标准屏幕最小布局尺寸约为320 470dp
large:中等密度,大屏幕最小布局尺寸为480 640dp
xlarge:大于中等密度,最小布局尺寸为720 960dp。基本用于平板电脑。
该配置并不仅适用于指定设备,如果没有匹配的资源,会选择与之最近的。 如果所有资源均大于当前屏幕的尺寸限定符,则系统不会使用这些资源,且应用运行时会崩溃。
9、Ratio(屏幕纵横比)
long:宽屏
notlong:非宽屏
10、Orientation(屏幕方向)
port:竖向的
land:横向的
square:正方形的(我也不知道这个是什么样子的)
11、UI Mode(UI模式)
无、car、desk、 television、appliance、 watch6种模式。(其实我没看明白是干嘛的,哈哈)
12、Night Mode(夜间模式)
night:夜间模式
notnight:非夜间模式
可以通过UiModeManager来开启和关闭这一功能。
13、Density(屏幕像素密度)
ldpi:低密度,约120dpi;mdpi:中等密度,160dpi;hdpi:高密度,240dpi;xhdpi:超高密度,320dpi;xxhdpi:超超高密度,480dpi;xxxhdpi:超超超高密度,640dpi;nodpi:不希望以匹配设备密度的位图资源;tvdpi:主要用于电视,约213dpi。anydpi:适用于所有密度,优先级高于其他限定符。
14、Touch Screen(触摸屏)
notouch:设备不带触摸屏
stylus:触摸屏通过手写笔 *** 作
finger:触摸屏通过手指 *** 作
15、Keyboard(键盘可用性)
keysexposed:设备有可用键盘。如果当前的软键盘被启用,那么即便设备没有键盘或者键盘不可用,这个状态仍可能有效。
keyshidden:设备有键盘,但当前被隐藏,而且没有软键盘启用。
keyssoft:设备当前软键盘启动,即便它处于可见或不可见状态。
16、Text Input(文本输入法)
nokeys:设备不带用用于文本输入的按键
qwerty:设备具有标准硬键盘(无论是否对用户可见)
12key:设备具有 12 键硬键盘(无论是否对用户可见)
17、Navigation State(定位键可用性)
描述定位键是否可用,指的是光标定位,非GPS导航的定位。
navexposed:定位键对用户可用
navhidden:定位键对用户不可用
18、Navigation Method(主要的非触摸屏定位方式)
nonav:设备除了触摸屏外没有其他定位方式
dpad:设备具有用于导航的方向键
trackball:设备具有用于导航的轨迹球
wheel:设备有方向滚轮用于定位,不常用
19、Dimension(尺寸)
20、Version(平台版本)
设备支持的 API 级别。例如v4 对应于 API 级别 4,带有 Android 16 或更高版本系统的设备。
22、怎么在AS中创建这些文件夹呢?
方法一:隐藏
Android中布局内容被底部系统导航栏遮挡
方法二:内容上移
Android手机底部NavigationBar挡住界面的解决方法
在 Manifestxml 文件中设置 Activity 的属性
Android布局界面隐藏顶部导航栏
Android隐藏和显示虚拟导航栏
Android 获取手机存储总大小,系统占用空间
Android 获取屏幕宽度和高度的几种方法
Android 获取电池相关信息
Android电量计重要的类及函数介绍
安卓50后获取所有运行的进程信息
Android获取内存(RAM)大小信息
android 几种杀进程的方式
Android开发中 获取App缓存大小以及清除缓存
LoopergetMainLooper()使用误区
Android中通过资源文件获取drawable的几种方法
Fragment向Activity传递值
注意:
Android屏幕适配-基础篇
Android屏幕适配-应用篇
从两个大方面阐述一下Android的屏幕适配:
Android推荐使用dp作为尺寸单位来适配UI ,通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。
缺点 :
(1)这种方案只能保证我们写出来的界面适配绝大部分手机,部分手机仍然需要单独适配,但dpi的不同,还是会存在差异。
(2)一般的设计稿都是以px为单位的,所以我们在写layout文件的时候需要将px转为dp,影响开发效率。
为了高效的实现UI开发,出现了新的适配方案,我把它称作宽高限定符适配。简单说,就是穷举市面上所有的Android手机的宽高像素值,设定一个基准的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件:
鸿洋大神的作品 ,使用也超级简单,核心功能就是在绘制的时候在onMeasure里面做变换,重新计算px。
缺点 :我们自定义的控件可能会被影响或限制,可能有些特定的控件(框架没有做适配的控件),需要单独适配。
小结:上述几种适配方案都是实际开发中用过的方案,但随着技术不断的更新,出现了更好的适配方案。
实现原理 :Android会识别屏幕可用高度和宽度的最小尺寸的dp值( 其实就是手机的宽度值 ),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。
sw限定符适配 和 宽高限定符适配 类似,区别在于,前者有很好的容错机制,如果没有value-sw360dp文件夹,系统会向下寻找,比如离360dp最近的只有value-sw350dp,那么Android就会选择value-sw350dp文件夹下面的资源文件。这个特性就完美的解决了上文提到的宽高限定符的容错问题。
优点: 1非常稳定,极低概率出现意外
2不会有任何性能的损耗
3适配范围可自由控制,不会影响其他三方库
缺点 :就是多个dimens文件可能导致apk变大,几百k。
附件: 生成sw文件的工具
实现原理 : 修改系统的density值 (核心)
今日头条适配是以设计图的宽或高进行适配的,适配最终是改变系统density实现的。
过程:
AndroidAutoSize 是基于今日头条适配方案,该开源库已经很大程度上解决了今日头条适配方案的两个缺点,可以对activity,fragment进行取消适配。也是目前我的项目中所使用的适配方案。
使用也非常简单只需两步:
(1)引入:
(2)在 AndroidManifest 中填写全局设计图尺寸 (单位 dp),如果使用副单位,则可以直接填写像素尺寸,不需要再将像素转化为 dp,详情请查看 demo-subunits
公司有一个基于Android的平板产品,在医院中使用。也就是说软件和硬件(平板)都是我们提供给医院的,但是我们是个软件公司,所以平板是我们从设备制造商采购来的。一开始的计划是我们只需要采购同一个型号的设备( 设备A ),所以这个项目几乎不用考虑屏幕适配的问题。但是最近可能公司和设备商没有完全谈拢,我们又换了一批新的设备( 设备B )。设备B从屏幕大小上来看,是和设备A是一模一样的,但是却出现了和设备A差距较大的显示效果
先通过日志打印一下两个设备的屏幕相关信息
设备A 输出结果:
widthPixels: 1280
heightPixels: 737
densityDpi: 210
density: 13125
设备B 输出结果:
widthPixels: 1280
heightPixels: 800
densityDpi: 160
density: 10
这里主要三个不同,分别是 heightPixels 、 densityDpi 、 density ,我们一个个来分析
问题一:heightPixels不同
一开始我是有点困惑的,这个737是什么鬼,两个屏幕明明是一样大的,为什么一个高800,一个高737?
其实, heightPixels 代表的是屏幕有效的高度,就是
>
获取屏幕分辨率的方式如下:
一、在activity中
1、DisplayMetrics dm = getResources()getDisplayMetrics();
int screenWidth = dmwidthPixels;
int screenHeight = dmheightPixels;
2、DisplayMetrics dm = new DisplayMetrics();
thisgetWindowManager()getDefaultDisplay()getMetrics(dm);
int screenWidth = dmwidthPixels;
int screenHeight = dmheightPixels;
二、在service中
DisplayMetrics dm = new DisplayMetrics();
dm = getResources()getDisplayMetrics();
int screenWidth = dmwidthPixels;
int screenHeight = dmheightPixels;
三、在非activity中,传一个Context进来调用
1、public ImageGalleryAdapter(Context c) {
myContext = c;
DisplayMetrics dm = cgetResources()getDisplayMetrics();
int screenWidth = dmwidthPixels;
int screenHeight = dmheightPixels;
}
2、public class BaseTools {
public static int getWindowWidth(Context context){
// 获取屏幕分辨率
WindowManager wm = (WindowManager) (contextgetSystemService(ContextWINDOW_SERVICE));
DisplayMetrics dm = new DisplayMetrics();
wmgetDefaultDisplay()getMetrics(dm);
int mScreenWidth = dmwidthPixels;
return mScreenWidth;
}
public static int getWindowHeigh(Context context){
// 获取屏幕分辨率
WindowManager wm = (WindowManager) (contextgetSystemService(ContextWINDOW_SERVICE));
DisplayMetrics dm = new DisplayMetrics();
wmgetDefaultDisplay()getMetrics(dm);
int mScreenHeigh = dmheightPixels;
return mScreenHeigh;
}
}
以上就是关于android如何获取整个屏幕大小全部的内容,包括:android如何获取整个屏幕大小、Android资源标签属性及优先级(一)、Android知识串讲(1) 底部导航栏遮挡|转屏锁定|ActionBar隐藏等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)