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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Rodulf/article/details/50411999

最重要的适配就是尺寸适配,我们可以有两种方案:


第一种方案,以某一个尺寸,例如1920*1080为基准的,在文件中修改 http://blog.csdn.net/lmj623565791/article/details/45460089
        int baseW = 1080;
        int baseH = 1920;
然后生成相应的其他的尺寸的dimen文件
这种的优点就是:可以直接根据美工的图来输入相应的数字就好了,然后一切都会自动的计算好的,当然美工的图的尺寸和我们的基准尺寸要是一样的
缺点就是有一些没有考虑到的尺寸会有一点问题,软件会较大


第二种方案,百分比的利用。http://blog.csdn.net/lmj623565791/article/details/46695347
这个方法很完美,可以解决上面没有考虑到尺寸的问题,还有软件较大的问题。
缺点:但是需要自己计算一次比例。


第三种方案,就是两者相结合。


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




屏幕像素密度
屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写。
一英寸是2.54cm就是一英寸的照片的对角线。像我们的收银机就有xdpi ydpi就是横竖的dpi是不同的。

记住一个点就是dp 是密度无关的。

dip和dp是一个意思,都是Density Independent Pixels的缩写,即密度无关像素,上面我们说过,dpi是屏幕像素密度,假如一英寸里面有160个像素,这个屏幕的像素密度就是160dpi,那么在这种情况下,dp和px如何换算呢?在Android中,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px,以此类推。


最关键的就是图片适配和尺寸适配,
图片适配,我们一般是,其实就是5张图片。

mdpi就是1倍	160dpi		480*320		2*2
hdpi就是1.5倍	240dpi		800*480		3*3	小手机
xhdpi就是2倍	320dpi		1280*720P	4*4
xxhdpi就是3倍	480dpi		1920*1080P 	6*6	大手机
xxxhdpi就是4倍	640dpi		2k的屏幕的适配	8*8




规则是,如果241dpi,那么就调用320dpi的图片来做。


我们可以按照手机屏幕的标准把800×480理解为hdpi,480×320为mdpi,320×240为ldpi,根据最新的数据显示,Android所有手机中hdpi和mdpi占

有九成以上的比例;还有1280×720、1920×1080等高分辨率的android手机界面。


尽量使用wrap_content match_parent 和权重,如果要用那么就是使用宽度适配的方式


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
尺寸适配,现在一般都是使用的,使用了权重以后,可以使用百分比来进行适配。
最小边适配,宽度适配,高度适配。
在弘扬的博客中,也有将px进行转换的一些操作。
w511dp 就是宽度适配,h600dp就是高度适配,sw600dp就是最小边适配


百分比首先要导入包:

compile 'com.android.support:percent:23.4.0'

现在直接用hongyang的compile 'com.zhy:percent-support-extends:1.1.1'

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "tech.androidstudio.percentlayout"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:percent:23.4.0'
}


布局里面:

百分比里面可以是小数点的。例如58.88%也是可以的



<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentRelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="tech.androidstudio.percentlayout.MainActivity">

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="20%w,%20h"
        android:gravity="center"
        android:textSize="13sp"
        android:textColor="@android:color/white"
        android:background="@android:color/holo_red_dark"
        app:layout_widthPercent="20%"
        app:layout_heightPercent="20%"
        />
    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="80%w,%20h"
        android:gravity="center"
        android:textSize="13sp"
        android:textColor="@android:color/white"
        android:layout_alignParentRight="true"
        android:background="@android:color/holo_blue_dark"
        app:layout_widthPercent="80%"
        app:layout_heightPercent="20%" />
    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:text="100%w,%20h"
        android:gravity="center"
        android:textSize="13sp"
        android:textColor="@android:color/white"
        android:layout_alignParentBottom="true"
        android:background="@android:color/holo_purple"
        app:layout_widthPercent="100%"
        app:layout_heightPercent="20%"/>
</android.support.percent.PercentRelativeLayout>



++++++++++++++++++++++++++++参考++++++++++++++++++++++++++++++++
Android 6.0 = API Level 23
Android 5.1.1 = API Level 22
Android 5.0.1 = API Level 21 ++++++++++++我的手机
Android 4.4W (L) = API Level 20
Android 4.4.2 = API Level 19++++++++++++++++我们的收银机
Android 4.3 = API Level 18
Android 4.2-4.2.2 = API Level 17
Android 4.1-4.1.1 = API Level 16
Android 4.0.3-4.0.4 = API Level 15
Android 4.0-4.0.2 = API Level 14
Android 3.2 = API Level 13
Android 3.1.x = API Level 12
Android 3.0.x = API Level 11
Android 2.3.3+ = API Level 10
2.2 v8 
2.1 v7
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++







需要添加的部分:屏幕适配部分,需要把dp,dpi这些概念再看看。


1: 机型适配的目的就是能够使应用程序能够在绝大多数的手机上面稳定的正常的运行 
要求是,匹配,合适,正常和稳定。
机型适配主要分为:版本的适配(Build.VERSION),屏幕适配(手机和平板,不同的分辨率的手机),语言国家适配(阿拉伯国家),硬件适配(


前置摄像头,后置摄像头)
而我们 平时将的适配,主要是屏幕适配:


版本的适配:要保证在android 的不同版本上面都能够正常的稳定的运行。
++++++++++++++++++++++++++++++++++++++++++++++
例如android V6里面的动态权限请求.requestPermission.
 
例如如果我们用到了btn.setX()的方法那么我们首先要通过Build.VERSION.SDK_INT>=11 来判断是否可以使用。
if (Build.VERSION.SDK_INT >= 11) {
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, linkUrl);
            } else {
                task.execute(linkUrl);
            }


=========================================================================
屏幕适配:主要包含了图片适配,界面横竖屏适配,屏幕宽度高度大小适配,
关于图片适配,因为android 会自动的根据屏幕来使用相应的图片,我们一般会请美工做lhdpi,hdpi,xhdpi,xxhdpi,xxxhdpi,实在不行的话,


就是做两个hdpi和xxhdpi这两个,因为android 会自动的进行图片的转换。
关于横竖屏的适配,首先创建一个layout-land的文件夹,我们可以单独的给竖屏创建一个布局,这个布局名称必须要和正常的竖屏里面的名称一样


。这个时候切换横屏的时候就可以使用这个布局了。
关于屏幕宽度和高度大小适配,我们选择使用dp和权重结合的方式来进行,文字的大小上面使用sp单位。然后测试几个手机上面是否显示是正常的


。就可以了。
=========================================================================
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
语言适配,可以直接的添加一个文件values-zh
右键res文件,选择创建文件夹,然后选择-》values,在里面找到Locale-》点击“》”,然后就可以选择语言了。
这里面也可以自己直接创建,如果自己知道语言的缩写的话,例如中文就是values-zh


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
硬件的适配:例如我们要开发一个罗盘应用 ,首先 要判断是否有罗盘这个感应器。没有的话,就提醒用户不能使用。




















版本的适配:例如我们的线程池的时候的时候在版本
++++++++++++++++++++++++++++++++++++++++++++++
例如android V6里面的动态权限请求.requestPermission. 
例如如果我们用到了btn.setX()的方法那么我们首先要通过Build.VERSION.SDK_INT>=11 来判断是否可以使用。
if (Build.VERSION.SDK_INT >= 11) {
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, linkUrl);
            } else {
                task.execute(linkUrl);
            }


++++++++++++++++++++++++++++参考++++++++++++++++++++++++++++++++
Android 6.0 = API Level 23
Android 5.1.1 = API Level 22
Android 5.0.1 = API Level 21
Android 4.4W (L) = API Level 20
Android 4.4.2 = API Level 19
Android 4.3 = API Level 18
Android 4.2-4.2.2 = API Level 17
Android 4.1-4.1.1 = API Level 16
Android 4.0.3-4.0.4 = API Level 15
Android 4.0-4.0.2 = API Level 14
Android 3.2 = API Level 13
Android 3.1.x = API Level 12
Android 3.0.x = API Level 11
Android 2.3.3+ = API Level 10
2.2 v8 
2.1 v7
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


android api向来是高版本兼容低版本.
如api-8(android2.2)必会兼容api-4(android 1.6)
但是反之则不会,你使用2.2的平台版本build了一个apk,若想能在1.6上运行,则需要做向下兼容.
android support-xx是google官方的向下兼容包.
如名所示,会帮助构建程序向下兼容到1.6版本.不过也并非万能的,还是会受限制.
上面的 解释很正确 ,但是我们平时使用的多是v4,v7包,如果是这个是11里面的呢?例如btn.setX,task.executeOnExecutor().
这样对于,版本是10的东西,就不能够使用了,那么 就要判断了。




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.....("您的手机不支持。。。")
}


if (Build.VERSION.SDK_INT >= 11) {
                task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, linkUrl);
            } else {
                task.execute(linkUrl);
            }


++++++++++++++++++++++++++++参考结束++++++++++++++++++++++++++++++++


=========================================================================
屏幕适配:主要包含了图片适配,界面横竖屏适配,屏幕宽度高度大小适配,
关于图片适配,因为android 会自动的根据屏幕来使用相应的图片,我们一般会请美工做lhdpi,hdpi,xhdpi,xxhdpi,xxxhdpi,实在不行的话,


就是做两个hdpi和xxhdpi这两个,因为android 会自动的进行图片的转换。
关于横竖屏的适配,首先创建一个layout-land的文件夹,我们可以单独的给竖屏创建一个布局,这个布局名称必须要和正常的竖屏里面的名称一样


。这个时候切换横屏的时候就可以使用这个布局了。
关于屏幕宽度和高度大小适配,我们选择使用dp和权重结合的方式来进行,文字的大小上面使用sp单位。然后测试几个手机上面是否显示是正常的


。就可以了。
=========================================================================




参考:
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi


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


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




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








++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
语言适配,可以直接的添加一个文件values-zh
右键res文件,选择创建文件夹,然后选择-》values,在里面找到Locale-》点击“》”,然后就可以选择语言了。
这里面也可以自己直接创建,如果自己知道语言的缩写的话,例如中文就是values-zh


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
硬件的适配:例如我们要开发一个罗盘应用 ,首先 要判断是否有罗盘这个感应器。没有的话,就提醒用户不能使用。


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


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


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




SensorManager sensorManager =(SensorManager)getSystemService(SENSOR_SERVICE);
Sensor sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROTER);






广渠门 西单商场正对面  皂君庙 西坝河 远大路 '




++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
版本适配 
        //获取panel的高度
        int height = panel.getHeight();
        //设置缩放的中心点是右侧的中点
        mContent.setPivotX(0);
        mContent.setPivotY(height/2);


        //设置缩放的等级
        mContent.setScaleX(1-slideOffset);
        mContent.setScaleY(1-slideOffset);




//如果要兼容2.0的手机,2.0就是API5,2.1是API 7,2.3是API 9
//        http://blog.csdn.net/rodulf/article/details/50743187


//        ViewCompat.setPivotX(mContent, 0);
//        ViewCompat.setPivotX(mContent, height / 2);
//        ViewCompat.setScaleX(mContent, 1 - slideOffset);
//        ViewCompat.setScaleY(mContent, 1 - slideOffset);




硬件适配 :
例如下载的路径默认是外部存储的位置,如果有没有存储卡 ,那么就是内部的存储的位置。


if(Environment.MEDIA_MOUNTED.equals(state)){
            // MEDIA_MOUNTED 代表存储卡可用, MOUNTED 称作 "挂载"
 // 获取外部存储中,应用程序共享的目录, 返回内容可能不存在


机型适配:

作用是使应用程序能够在广泛的软件系统和硬件平台上都可以正常的稳定的运行
操作系统的版本的适配。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



没有更多推荐了,返回首页