Android屏幕适配--六大适配方法(你必须知道)

来源:互联网 发布:张家口seo公司 编辑:程序博客网 时间:2024/05/21 19:38
u  首先阐释一些术语和概念

Ø  屏幕尺寸(screen size):实际的物理尺寸,屏幕的对角线测量。为了方便,Android把所有的屏幕尺寸分为了4个广义的大小:小、正常、大、更大。

Ø  屏幕密度(screen density):屏幕占据的物理区域所含像素的个数,通常被称为dpi(dots per inch)即每英寸的像素点数。

Ø  分辨率(resolution):屏幕上物理像素的点数。例如,有一个240px*400px的屏幕,可以理解为在这个屏幕上横着有400条线,每条线上有240个像素点。

Ø  像素(px):屏幕上的点。

Ø  dip(dp):Density-independent pixel--->与密度无关的像素(下面将详细讲解)


1.图片适配

开发过程中切图越多越好吗? 图标的大小怎么切 72x72 ,48x48,96x96,144x144,192x192 一般切多少套图片? 如果能用一套图片解决问题,就一套就够了 能不用图片就不用图片,shap资源 drawable-ldpi drawable-mdpi drawable-hdpi drawable-xhdpi drawable-xxhdpi


当同名的一张图片mm.jpg ,但内容不同图片,分别放置不同的目录,手机会更加当前屏幕密度,加载不同的图片。

Android开发者在做图片适配时需要注意一下两点

1、盛放图片的控件要用dip单位来定义其长宽。
2、  最好在ldpi、mdpi、hdpi、xhdpi、xxhdpi文件夹下提供大小比例为3:4:6:8:12的图片。当然如果有质量好的.9.png图片的话,提供一个也可以。

2.布局适配

针对1280x720这样的屏幕做特定的ui效果

布局文件的适配,使用得比较少。




3.代码适配


//要求:v,v,v,v·直鹕柚每矶任聊坏目淼?/,/,/,全部填充;高默认
     int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
     int screenHeight = getWindowManager().getDefaultDisplay(). getHeight();
    LayoutParams params = new LayoutParams(( int) (0.25* screenWidth), (int) (screenHeight*0.1));
     tv1.setLayoutParams(params );
    params = new LayoutParams((int) ( 0.5*screenWidth), (int ) (screenHeight*0.1));
     tv2.setLayoutParams(params );
     params = new LayoutParams((int) ( 0.75*screenWidth), (int ) (screenHeight*0.1));
     tv3.setLayoutParams(params );
     params = new LayoutParams(screenWidth, ( int) (screenHeight*0.1) );
     tv4.setLayoutParams(params );



4.权重适配
这个不用多说

5.尺寸适配

dip转成像素 : dp*密度比 = 像素===> 每个手机的密度比不一样
屏幕密度:开根(屏幕宽的平方+屏幕高的平方)/屏幕的尺寸


1_尺寸基本单位
px 像素 不同设备显示效果相同
dip或者dp   device independent pixels(设备独立像素). 不同设备有不同的显示效果 ,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
dip转成像素 : dp*密度比 = 像素
每个手机的密度比不一样
屏幕密度:开根(屏幕宽的平方+屏幕高的平方)/屏幕的尺寸
屏幕密度:开根(屏幕宽的平方+屏幕高的平方)/屏幕的尺寸
float density = getResources().getDisplayMetrics().density;
     System.out.println("当前手机的屏幕密度比是:" +density);
特殊的设备(平板电脑)宽度和高度的比例和手机是不一样的,密度比是没有办法实现所有设备的适配,使用dimension.xml文件独立去声明单位,并且针对特殊的设备创建一个values-分辨率目录 ,来指定设备的宽度。



6.百分比适配
Android5.0之后引入百分比适配

源码分析 : http://blog.csdn.net/lmj623565791/article/details/46695347


导入:compile 'com.android.support:percent:22.2.0'
布局中加: xmlns:app="http://schemas.android.com/apk/res-auto"
宽高都设为0先
  • 支持的属性有:

layout_widthPercentlayout_heightPercent、 
layout_marginPercentlayout_marginLeftPercent、 
layout_marginTopPercentlayout_marginRightPercent、 
layout_marginBottomPercentlayout_marginStartPercentlayout_marginEndPercent

只要在开发过程中使用PercentRelativeLayoutPercentFrameLayout替换FrameLayoutRelativeLayout即可。
<TextView android:layout_width="0dp" android:layout_height="0dp" android:layout_gravity="right|top" android:gravity="center" android:background="#4400ff00" android:text="width:70%,height:20%" app:layout_heightPercent="20%" app:layout_widthPercent="70%"/>
封装自定义的PercentLinearLayout
测试的布局
          
详情链接: http://blog.csdn.net/lmj623565791/article/details/46767825
扩展:官方库有局限地方,做了初步扩展,慎用.
当使用图片时,无法设置宽高的比例,很难使用百分比定义一个正方形的控件,一个控件的margin四个方向值一致

使用方法:
compile 'com.zhy:percent-support-extends:1.0.1'

三个类分别为
com.zhy.android.percent.support.PercentLinearLayout com.zhy.android.percent.support.PercentRelativeLayout com.zhy.android.percent.support.PercentFrameLayout

用法:在原有基础上设置宽高百分比时指明分辨参数
app:layout_heightPercent="50%w"
app:layout_widthPercent="50%w">





更通用的基于重封装px属性的适配:



主要是基于Google推出的百分比布局,已经很大程度解决了适配的问题。

但在实际工作中,存在一些问题:

因为设计图上标识的都是px,所以需要去计算百分比,然后这个百分比还是依赖父容器的,设计图可能并不会将每个父容器的尺寸都标识出来

还有个问题就是,因为依赖于父容器,导致ScrollView,ListView等容器内高度无法使用百分比。


 
我们需要一种更人性化的适应性更广更牛X的: 拿到设计图,不需要额外计算,布局直接抄设计图上的尺寸,不产生任何多余的资源文件,完成各种分辨率的适配!

特别说明:
: 这个px并不代表1像素,内部会进行百分比化处理 ,也就是说:720px高度的屏幕,你这里填写72px,占据10%;当这个布局文件运行在任何分辨率的手机上,这个72px都代表10%的高度,这就是本库适配的原理。


用方法:

引入Android Studio

autolayout引入

dependencies { compile 'com.zhy:autolayout:1.4.3' }

(1)在你的项目的AndroidManifest中注明你的设计稿的尺寸

<meta-data android:name="design_width" android:value="768"></meta-data>

<meta-data android:name="design_height" android:value="1280"></meta-data>

(2)Activity中开启设配

让你的Activity去继承AutoLayoutActivity

或者如果你不希望继承AutoLayoutActivity,可以在编写布局文件时,将
LinearLayout -> AutoLinearLayout
RelativeLayout -> AutoRelativeLayout
FrameLayout -> AutoFrameLayout
这样也可以完成适配。
目前支持属性
layout_width
layout_height
layout_margin(left,top,right,bottom)
pading(left,top,right,bottom)
textSize
maxWidth, minWidth, maxHeight, minHeight

然后就可以尽情的布局玩耍了~
扩展部分 注意的点:
1.要看到实时的预览效果,
首先,你要记得你设计稿的尺寸,比如 768 * 1280,然后在你的PreView面板,选择分辨率一致的设备.
2.由于该库的特点,布局文件中宽高上的1px是不相等的,于是如果需要宽高保持一致的情况,布局中使用属性:
app:layout_auto_basewidth="height",代表height上编写的像素值参考宽度app:layout_auto_baseheight="width",代表width上编写的像素值参考高度。
如果需要指定多个值参考宽度即:app:layout_auto_basewidth="height|padding"
3.用|隔开,类似gravity的用法,取值为:
width,height
margin,marginLeft,marginTop,marginRight,marginBottom
padding,paddingLeft,paddingTop,paddingRight,paddingBottom
textSize.

4.对于ListView这类控件的item,默认根局部写“px”进行适配是无效的,因为外层非AutoXXXLayout,而是ListView。但是,一行代码就可以支持了:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{    ViewHolder holder = null;
    if (convertView == null)
    {
        holder = new ViewHolder();
        convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);
       convertView.setTag(holder);
        //对于listview,注意添加这一行,即可在item上使用高度
        AutoUtils.autoSize(convertView);
} else
    {
       holder = (ViewHolder) convertView.getTag();
    }
    return convertView;
}
对于RecyclerView:
public ViewHolder(View itemView)
{    super(itemView);
     AutoUtils.autoSize(itemView);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
     View convertView = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item, parent, false);//一定要记得使用三个参数的方法!
     return new ViewHolder(convertView);
}
5.TextView的高度问题
设计稿一般只会标识一个字体的大小,比如你设置textSize="20px",实际上TextView所占据的高度肯定大于20px,字的上下都会有一定的建议,所以一定要灵活去写字体的高度,比如对于text上下的margin可以选择尽可能小一点。或者选择别的约束条件去定位

优点:
此库不会影响系统所有的其他属性,以及不会影响dp,sp的使用

通过本库的方式去编写代码,可以在很大程序上使用margin,也就是说,对于View的位置非常好控制,从而能够减少非常多的嵌套,甚至任何一个复杂的界面做到无嵌套。
原创粉丝点击