关于屏幕适配的理解

做个记录

主要是有关drawable-mdpi,drawable-hdpi,drawable-xhdpi等等以及layout-1024x720,layout-1024x552,layout-1280x720等还有layout-mdpi,layout-hdpi,layout-xhdpi等的理解和应用,当然还有dp,dpi,sp,px的转化

想要知道怎么运用就要先知道dp,sp,px代表的意思

px:像素

dp/dip:独立像素,长度单位

sp:长度单位,一般用来设置字体大小

dpi:每英寸的点数,即每英寸所包含的像素个数

density:屏幕密度,其中density=dpi/160

 

Android Drawable

我们新建一个Android项目后应该可以看到很多drawable文件夹,分别对应不同的dpi

  • drawable-ldpi (dpi=120, density=0.75)

  • drawable-mdpi (dpi=160, density=1)

  • drawable-hdpi (dpi=240, density=1.5)

  • drawable-xhdpi (dpi=320, density=2)

  • drawable-xxhdpi (dpi=480, density=3)

除此之外还要先知道自己设备是属于上面的哪个属性,可运行下面的代码获取相关信息:

 

        Resources resources = this.getResources();
        DisplayMetrics dm = resources.getDisplayMetrics();
        float density = dm.density;//密度
        int width = dm.widthPixels;//分辨率:像素
        int height = dm.heightPixels;//分辨率:像素
        int screenWidth = (int)(width/density);//屏幕的宽度:dp
        int screenHeight = (int)(height/density);//屏幕高度:dp

得到density之后,就可以知道自己的设备需要适配哪个属性的了,假设你只在drawable_xhdpi文件夹下放了test图片,xhdpi的设备会去xhdpi文件夹下找到test图片并直接显示,而mdpi的设备优先会去mdpi文件夹里查找test图片,但是没找到,最后在xhdpi文件夹下找到,然后会自动根据density计算并缩放显示出来,实际显示出来的大小是120/2=60px,反而如果在mdpi文件夹中找到了120*120的图片,那么显示出来的大小就是120/1=120px,综上所述,如果我们在mdpi文件夹和xhdpi文件夹中都放入一张120*120的图片,那么在mdpi中找到的图片显示会偏大,所以在屏幕适配的时候,如果想要保持效果比例一致,在不同文件夹的图片一般都会有对应大小的图片,但很多情况下,有时候只会提供一张图片,一般这种情况我们是首选将图片放入xhdpi文件夹(前两年都是这样,主要是依据当时主流手机设备的分辨率有关),现在大部分手机都是1920*1080(480dpi)的,这个选择可以根据自己情况而定,像电视TV测试屏幕很多是1920*1080(横版,240dpi)的。
layout-mdpi这些跟上面drawable的一样

 

下面是一个转化的工具类(网上找的)

 

package com.zhy.utils;

import android.content.Context;
import android.util.TypedValue;

/**
 * 常用单位转换的辅助类
 * 
 * 
 * 
 */
public class DensityUtils
{
	private DensityUtils()
	{
		/* cannot be instantiated */
		throw new UnsupportedOperationException("cannot be instantiated");
	}

	/**
	 * dp转px
	 * 
	 * @param context
	 * @param val
	 * @return
	 */
	public static int dp2px(Context context, float dpVal)
	{
		return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
				dpVal, context.getResources().getDisplayMetrics());
	}

	/**
	 * sp转px
	 * 
	 * @param context
	 * @param val
	 * @return
	 */
	public static int sp2px(Context context, float spVal)
	{
		return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
				spVal, context.getResources().getDisplayMetrics());
	}

	/**
	 * px转dp
	 * 
	 * @param context
	 * @param pxVal
	 * @return
	 */
	public static float px2dp(Context context, float pxVal)
	{
		final float scale = context.getResources().getDisplayMetrics().density;
		return (pxVal / scale);
	}

	/**
	 * px转sp
	 * 
	 * @param fontScale
	 * @param pxVal
	 * @return
	 */
	public static float px2sp(Context context, float pxVal)
	{
		return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);
	}

}

 

参考资料:

http://blog.csdn.net/fumeidonga/article/details/50999977

http://blog.csdn.net/icewst/article/details/38685319

待完善...

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值