
目前最新的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屏幕配适、版本配适与多语言支持等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)