Android——drawable、dpi、dip、px、缩放因子及屏幕适配

drawable与mipmap

Android drawable微技巧,你所不知道的drawable的那些细节

dpi、px 和 缩放因子

关于dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换换算可这篇文件讲的比较通俗易懂:http://www.cnblogs.com/yaozhongxiao/archive/2014/07/14/3842908.html

主流手机屏幕

该手机像素为xhdpi,缩放因子中2.0x表示 1dp 等于2个px,由此可得到dp与px的计算公式为:

dp = px/设备密度(缩放因子)

获取屏幕的dpi值:

float xdpi = getResources().getDisplayMetrics().xdpi;
float ydpi = getResources().getDisplayMetrics().ydpi;

获取屏幕密度(缩放因子)值:

Activity.this.getResources().getDisplayMetrics().density; // 1280*720 下 = 2.0

屏幕适配方案

先在主流屏幕上进行开发如(1280*720),遵循的原则是:不用AbsoluteLayout(绝对布局),多用相对布局和线性布局(权重),用dp不直接用px。
开发后期,在不同分辨率的屏幕上测试(主要是480*800,1920*1080),如果没有出现太大问题(影响正常使用),就可以上线了。

1、图片适配(不常用)
不同的分辨率切不同的图。
注意:如果当前文件夹下没有找到需要加载的图片,到高分辨率文件夹找
缺点:apk过大

2、dimen尺寸适配(常用)
这里写图片描述

这里写图片描述

这里写图片描述

如上图所示,根据缩放因子1dp = 2*px, 要显示控件的宽度为屏幕的一半。 720px/2/2 = 180dp。
如果当前手机分辨率是1280*720,那么会去自动加载values-1280x720文件夹下的dimens.xml文件,如果是其他手机会默认加载values下的dimens.xml文件。注意:虽然values-1280x720下dimens.xml中设置了“width”的值,在values下的dimens.xml中也要设置“width”的默认值,不然会出现异常。

3、layout布局适配(不常用)
这里写图片描述

使用场景:当独为特定手机创建布局,如魅族3手机 1800*1080分辨率比较奇葩。
要适配1080*1800的屏幕则新建layout-1800x1080的文件夹,如果当前手机是1800*1080分辨率会去自动加载layout-1800*1080文件夹下的activity_main.xml布局文件。

4、java代码适配
获取屏幕宽高,按比例设置控件大小。
注意:找到当前控件的父控件,通过父控件设置当前控件的规则

package com.example.testandroid;

import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Window;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView tv_text;
    private int screenWidth;
    private int screenHeight;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 去掉title
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        tv_text = (TextView) findViewById(R.id.tv_text);

        // 代码适配:将tv_text控件的宽高设置为屏幕的一半
        // 规则:找到当前控件的父控件,通过父控件设置当前控件的规则

        DisplayMetrics outMetrics = new DisplayMetrics();
        // 给outMetrics设置当前屏幕信息(宽(px),高(px))
        getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
        screenWidth = outMetrics.widthPixels;
        screenHeight = outMetrics.heightPixels;

        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                (int)(screenWidth*0.5 + 0.5), (int)(screenHeight*0.5 + 0.5));// +0.5 四舍五入

        tv_text.setLayoutParams(layoutParams);
    }

}

效果图:
这里写图片描述

5、权重适配(常用)

这里写图片描述

这里写图片描述

权重适配规则:
    1、适用于线性布局
    2、竖直方向上使用权重,使用权重的控件的默认高度设置为0dp。
    3、水平方向上使用权重,使用权重的控件的默认宽度设置为0dp。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值