以编程方式检测7英寸和10英寸的平板电脑
有没有办法以编程方式查找应用程序安装在设备上的是7英寸平板电脑还是10英寸平板电脑?
您可以使用DisplayMetrics
获取有关您的应用程序正在运行的屏幕的大量信息。
首先,我们创build一个DisplayMetrics
指标对象:
DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics);
从这里,我们可以得到所需的信息来确定显示的大小:
int widthPixels = metrics.widthPixels; int heightPixels = metrics.heightPixels;
这将返回的宽度和高度的像素的绝对值,所以1280×720为Galaxy SIII,Galaxy Nexus等
这通常不会有帮助,因为当我们在Android设备上工作时,我们通常更喜欢在密度独立的像素下工作。
您可以再次使用metrics
获取屏幕density
,以设备的比例因子的forms显示,该设备基于Androiddevise资源(针对mdpi
, hdpi
等)。
float scaleFactor = metrics.density;
从这个结果中,我们可以计算出一定高度或宽度的独立像素密度的大小。
float widthDp = widthPixels / scaleFactor float heightDp = heightPixels / scaleFactor
从这里得到的结果将帮助您决定使用何种types的屏幕,以及Androidconfiguration示例 ,这些示例为您提供了每种屏幕大小的相对dp:
- 320dp:一个典型的手机屏幕(240×320 ldpi,320×480 mdpi,480×800 hdpi等)。
- 480dp:像Streak(480×800 mdpi)这样的微型平板电脑。
- 600dp:7寸平板电脑(600×1024 mdpi)。
- 720dp:10“平板电脑(720×1280 mdpi,800×1280 mdpi等)。
使用以上信息,我们知道如果设备的最小宽度大于600dp,则设备是7“平板电脑,如果设备大于720dp,则设备是10”平板电脑。
我们可以使用Math
类的min
函数计算出最小的宽度,传递heightDp
和widthDp
来返回smallestWidth
的widthDp
。
float smallestWidth = Math.min(widthDp, heightDp); if (smallestWidth > 720) { //Device is a 10" tablet } else if (smallestWidth > 600) { //Device is a 7" tablet }
然而,这并不总是给你一个精确的匹配,尤其是当使用暗淡的平板电脑,可能会错误地将其密度表示为hdpi,否则可能只有800 x 480像素,但仍然在7“屏幕上。
除了这些方法之外,如果您需要知道以英寸为单位的设备的确切尺寸,那么也可以使用metrics
方法计算每英寸屏幕上有多less像素。
float widthDpi = metrics.xdpi; float heightDpi = metrics.ydpi;
您可以使用有关每英寸设备中有多less像素以及总共像素数量来了解设备有多less英寸的知识。
float widthInches = widthPixels / widthDpi; float heightInches = heightPixels / heightDpi;
这将以英寸返回设备的高度和宽度。 这又不一定有助于确定它是什么types的设备,因为设备的广告尺寸是对angular线,我们只有高度和宽度。
然而,我们也知道,考虑到三angular形的高度和宽度,我们可以使用毕达哥拉斯定理来计算斜边的长度(在这种情况下,屏幕对angular线的大小)。
//a² + b² = c² //The size of the diagonal in inches is equal to the square root of the height in inches squared plus the width in inches squared. double diagonalInches = Math.sqrt( (widthInches * widthInches) + (heightInches * heightInches));
由此,我们可以确定设备是否是平板电脑:
if (diagonalInches >= 10) { //Device is a 10" tablet } else if (diagonalInches >= 7) { //Device is a 7" tablet }
这就是你如何计算你正在使用什么样的设备。
没有什么说7"
或10"
AFAIK。 获取屏幕尺寸大致有两种方法,系统在解码位图时使用屏幕尺寸。 它们都可以在Context
find的应用程序的Resources
对象中find。
第一个是可以通过getContext().getResources().getConfiguration()
获得的Configuration
对象。 在这里你有:
Configuration#densityDpi
– 正在渲染的目标屏幕密度,对应于密度资源限定符。
Configuration#screenHeightDp
– 可用屏幕空间的当前高度,以dp为单位,对应于屏幕高度资源限定符。
Configuration#screenWidthDp
– 可用屏幕空间的当前宽度(以dp为单位),对应于屏幕宽度资源限定符。
Configuration#smallestScreenWidthDp
– 应用程序在正常操作中将看到的最小屏幕尺寸,对应于最小屏幕宽度资源限定符。
有了这个,你几乎可以使用屏幕准则来确定你的设备是否从相应的专用资源文件夹( hdpi
, xhdpi
, large
, xlarge
等)中xlarge
。
请记住,这些是一些桶:
- xlarge屏幕至less960dp x 720dp
- 大屏幕至less640dp x 480dp
- 正常屏幕至less为470dp x 320dp
-
小屏幕至less426dp x 320dp
-
320dp:一个典型的手机屏幕(240×320 ldpi,320×480 mdpi,480×800 hdpi等)。
- 480dp:像Streak(480×800 mdpi)这样的微型平板电脑。
- 600dp:7寸平板电脑(600×1024 mdpi)。
- 720dp:10“平板电脑(720×1280 mdpi,800×1280 mdpi等)。
更多信息
第二个是通过getContext().getResources().getDisplayMetrics()
获得的DisplayMetrics
对象。 在那你有:
DisplayMetrics#density
– 显示的逻辑密度。
DisplayMetrics#densityDpi
– 以每英寸点数表示的屏幕密度。
DisplayMetrics#heightPixels
– 显示的绝对高度(以像素为单位)。
DisplayMetrics#widthPixels
– 以像素为单位的显示的绝对宽度。
DisplayMetrics#xdpi
– X维度中每英寸屏幕的确切物理像素。
DisplayMetrics#ydpi
– Y维中每英寸屏幕的确切物理像素。
如果您需要精确的屏幕像素数而不是密度,这很方便。 但是,需要注意的是,这是所有屏幕的像素。 不只是可用的你。
将这个方法放在onResume()中并且可以检查。
public double tabletSize() { double size = 0; try { // Compute screen size DisplayMetrics dm = context.getResources().getDisplayMetrics(); float screenWidth = dm.widthPixels / dm.xdpi; float screenHeight = dm.heightPixels / dm.ydpi; size = Math.sqrt(Math.pow(screenWidth, 2) + Math.pow(screenHeight, 2)); } catch(Throwable t) { } return size; }
一般在6英寸尺寸后开始片剂开始。
伟大的信息,正是我所期待的! 然而,在尝试了这个之后,我发现在使用这里提到的指标时,Nexus 7(2012型号)报告的维度为1280×736。 我也有一个运行Jelly Bean的摩托罗拉Xoom,它错误地报告了1280×752的分辨率。 我偶然发现了这个证实这一点的post。 基本上,在ICS / JB中,使用上述度量的计算似乎排除了导航栏的尺寸。 一些更多的研究使我得到了Frank Nguyen在这里的答案,它使用了不同的方法来给出屏幕的原始(或实际)像素尺寸。 我最初的testing显示,Frank correclty的以下代码报告了Nexus 7(2012型号runnin JB)和我的Motorola Xoom运行JB的尺寸:
int width = 0, height = 0; final DisplayMetrics metrics = new DisplayMetrics(); Display display = getWindowManager().getDefaultDisplay(); Method mGetRawH = null, mGetRawW = null; try { // For JellyBeans and onward if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { display.getRealMetrics(metrics); width = metrics.widthPixels; height = metrics.heightPixels; } else { mGetRawH = Display.class.getMethod("getRawHeight"); mGetRawW = Display.class.getMethod("getRawWidth"); try { width = (Integer) mGetRawW.invoke(display); height = (Integer) mGetRawH.invoke(display); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } catch (NoSuchMethodException e3) { e3.printStackTrace(); }
上述function在切换人像与风景时并不总是奏效。
如果您的目标是API级别13+,则很容易,如上所述 – 使用Configuration.smallestScreenWidthDp,然后进行相应的testing:
resources.getConfiguration().smallestScreenWidthDp
否则,如果你能负担得起,使用下面的方法,这是一个非常准确的方法来检测600dp(如6“)与720dp(如10”),让系统告诉你:
1)添加到layout-sw600dp和layout-sw720dp(以及可能的情况下),使用正确的ID显示不可见视图,例如:
对于720,在布局sw720dp:
<View android:id="@+id/sw720" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/>
对于600,在layout-sw600dp上:
<View android:id="@+id/sw600" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/>
2)然后在代码,例如,活动,相应的testing:
private void showFragment() { View v600 = (View) findViewById(R.id.sw600); View v720 = (View) findViewById(R.id.sw720); if (v600 != null || v720 !=null) albumFrag = AlbumGridViewFragment.newInstance(albumRefresh); else albumFrag = AlbumListViewFragment.newInstance(albumRefresh); getSupportFragmentManager() .beginTransaction() .replace(R.id.view_container, albumFrag) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .commit(); }
我有两个具有相同分辨率的Android设备
设备1 – >分辨率480×800对angular线屏幕尺寸 – > 4.7英寸
设备2 – >分辨率480×800对angular线屏幕尺寸 – > 4.0英寸
它同时提供设备对angular线屏幕尺寸 – > 5.8
解决您的问题是..
DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int width=dm.widthPixels; int height=dm.heightPixels; int dens=dm.densityDpi; double wi=(double)width/(double)dens; double hi=(double)height/(double)dens; double x = Math.pow(wi,2); double y = Math.pow(hi,2); double screenInches = Math.sqrt(x+y);
在这里看到细节 ..
您可以使用下面的方法来获取以英寸为单位的屏幕尺寸,基于这一点,您可以简单地检查设备是哪个平板电脑或手机。
private static double checkDimension(Context context) { WindowManager windowManager = ((Activity)context).getWindowManager(); Display display = windowManager.getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); display.getMetrics(displayMetrics); // since SDK_INT = 1; int mWidthPixels = displayMetrics.widthPixels; int mHeightPixels = displayMetrics.heightPixels; // includes window decorations (statusbar bar/menu bar) try { Point realSize = new Point(); Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize); mWidthPixels = realSize.x; mHeightPixels = realSize.y; } catch (Exception ignored) {} DisplayMetrics dm = new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(dm); double x = Math.pow(mWidthPixels/dm.xdpi,2); double y = Math.pow(mHeightPixels/dm.ydpi,2); double screenInches = Math.sqrt(x+y); Log.d("debug","Screen inches : " + screenInches); return screenInches; }
您将不得不使用DisplayMetrics类给出的数据进行一些计算。
你有heightPixel和widthPixels(屏幕分辨率,以像素为单位)
您需要对angular线,因为“英寸屏幕尺寸”总是描述对angular线的长度。 你可以得到像素的屏幕对angular线(使用pythagore)
diagonalPixel =√(heightPixel²+widthPixels²)
那么您可以将像素值转换为英寸感谢densityDPI值:
inchDiag =对angular线像素/密度DPI。
我希望我在这里没有犯错误,要知道从DisplayMetrics类中得到的值是由构造函数给出的,它显示(在极less数情况下),它们根据物理材料不能很好地设置。
这将给你物理屏幕的大小,但它可能不是更好的方式来pipe理多个布局。 更多关于这个话题
他们指定屏幕尺寸的方式是通过四种广义尺寸: 小 , 正常 , 大和xlarge 。
Android 文档指出大小组已被弃用
…这些尺寸组不赞成使用基于可用屏幕宽度pipe理屏幕尺寸的新技术。 如果您正在开发Android 3.2及更高版本,请参阅[为Android 3.2声明平板布局](hdpi(high)〜240dpi)以获取更多信息。
一般来说,大小限定符large指定一个7“平板电脑,而xlarge的大小限定符指定一个10”平板电脑:
关于触发大小限定符的好处在于,您可以保证您的资产和代码在要使用的资源或代码path上达成一致。
要在代码中检索大小限定符,请进行以下调用:
int sizeLarge = SCREENLAYOUT_SIZE_LARGE // For 7" tablet boolean is7InchTablet = context.getResources().getConfiguration() .isLayoutSizeAtLeast(sizeLarge); int sizeXLarge = SCREENLAYOUT_SIZE_XLARGE // For 10" tablet boolean is10InchTablet = context.getResources().getConfiguration() .isLayoutSizeAtLeast(sizeXLarge);
其他方式:
-
创build另外2个文件夹:values-large + values-xlarge
-
把:
<string name="screentype">LARGE</string>
放入values-large文件夹(strings.xml) -
在值-xlarge文件夹(strings.xml)中input:
<string name="screentype">XLARGE</string>
-
在代码中:
String mType = getString(R.string.screentype);
if(mType!= null && mType.equals(“LARGE”){
//从4〜7英寸
} else if(mType!= null && mType.equals(“XLARGE”){
//从7〜10英寸
}
我存储的值文件夹中的值 ,使我的屏幕是7英寸或10公司,但我们可以做任何设备使用值文件夹。
像为不同的2设备创build不同的2值文件夹。 但这件事情取决于要求。