屏幕适配

来源:互联网 发布:小学生信息编程课程 编辑:程序博客网 时间:2024/06/14 01:21

基本知识讲解:

   像素密度:dpi   就是每英尺上面分布的像素的个数

   屏幕的分辨率:就是宽和高的像素乘积  eg 480*800

   屏幕的尺寸:就是屏幕的对角线的长度。

    px:  像素

    dip: 或者叫dp,这是Android开发中特有的一种度量,称作屏幕无关像素,这个值只有在 具体屏幕密度的手机上,才会被转换为具体的像素值。

    


    注意  手机的像素密度一共分为分为五个级别    像素密度就是

        ldpi:120dpi,像素密度与dp转换关系为:1dp = 0.75px     320*240
mdpi:160dpi ,像素密度与dp转换关系为:1dp = 1px       480*320
hdpi:240dpi,像素密度与dp转换关系为:1dp = 1.5px       800*480
xhdpi:320dpi,像素密度与dp转换关系为:1dp = 2px         1280*720
xxhdpi:480dpi,像素密度与dp转换关系为:1dp = 3px       1920*1080

   

       注意   我们得到手机屏幕的范围之后,就可以将dp转化为相对应的px      注意我们的手机宽和高就是px  

       这样 我们就可以将dp转化为px   随后就可以得到行对应的长度。




        像素密度的计算公式:就是利用勾股定律实现我们的计算像素密度。

       注意  在计算的时候  计算像素密度的时候    最接近哪一个像素密度值就将其归纳为哪一个级别的像素密度值。


1:多套图片实现我们的屏幕适配 

     他就是将同一张图片 分别放在了drawable-ldpi  drawable-mdpi  drawable-hdpi  drawable-xhdpi目录下面  从而当我      们在不同的手机上面运行的时候,手机自己就会去相对应的目录下面加载图片。  同时记好 如果没有相对应的照片      的时候  这个时候  手机会选择去加载更高分辨率的图片实现我们的加载。

      

 2:第二种方式 我们借助dimens.xml 实现我们的配置  具体做法就是创建多个values-1280 *720目录  随后创建相对应        的dimens文件  将宽度写进去就可以了。


 3:java代码

    

       <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity" >
   <TextView
       android:id="@+id/tv"
       android:background="#000000"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/hello_world" />
</RelativeLayout>



      TextView tv  = (TextView) findViewById(R.id.tv);

         //获取封装当前手机屏幕信息对象,用于存放宽高值
 DisplayMetrics metrics  = new DisplayMetrics();

        //给当前屏幕设置宽高
        getWindowManager().getDefaultDisplay().getMetrics(metrics);

       //获取高度
       Constant.srceenHeight = metrics.heightPixels;

       //获取宽度
       Constant.srceenWidth = metrics.widthPixels;

       RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
(int)(Constant.srceenWidth*0.5+0.5), 
(int)(Constant.srceenHeight*0.5+0.5));

       tv.setLayoutParams(layoutParams);




 4:layout实现

       res/layout-800x480文件夹

       res/layout-1280x720文件夹

       


 5:LinearLayout实现权值。

             



补充:


1:屏幕尺寸:实际的物理尺寸,一屏幕的对角线为准  一般情况下分为四个级别

2:屏幕的密度  就是单位面积上面像素的个数  dpi    密度越高  像素个数就越多

3:分辨率:屏幕上面物理像素总数,

4:dp   可以转化为px  但是转化为px的时候  注意要根据不同的屏幕密度来分情况讨论。


5:密度分别分为ldpi  mdpi  hdpi  xhdpi  xxhdpi



 

注意  我们在真实开发的时候    屏幕的分辨率与我们的屏幕适配没有任何关系     屏幕的密度和我们的屏幕适配息息相关      记好 所以 我们要时刻  记好先得到此时我们的屏幕密度   在进行其他的相关的操作。


文字的适配:

           注意  在正常情况下,都可以使用sp  如果你的控件是具体的数值,或者是填充父窗体  

           假设你的组件是包裹内容的话  就不可以使用sp,就必须使用dip


注意    图片的适配  注意   还是首先得知我们显示屏幕属于哪个级别的,随后再根据我们的区间去设置加载那张图片


注意    我们在创建values的时候  我们的创建的文件夹要按照给定的屏幕分辨率来设定  不可以按照我们自己的来设定。 


layout适配的时候  务必保证  前面的数字是最大的。


drawable会将图片进行放缩 在不同的目录下。  



电视端的屏幕适配:

电视端android应用开发比手机有点好处是电视的分辨率就那么几种,一般只需要做720P和1080P的就足够了.720P是指1280x720, 1080P是指1920x1080.

适配主要就是两块:

1. 图片

2.字体和长宽定义

因为720P下的图片dp值与电脑上的px值是1:1的,所以默认开发都是720P为基础,图片资源文件放到drawable-mdpi下就可以了,1080P的图片资源要放到drawable-sw1080dp下

再说字体和长宽定义:

无论是layout还是java代码中所使用的尺寸全部要使用dimen文件中定义的值,方便1080P适配, 1080P使用的dimen.xml放到values-sw1080dp下



两种分辨率为主

1.720标清,分辨率为1280x720.

屏幕尺寸以32寸为主,部分电视为42寸

2.1080p全高清,分辨率为1920x1080

屏幕尺寸以42寸为主,此分辨率电视屏幕从32寸到50寸都有


适配遇到问题,已1080p尺寸为例:

分辨率固定不变,屏幕尺寸变化较大。

如:效果图尺寸为1920x1080,如果使用dp进行布局设计,并且要实现和效果图一样的显示,则需要根据不同尺寸进行适配,也就是要每个尺寸都要有一套布局文件。同样720p的也要每个尺寸一个布局文件。这样的话布局文件太多将无法维护。


那么如何适配分辨率固定但屏幕密度值不同的电视呢?

 

1.使用dp设定控件尺寸,为每个密度值单独设定一套布局文件

优点:可以进行部分自适应,如1280x720中等密度(mdpi)尺寸的布局可以自适应到1920x1080高密度(hdpi)的屏幕

缺点:布局文件数膨胀,维护困难,有新的尺寸则需要新增新的布局文件进行适配


再说下适配固定分辨率不同密度的布局文件命名:

如:

1920x1080分辨率,高密度屏幕     布局文件目录名为layout-hdpi-1920x1080

1920x1080分辨率,中密度屏幕     布局文件目录名为layout-mdpi-1920x1080



:针对这种情况,Android提供了一套标准,它将屏幕分为三类,所以当你新建一个Android工程后,工程自动为你创建三个存放不同分辨率,不同密度下的UI的文件夹,如下图:


Android终端会在打开应用的时候自动根据终端类型去匹配与文件夹里提供的UI相近分辨率及密度的图片。

假设终端屏是WVGA类型的,也就是密度为240,那么程序打开时,会去提取drawable-hdpi文件夹下图片,然后用一个物理像素去显示一个图片像素,因为你把图片是放在drawable-hdpi文件夹下的,也就是告诉Android你设计的UI是针对480*800,密度为240而言的,那么它不会对图片进行放大或缩小操作,正好用一个物理像素去显示一个图片像素。

当图片的密度与屏幕密度相同,则不进行缩放.

当图片的密度与屏幕密度不同,则进行缩放。


实验1:

针对480*800的屏我设计了一张图片(分辨率是480*100),分别在不同物理分辨率终端下进行显示,看看Android会不会显示不正常。图片如下:


假设:这张图片的宽是480像素,高为100像素,我将它放在drawable-hdpi文件夹下,就是告诉Android我的设计意图是针对480*800的Android终端而言的,那么它会在480*800的终端上以一个物理像素去显示一个图片像素,如果将它放在分辨率为240*320的终端上进行显示,如果Android不对显示进行处理的话,还是以一个物理像素去显示一个图片像素,终端必将显示不下这张图片,因为图片像素超过了物理像素个数。


注意:我这里只设计了一张图片,并放置于drawable-hdpi文件夹下,并没有在其它文件夹下放置相应的图片,当Android进行匹配的时候也就只能匹配这张图了。


但是结果呢:

WVGA屏:对比原图,正好显示下,大小相同



总结:

1:只要对一种屏幕设计一套UI,Android总能通过放大或者缩小来适应屏幕来保证设计意图,这个前提是布局里的单位是dip

2:虽然Android总能够很聪明地来保证你的设计意图,但是实际工作中,最好还是要多设计几套UI,因为像实验2里,放大后的图片明显要模糊了许多

3:如果考虑设计的工作量,只想设计一套UI,那最好也是针对大分辨率的终端来设计,这样图片缩小比图片放大的清晰度要好。


对于一张200x200像素的图片,我国我们想要显示在 200ppi 的手机上,那么占用屏幕的长和宽均为   200pix  /  (200pix / inch) = 1 inch  ,也就是说要占用 1 inch x 1 inch,如果要显示在 300ppi 的手机上,那么占用屏幕的长和宽均为  200pix  / (300pix / inch )  = 2/3 inch,也就是说对于 ppi越高的手机,单位inch上能够显示更多的像素点,因此当这两种手机显示同样多的像素点的时候,ppi 越高的手机占用的空间就越小。



实验总结  当我们的图片放的密度越大的时候  我们的图片显示的区域就越小。




适配经验再总结:

                         注意 我们创建多个  layout   或者  drawable目录的时候  一定要注意:我们要指定他所属于的那个级别比如1280x720  或者其他的。



6、在代码中获取屏幕像素、屏幕密度 
DisplayMetrics metric = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metric); 
int width = metric.widthPixels;  // 屏幕宽度(像素) 
int height = metric.heightPixels;  // 屏幕高度(像素) 
float density = metric.density;  // 屏幕密度(0.75 / 1.0 / 1.5) 
int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240) 






0 0
原创粉丝点击