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。