dp和dip到底是不是一回事儿

dp和dip到底是不是一回事儿,第1张

目前最新的SDK是推荐dp这个单位,其实在真正开发过程中,无论是dp还是dip都不怎么会影响到显示效果;第二个问题,你可以在类里面获取屏幕宽度,然后设置这个值就可以了,不知道是否有帮助。

方法/步骤

px: pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。

dp也是dip: device independent pixels(设备独立像素) 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用此单位。

这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480800,但是屏幕密度没有正确设置比如说还是160,那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。

dip的换算:

dip(value)=(int) (px(value)/15 + 05)

举例看来看看,首先在界面上布局两个button,设置两个两个button离左边的举例一个是50dp,一个是50px。

用480800的模拟器来运行。发现这两个按钮离左边屏幕的距离没有差别。

再用270320的模拟器来运行,发现上面的按钮离左边屏幕的距离更近了。

如果用尺子来量,我们能发现px是固定的,距离没有变,而dp则改变了。这样就能看出它们的差别了。

目前主流的屏幕密度:240dpi (480 800px) , 320dpi (7201280px) , 480dpi(10801920px)现在新出的手机几乎全是全高清屏(10801920px)

Android资源目录

mdpi [1倍]160dpi

hdpi [15倍]   240dpi

xhdpi [2倍]   320dpi

xxhdpi [3倍] 480dpi

xxxhdpi [4倍] 640dpi

因此对其他资源的建议是:

a一般采用720 1280的屏幕尺寸设计,这样切图可以直接适配720 1280的机型。

b720 1280下切的图基本可以适配大部分机型。

d适配480 800的机型,只需要把切图 075。

e适配1080 1920 的机型,只需要把切图 150即可。

a以720 1280作为设计标准,画布大小定位720 1280 (以后10801920px做标准亦可,类推)

b只使用偶数单位的尺寸

c尽量只使用 24pt, 28pt , 32pt, 44pt大小的字体

d设计完成之后,所有尺寸的px值除以2作为dp数据交给开发人员

e三份切图,分别是:xhdpi,hdpi,mdpi的资源,如果要切一份就使用xhdpi

栅格系统的最小单位是8dp,一切距离、尺寸都应该是8dp的整数倍,所有可 *** 作元素最小点击区域尺寸为48dp X 48dp。以下是一些常见的尺寸与距离:

有时候在自定义view,draw的时候单位往往是px,要做一个dpi的转换,需要通过该类获取屏幕的信息,如:屏幕密度,宽高等。

a尽量使用线性布局(LinearLayout)和相对布局(RelateLayout),尽量不使用绝对布局(AbsoluteLayout)和帧布局(FrameLayout)。

b尽量使用wrap_content、mach_parent让view自适应或最大化,尽量不要写宽高的值。

c使用线下布局的百分比weight权重时,要把能伸缩方向的宽度写成“0dp“,如果写成wrap_coent会使布局效果不佳等问题。

d尽量使用android的Shape自定义view背景,这样会随之自适应。

eImageView的ScaleType有几种方式:matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY;尽量使用fitCenter按比例扩大至view宽度,能取得较好适配和显示效果。(更多请参考: Android中的ImageView配适 )

f获取屏幕分辨率信息,进行动态适配。(参考第三大点)

a把屏幕设置成单一的横屏或竖屏:

b根据横竖屏加载不同布局(android: screenOrientation="sensor")

通过thisgetResources()getConfiguration()orientation来判断当前是横屏还是竖屏,然后在onCreate方法中加载不同的布局

采用第二种方式要注意的有两点

布局问题:

需要在res目录先建立layout-land和layout-port目录相应的xml文件名字相同,然后在两个文件夹下创建相同名字的两套xml,系统就会根据不同的屏幕来进行自动寻找。

切换时activity的生命周期:

activity生命周期在切换横竖屏会有一些有趣的变化

a不设置activity的android:configChanges时,切换横屏,activity的生命周期会重新调用一次,但是切换竖屏时,生命周期会重新调用两次。

b当设置activity的android:configChanges=“orientation”时,切换横竖屏都会重新调用各生命周期一次。

c当设置activity的android:configChanges=“orientation|keyboardHidden”(大于api13时,需要设为“orientation|screenSize”)时,切换横竖屏不会重新调用各生命周期,只会调用onConfigurationChanged方法。

一般设为b或者c

平板应用的特性:

对于大屏幕的平板8英寸以上(参考ipad mini,现在很多高端手机都是5-6英寸了,8英寸以上视为平板吧),基与平板应用的特性,平板应用开发一般采取如下两种策略

1)兼容模式

采用单activity(或者尽量少activity)+多fragment的结构开发应用,在layout资源文件中创建三套布局:手机布局、平板横屏布局、平板竖屏布局。

优点:

        只需要维护一个app

缺点:

        设计及实现的难度变大,更复杂,有时候需要采取折衷方案

        手机apk上由于含有平板的大分辨率资源(设计上可以减少内置资源)

2)开发另一套只适配平板的app

优点:

        与手机app分离独立。不会因为要兼容而采用一些折衷方案,影响其性能、内存

        设计和实现更加自由

缺点:

        需要维护两套app

目前谷歌推荐第一种方案,但是国内很多应用是采取第二种方案。

可以通过判断sdk的版本(BuildVERSIONSDK_INT),来为能够使用的版本进行个性化设置

例如:沉浸式状态栏配适

在Android系统44以前,状态栏的背景色和字体颜色都是不能改变的。但是44以后Google增加了改变状态栏背景透明的方法。可以通过判断sdk的版本,来为能够使用的版本进行个性化设置:

沉浸式状态栏是Android在50中引入的,在50之前是没有的,并且在Android60中沉浸式状态栏的使用方法和50不一样,因此需要做到版本兼容,针对于不同的Android进行适配,同样也是通过判断BuildVERSIONSDK_INT来区分版本,进行个性化配适

沉浸式状态栏的实现方式有好几种,更多请参考 沉浸式状态栏的实现

原则:内置资源不应该出现文字(如果出现文字需要具备)、所有的文字需要放在res资源目录特定语言目录下。

android app 界面设计是按7201280的,切图上可以点9切图做到所有手机的适配。

状态栏、导航栏和主菜单栏,以7201280的尺寸来设计,那么状态栏的高度应为50px,导航栏的高度96px,主菜单栏的高度96px,因为是开源的系统,这里的数值也只能作为参考。

Android为了区别于IOS,从40开始提出了一套HOLO的UI风格设计风格,鼓励将底部的主菜单栏放到导航栏下面,从而避免点击下方材料误点虚拟按键,很多APP的新版中也采用了这一风格。

扩展资料:

注意事项:

1、通常情况要定位一个Icon只需给出 上/下边距,左/右边距,标注图标距离只需标到可点击范围外

通用型颜色、字体单独标明一份,通用型模块只需单独标明一份,如导航栏。

2、手机可视区域通常为宽度固定,长度超出边界可滑动,所以标注物体宽度时可按比例说明,如果要标注内容上下居中,左右居中,或等比可不标注。

3、当交付的是一张完整时,不需做机型适配,只需给高清图(19201080)即可,注意进行压缩。

4、若图标在不同页面重复出现,且尺寸相差不大,直接给出最大一份切图,并在圆形图标明尺寸,程序会根据需求缩放。

5、当背景是纯色时只需给出色值,Android使用16进制色值。

参考资料来源:百度百科-Android

参考资料来源:百度百科-界面设计

参考资料来源:百度百科-状态栏

参考资料来源:百度百科-导航栏

参考资料来源:百度百科-开源系统

参考资料来源:百度百科-切图

参考资料来源:百度百科-UI设计

在写前一篇文章 浅述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中创建这些文件夹呢?

在实际工作中,我们经常需要在程序里面用代码来控制一些组件的宽度和高度,以适应不同分辨率的屏幕。尽管有不同的Layout供我们使用,但很多时候需要通过用代码设定组件的大小,以达到良好的界面视觉效果。

注意:组件和控件是有区别的。组件对应的英文是component,控件对应的英文是control;控件是带有界面的,组件则未必有界面;控件属于组件,可以说它是带有界面的组件。比如Button有界面,因此可以说它是控件,也可以说它是组件。LinearLayout没有界面,因此它不能算是控件,但它却是组件。本文中由于涉及了带有和不带有界面的组件,因此,用组件泛指这两者。

有些组件,比如Button,可以在程序中用setWidth和setHeight来设定其大小,这是非常方便的。但有些组件却没有这两个设定大小的方法,比如ImageButton、Spinner以及LinearLayout等等,那么如何在程序中根据需要,动态地设定他们的大小呢?下面就用实际的例子来说明这个问题。

1 首先创建一个Android项目:

2 将文件magnifierpng拖入到项目的res/drawable-mdpi文件夹下。mangifierpng的内容如下:

3 在stringsxml中,增加如下粗体字代码。这些代码,将会被Spinner使用:

<string name="spin_prompt">请选择城市 </string>

<string-array name="cities">

<item>北京 </item >

<item>上海 </item >

<item>南京 </item >

<item>乌鲁木齐 </item>

<item>哈尔滨 </item>

<item>符拉迪沃斯托克 </item>

</string-array>

4 修改mainxml,使之如下:

<xml version="10"encoding="utf-8">

<LinearLayoutxmlns:android="/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<Buttonandroid:id="@+id/btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/hello"

/>

<ImageButtonandroid:id="@+id/image_btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/magnifier"

/>

<Spinnerandroid:id="@+id/sp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:entries="@array/cities"

android:prompt="@string/spin_prompt"

/>

<LinearLayout

android:orientation="horizontal"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

>

<LinearLayoutandroid:id="@+id/ll_left"

android:orientation="horizontal"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:gravity="left"

>

<EditText

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello"

/>

</LinearLayout>

<LinearLayoutandroid:id="@+id/ll_right"

android:orientation="horizontal"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:gravity="right"

>

<EditText

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Android"

/>

</LinearLayout>

</LinearLayout>

</LinearLayout>

不难看出,mainxml有一个Button,一个ImageButton,一个Spinner和两个EditText。

5 运行本项目,得到的结果如下:

现在假定,我们要:

a) 增加Button的高度

b) 增加ImageButton的宽度和高度

c) 增加Spinner的宽度

d) 将包含Hello的EditText靠左,包含Android的EditText靠右

6 修改AdjustControlSizejava的代码,使之如下:

public class AdjustControlSize extends Activity

{

private Button btn;

private ImageButton imagebtn;

private Spinner sp;

private LinearLayout ll_left;

private LinearLayout ll_right;

private DisplayMetrics dm;

@Override

public void onCreate(Bundle savedInstanceState)

{

superonCreate(savedInstanceState);

setContentView(Rlayoutmain);

// 获取屏幕尺寸

dm = new DisplayMetrics();

getWindowManager()getDefaultDisplay()getMetrics(dm);

btn = (Button)findViewById(Ridbtn);

imagebtn = (ImageButton)findViewById(Ridimage_btn);

sp =(Spinner)findViewById(Ridsp);

ll_left = (LinearLayout)findViewById(Ridll_left);

ll_right = (LinearLayout)findViewById(Ridll_right);

// 增加Button的高度,可以很方面地通过setHeight方法来实现。

btnsetHeight(80);

// 但如果要想在代码中改变某些组件,比如ImageButton、Spinner以及LinearLayout,

// 用setHeight或者setWidth的方式就不行了,因为这些组件中,没有提供这两个方法。

// 为此,可以通过LayoutParams这个类(这里我们用LinearLayoutLayoutParams)来实现这一点。

// 改变imagebtn的宽度和高度均为屏幕宽度的1/4

LinearLayoutLayoutParams imagebtn_params = newLinearLayoutLayoutParams(

LayoutParamsWRAP_CONTENT, LayoutParamsWRAP_CONTENT);

imagebtn_paramsheight = dmwidthPixels / 4;

imagebtn_paramswidth = dmwidthPixels / 4;

imagebtnsetLayoutParams(imagebtn_params);

// 设定sp的宽度为屏幕宽度的2/3

LinearLayoutLayoutParams sp_params = new LinearLayoutLayoutParams(

LayoutParamsWRAP_CONTENT, LayoutParamsWRAP_CONTENT);

sp_paramswidth = dmwidthPixels 2 / 3;

spsetLayoutParams(sp_params);

// 让两个EditText分别处于屏幕的左右两端。

// 在mainxml中,两个EditText分别处于ll_left和ll_right这两个LinearLayout中,且

// 处于ll_left的gravity属性为left,即置于其中的组件靠左;处于ll_right的gravity

// 属性为right,即置于其中的组件靠右。但是由于这两个LinearLayout的宽度属性均为

// wrap_content,所以它们靠在一起了,由此导致了两个EditText也靠在一起。

// 如果,我们把ll_left和ll_right的宽度能够设定为屏幕宽度的一半,那么两个EditText就

// 会分别处于屏幕的两端。

LinearLayoutLayoutParams ll_params = new LinearLayoutLayoutParams(

LayoutParamsWRAP_CONTENT, LayoutParamsWRAP_CONTENT);

ll_paramswidth = dmwidthPixels / 2;

ll_leftsetLayoutParams(ll_params);

ll_rightsetLayoutParams(ll_params);

}

}

imageView不是有长宽的属性么

android:layout_width="fill_parent"宽设成填满

android:layout_height="wrap_content"长设为适应

以上就是关于dp和dip到底是不是一回事儿全部的内容,包括:dp和dip到底是不是一回事儿、图解android开发中dp和px的区别、Android屏幕配适、版本配适与多语言支持等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/10150050.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存