Android 的机型适配: 屏幕适配(包括dpi,dp,sp的概念) 版本适配 硬件适配。 以及如何和美工配合

机型适配:
作用是使应用程序能够在广泛的软件系统和硬件平台上都可以正常的稳定的运行
操作系统的版本的适配。API
android 上面的手表,平板电脑,
所有做客户端的必须要做机型适配

机型适配的要求:
匹配,合适,正常,稳定。
需求:
1:支持Android2.1以上的版本,V7包
2:支持手机和平板电脑,屏幕适配
3:为阿拉伯国家提供软件,阿拉伯国家的文字为从右向左
4:为中国移动提供软件,wmwap
5:需要做一个拍照软件,前置摄像头,后置摄像头
6:发布到各种软件市场,小米市场上,软件的扉页必须要有小米的标志




如何进行机型适配(主要讲解屏幕适配)


进行机型适配,主要是在res目录
1:图片适配屏幕DPI
2:界面横竖切换适配
3:屏幕宽度高度大小适配
4:语言适配


res文件夹的命名规则:
resource name-修饰符
mipmap-xhdpi
values-zh




选择竖屏:
右键res,选择directory
resoure type 选择layout
选择下面的Orientation 》》
选择Screen orientation
选择Land。。
就会有一个文件夹values-land




android 优先选择运营商,国外的手机在中国可能默认的就是英文的。
 
values/strings.xml
values-zh/strings.xml
values-zh_rTW/strings.xml  r代表region




屏幕适配:


Android 提供了自动的设备检测功能,能够根据当前设备,自动的使用合适的图片。
-------------------------------------------------------------------------------------------------------
重点:美工给我们几套图。
答:可以直接给一个xhdpi的图片和一个xxxhdpi的图片,或者所有的图片都给出来。前提是我们自己计算一下尺寸大小。
-------------------------------------------------------------------------------------------------------
例如红米2手机分辨率是720*1280,尺寸大概是2.3英寸*4英寸的,那么dpi 就是xhdpi就是320,
那么如果我现在有一张图片在这个上面显示的是。宽度的3分之一,高度的四分之一,
那么这个xhdpi图的大小是240px*220px。
那么我会在要一个xxxhdpi的就是480*440的图片。
------------------------------------------------------------------------------------------------------
之前是160px是标准的
但是我们开发的时候还是要以320px的为基准比较好。也就是说以手机尺寸为720*1280的为基准的,例如红米2
------------------------------------------------------------------------------------------------------
那么屏幕的dp到底多少呢?


例如红米的屏幕分辨720*1280  dpi为2,
屏幕的dp大小为:360dp*640dp这个就是屏幕的dp. 这个其实也就是正常的屏幕的dp值了吧。


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




美工在出图的时候是按照像素单位来出图的。
dpi:每一个手机,都有自己的硬件的屏幕参数dpi,
一英寸能够显示多少像素。一英寸是多少呢?1英寸(in)=2.54厘米(cm),最简单就是一寸照片的底部就是一寸长的。


通常第三个适配的时候,设计不同的dpi的图片,例如
100px,240px,两张图片。名字都一样放在不同的mipmap或者是drawable下面


dp虚拟的单位:dp以dpi为参数的单位,
公式:1dp=多少个px?    px=(dpi/160)*dp


那么5dp=?px 例如mdpi=160, 5dp-> (160/160)*5=5px
             例如hdpi=240   5dp-》(240/160)*5dp=7.5px;
    例如xhdpi=320  5dp-> (320/160)*5dp=10px;


总屏幕大小是多少dp呢?
------------------------------------------------------------------------------------------------------
那么屏幕的dp到底多少呢?


例如红米的屏幕分辨720*1280  dpi为2,
屏幕的dp大小为:360dp*640dp这个就是屏幕的dp.
但是不同的机器的 屏幕的dp值也不一样,例如红米的2的变成了更大的尺寸,但是屏幕的分辨率,没有变的话,那么dp就不会变。如果,尺寸没变,但是分辨率变大了,那么dp就会变化。
dp=(dpi/160)px


在xml里面预览的左上角:有一个文件标志下面有一个机器人的,
点击后选择 Preview reprentation Sample
可以查看相同的dp值在不同的手机上面的变化。


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


注意在代码中如果没有标示就都是px的。
----------------------------------------


标准是以mdpi为一准


ldpi 120   0.75x
mdpi 160   1x 最早的手机160个像素一英寸。
hdpi 240   1.5x
xhdpi 320   2x
xxHDPI 480  3x
xxxHDPI 640 4X


现在软件的切换都建议采用xhdpi进行设计,然后其余的进行缩放
采用高清大图来进行设计,切图进缩放,




Pure Android
Devices and Displays
==============================================================
关于hdpi:
1:在不同的dpi目录,设置同名的图片,根据缩放比例,
进行图片尺寸的设置。在小尺寸的手机上,显示的内容尽量调整清晰。
在大尺寸图片上面,调整图片的细节,让图片显示的内容更多,


2:相当于程序能够同时支持 普通手机和高清版;


3:因为android系统如果没有设置小屏幕(低dpi的图片)的图片的画,
那么Android 就会把大图进行缩小,这个是可以的。匹配低密度的手机


如果一个图片只有xhdpi的版本,那么在小手机上面自动缩小,这个是不会影响效率
如果一张hdpi的图片,运行在高密度的手机上面,例如xxxhdpi手机上面,那么这张图片就会自动的进行放大。就会失帧了。
因此建议准备多套图片,适配各种密度,


---------------------------------------------------------------
---------------------------------------------------------------
那么我们就是要先计算出mdpi的尺寸然后和美工要这几个版本的。提供尺寸的大小。
或者直接要一个xxxhdpi的。


一般是要以xhdpi的图片,以这个为基准去做要图。
大图往小图缩小细节就没有了。




如果设置ImageView 设置
width=100dp
height=100dp


在不同的手机和屏幕上面显示所在屏幕的百分比不一样


Android 尺寸适配+++++++++++++++++++++++++++++++++++++++
1:Android 控件,布局对于尺寸,如果在布局中固定设置xxxdp数值,在不同的手机上,虽然能够缩放
但是和我们的预期的设置会有差别;
2:如果能够使用wrap_content,match_parent,那么尽量使用,这样避免了实际的数字
3:尽量使用权重layout_weight,
4:如果需要使用固定的数值;那么需要正对数值进行适配。那么需要根据手机的屏幕尺寸,进行不同的适配将尺寸定义成一个资源。
让android 系统,自己去进行不同的


android 空间必须是dp,字体必须是sp,因为这样可以自动的适配


在尺寸资源100dp这里alt+回车


在res 里新建新的资源目录
 选择size
选择small
最后创建出来一个values-small
然后依次创建normal,larget,xlarge




+++++++++++++++++++++++++++++++++++++++
Android 3.0以后觉得large这些划分太麻烦了
Android
1:提出了根据屏幕尺寸进行适配的方式;
2:新的适配采用dp单位的宽高进行适配;
3:w<N>dp h<N>dp sw<N>dp 格式的修饰符,来适配屏幕的宽高,如果有一个w411dp资源,
当手机的屏幕小于这个尺寸的时候;411设置的是最低数值了,那么手机依然会使用w411dp适配的资源


w:128dp 适配411dp资源
w:500dp 适配533 资源
-------------------------------------------
100dp                   411dp        533dp


+++++++++++++++++++++++++++++++++++++++++++++
关于w<数值>dp  h<数值>dp
+++++++++++++++++++++++++++++++++++++++++++++
切换屏幕的时候,要注意了
1:关于w,h修饰符,随着设备的旋转,高度,宽度会交换,
这种情况下,将会影响适配情况。
2:通常如果只关注,最小宽度的情况
例如,给电视配置:
使用最短边适配会更好;也就是sw<数值>dp
sw代表屏幕硬件上面短的边的数值适配,就不会出现宽高交换的问题
也就是类似于values-sw600dp












最短边,sw的应用:
根据实际的dp来进行
values 里面出现了values-w820dp
<resources>
    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
         (such as screen margins) for screens with more than 820dp of available width. This
         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
    <dimen name="activity_horizontal_margin">64dp</dimen>
</resources>




==============================================================
    //通过API获取屏幕宽度,高度,dp数值
        WindowManager windowManager = getWindowManager();
        //获取的显示屏
        Display defaultDisplay = windowManager.getDefaultDisplay();
        //获取屏幕的测量信息,包括屏幕的宽高信息;
        DisplayMetrics outMetrics = new DisplayMetrics();
        //还能获取手机的dpi到底是多少,
        defaultDisplay.getMetrics(outMetrics);
        //手机DPI
        int densityDpi = outMetrics.densityDpi;
        //宽高的实际像素
        int widthPixels = outMetrics.widthPixels;
        int heightPixels = outMetrics.heightPixels;


        //px=(dpi/150)*dp
        //scaledDensity=(dpi/150)
        float scaledDensity = outMetrics.scaledDensity;


        //宽度dp,高度dp
        float wDp = widthPixels / scaledDensity;
        float hDp = heightPixels / scaledDensity;


        Log.d("151226MY","densityDpi="+densityDpi);
        Log.d("151226MY","width="+widthPixels);
        Log.d("151226MY","height="+heightPixels);
        Log.d("151226MY","scaleDensity="+scaledDensity);
        Log.d("151226MY","wdp="+wDp);
        Log.d("151226MY","hDp="+hDp);
    }


12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: densityDpi=320
12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: width=720
12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: height=1280
12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: scaleDensity=2.0
12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: wdp=360.0
12-26 16:53:02.297 10471-10471/com.kodulf.adapte D/151226MY: hDp=640.0


12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: densityDpi=240
12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: width=480
12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: height=800
12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: scaleDensity=1.5
12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: wdp=320.0
12-26 16:58:38.712 21315-21315/com.kodulf.adapte D/151226MY: hDp=533.3333


d->density 密度


右键res 
目录
ScreenWidth
输入360
会得到values-w360dp的文件夹


新建strings


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="width_info">360</string>
</resources>




新建dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="new_image_size">120dp</dimen>
</resources>


+++++++++++++++++++++++++++++++++++++++++++
开发过程中是否用权重更多呢?
?????????????????????????
++++++++++++++++++++++++++++++++++++++++++++++
Android 版本的适配:
1:使用Android support 包,实现高版本API的兼容;
ActionBar就是v7包的,Fragment 是v4包
2:通常由于采用一些新的API兼容包,那么软件最低支持Android 2.1就是API7
3:确认软件最低支持版本的时候,需要分析使用API最低支持到那个版本;


例如如果设置最低的版本是9
现在设置一个
Button btn=null;
btn.setX(34);


Develpe-》Reference-》API level




版本适配:
1:确定最低版本,不要调用最低版本以上的任何代码
2:如果调用的高版本方法,有对应的低版本的代替
例如View.setX()高版本,可以使用View.setLeft+View.setRight()这种低版本方法,代替
那么就可以通过代码来进行倒台的适配;
android.os.Build 这个类,就可以获取当前手机的各种信息,包括version
Button btn=null;
if(Build.VERSION.SDK_INT>=11){
btn.setX(34);
}else{
Toast.....("您的手机不支持。。。")
}




=========================================================================
硬件适配:
1:只有在清单文件会有这个要求,应用市场里里面,我们的清单文件会有作用的
应用市场软件需要使用那些硬件,在清单文件声明;是否是必须的;


2:应用市场会根据手机的特性,显示对应的软件,根据清单文件,过滤不支持的程序。
Trainning->Supporting Different Devices


<uses-feature android:name="android.hardware.camera" android:required="true"/>






Android 开发的
http://developer.android.com/guide/practices/screens_support.html
http://developer.android.com/design/style/devices-displays.html


屏幕适配,
先要了解什么是dp,dpi,sp
dpi是dot per inch,每英寸多少个点。一英寸是多少呢?1英寸(in)=2.54厘米(cm),最简单就是一寸照片的底部就是一寸长的。
  正常的USB的接口长度是13.4,也就是说usb接口长度大概略大于0.5英寸。
  红米手机2的机身尺寸为134×67.2×9.4mm,长度为下部的宽度也就是2.6英寸,分辨率为720x1280,按照这个说,dpi应该是300左右。  
 红米手机的px 大概= dp*(320/160)=2dp.
而三星手机,480*640的分辨率,下面大概是2.4英寸长度,那么也就是说dpi应该是200左右。
三星手机的px 大概是dp*(200/160)=1.25dp.


px = dp * (dpi / 160)


The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a "medium" density screen






Density-independent pixel (dp)
A virtual pixel unit that you should use when defining UI layout, to express layout dimensions or position in a density-independent way.
The density-independent pixel is equivalent to one physical pixel on a 160 dpi screen, which is the baseline density assumed by the system for a "medium" density screen. At runtime, the system transparently handles any scaling of the dp units, as necessary, based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels. You should always use dp units when defining your application's UI, to ensure proper display of your UI on screens with different densities.


A set of six generalized densities:
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi



你可能感兴趣的:(dp,SP,dpi,千雅爸爸,android机型适配)