1. 请问平时开发过程中,你是如何做到多分辨率适配的
答:1.根据不同分辨率建立不同的布局文件
2.根据分辨率不同建立不同分辨率的资源图片
3.在程序启动时,获取当前屏幕的分辨率和密度,在代码中进行适配
4.为不同分辨率的写不同的dimen文件。
5.其实还有就是多使用fragement
2.屏幕适配的方式有哪些?
l 适配方式之dp
名词解释
分辨率:eg:480*800,1280*720。表示物理屏幕区域内像素点的总和。(切记:跟屏幕适配没有任何关系)
因为我们既可以把1280*720的分辨率做到4.0的手机上面。我也可以把1280*720的分辨率做到5.0英寸的手机上面,如果分辨率相同,手机屏幕越小清晰。
px(pix):像素,就是屏幕中最小的一个显示单元
dpi(像素密度):即每英寸屏幕所拥有的像素数,像素密度越大,显示画面细节就越丰富。
计算公式:像素密度=√{(长度像素数^2+宽度像素数^2)}/ 屏幕尺寸
注:屏幕尺寸单位为英寸 例:分辨率为1280*720 屏幕宽度为6英寸 计算所得像素密度约等于245,屏幕尺寸指屏幕对角线的长度。
在Android手机中dpi分类:
| Resources for low-density (ldpi) screens (~120dpi). |
| Resources for medium-density (mdpi) screens (~160dpi). (This is the baseline density.) |
| Resources for high-density (hdpi) screens (~240dpi). |
| Resources for extra high-density (xhdpi) screens (~320dpi). |
在我们的Android工程目录中有如下drawable-*dpi目录,这些目录是用来适配不同分辨率手机的。
Android应用在查找图片资源时会根据其分辨率自动从不同的文件目录下查找(这本身就是Android系统的适配策略),如果在低分辨的文件目录中比如drawable-mdpi中没有图片资源,其他目录中都有,当我们将该应用部署到mdpi分辨率的手机上时,那么该应用会查找分辨率较高目录下的资源文件,如果较高分辨率目录下也没有资源则只好找较低目录中的资源了。
常见手机屏幕像素及对应分别率级别:
ldpi 320*240
mdpi 480*320
hdpi 800*480
xhdpi 1280*720
xxhdpi 1920*1080
dp和px之间的简单换算关系:
ldpi的手机 1dp=0.75px
mdpi的手机 1dp=1.0px
hdpi的手机 1dp=1.5px
xhdpi的手机 1dp=2.0px
xxhdpi的手机 1dp=3.0px
:根据上面的描述我们得出如下结论,对于mdpi的手机,我们的布局通过dp单位可以达到适配效果。
l 屏幕适配之dimens
跟drawable目录类似的,在Android工程的res目录下有values目录,这个是默认的目录,同时为了适配不同尺寸手机我们可以创建一个values-1280x720的文件夹,同时将dimens.xml文件拷贝到该目录下。
在dimens.xml中定义一个尺寸,如下图所示。
在values-1280x720目录中的dimens.xml中定义同样的尺寸名称,但是使用不同的尺寸,如下图所示。
当我们在布局文件中使用长或者宽度单位时,比如下图所示,应该使用@dimen/width来灵活的定义宽度。
:在values-1280x720中,中间的是大写字母X的小写形式x,而不是加减乘除的乘号。如果我们在values-1280x720中放置了dimens常量,一定记得也将该常量的对应值在values目录下的dimens.xml中放一份,因为该文件是默认配置,当用户的手机不是1280*720的情况下系统应用使用的是默认values目录中的dimens.xml。
l 屏幕适配之layout
跟values一样,在Android工程目录中layout目录也支持类似values目录一样的适配,在layout中我们可以针对不同手机的分辨率制定不同的布局,如下图所示。
l 视频方式之java代码方式
为了演示用java代码控制适配的效果,因此假设有这样的需求,让一个TextView控件的宽和高分别为屏幕的宽和高的一半。
我们新创建一个Android工程,修改main_activity.xml,布局文件清单如下:
<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">
<!-- 当前控件宽高为屏幕宽度的各50%-->
<TextView
android:id="@+id/tv"
android:background="#000000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"/>
</RelativeLayout>
在MainActivity.java类中完成用java代码控制TextView的布局效果,其代码清单如下:
publicclass MainActivity extends Activity {
privatestaticfinal String tag = null;
@Override
protectedvoid onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
//去掉title
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
//获取TextView控件
TextViewtv = (TextView) findViewById(R.id.tv);
//找到当前控件的夫控件(父控件上给当前的子控件去设定一个规则)
DisplayMetricsmetrics = new DisplayMetrics();
//给当前metrics去设置当前屏幕信息(宽(像素)高(像素))
getWindowManager().getDefaultDisplay().getMetrics(metrics);
//获取屏幕的高度和宽度
Constant.srceenHeight = metrics.heightPixels;
Constant.srceenWidth = metrics.widthPixels;
//日志输出屏幕的高度和宽度
Log.i(tag, "Constant.srceenHeight= "+Constant.srceenHeight);
Log.i(tag, "Constant.srceenWidth ="+Constant.srceenWidth);
//宽高各 50%
RelativeLayout.LayoutParamslayoutParams = new RelativeLayout.LayoutParams(
//数学角度上 四舍五入
(int)(Constant.srceenWidth*0.5+0.5),
(int)(Constant.srceenHeight*0.5+0.5));
//给tv控件设置布局参数
tv.setLayoutParams(layoutParams);
}
}
其中Constant类是一个常量类,很简单,只有两个常量用来记录屏幕的宽和高,其代码清单如下:
publicclass Constant {
publicstaticintsrceenHeight;
publicstaticintsrceenWidth;
}
l 适配方式之weight权重适配
在控件中使用属性android:layout_weight="1"可以起到适配效果,但是该属性的使用有如下规则:
只能用在线性控件中,比如LinearLayout。
竖直方向上使用权重的控件高度必须为0dp(Google官方的推荐用法)
水平方向上使用权重的控件宽度必须为0dp(Google官方的推荐用法)
3.dp和px之间的关系
dp:是dip的简写,指密度无关的像素。
指一个抽象意义上的像素,程序用它来定义界面元素。一个与密度无关的,在逻辑尺寸上,与一个位于像素密度为160dpi的屏幕上的像素是一致的。要把密度无关像素转换为屏幕像素,可以用这样一个简单的公式:pixels=dips*(density/160)。举个例子,在DPI为240的屏幕上,1个DIP等于1.5个物理像素。
布局时最好使用dp来定义我们程序的界面,因为这样可以保证我们的UI在各种分辨率的屏幕上都可以正常显示。
4.Padding和Margin有什么区别?
a) Padding是相对View的内容计算边距。比如边长100的正方形控件,设置padding为10的话,则它占用空间大小为边长100的正方形,内容的可用大小为边长80的正方形。
b) Margin是相对View的父窗体计算边距。比如边长100的正方形控件,设置Margin为10的话,则它占用空间大小为边长120的正方形,内容的可用大小为边长100的正方形。
5.屏幕适配GridView
a) 在处理大小相关的单位时使用dp、sp来替代px
b) 创建多个dimens文件,同一个控件在不同的屏幕提供不同的大小
c) 创建多个layout文件夹适配不同的屏幕
d) 使用9patch图片实现更好的缩放效果
e) 不得已的情况下需要在代码动态计算控件大小
6.如何屏幕适配
Android的屏幕适配主要有五中方式:
1.图片适配,根据不同的手机的密度加载不同文件夹下的图片
2.dimens.xml文件适配,根据不同的手机的密度加载不同文件夹下的dimens.xml
3.layout适配,根据不同的手机的密度加载不同文件夹下的布局文件
4.java代码适配
5.权重适配,设置显示比例。
7.gravity和layout-gravity区别
8.屏幕适配 百分比适配