标签:
演示效果
奇酷1080P华为1080P华为720P
屏幕像素参数相关信息表格
像素密度 每英寸像素数 分辨率 分辨率别称 默认图标大小xxhdpi 3 480 1080*1920 1080P 144*144 重点关注xhdpi 2 320 720*1280 720P 96*96 适配基准hdpi 1.5 240 480*800 WVGA 72*72mdpi 1.0 160 320*480 HVGA 48*48 基准ldpi 0.75 120 240*320 QVGA 36*36
字体单位
1、TextView.setTextSize默认传入的单位是sp,仅仅这个的单位默认是sp,其他都是px
2、TextView.getTextSize返回值是px,Paint.setTextSize传入的也是px3、TextView有一个可以指定单位的设置字体大小的方法setTextSize(int unit, int size):第一个参数可设置如下静态变量:
- TypedValue.COMPLEX_UNIT_PX : Pixels
- TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
- TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels
setTextSize(TypedValue.COMPLEX_UNIT_PX, getTextSize());//注意:setTextSize默认单位是SP,而getTextSize()默认单位是PX
名词解释
名词解释
- Px(像素Pixel) 不同设备上显示时像素数不会变,比如指定控件的长度是100px,那不管分辨率是多少控件长度都是100px。也正是因为如此才产生了屏幕适配问题。
- Screen Size(屏幕尺寸) 一般所说的手机屏幕大小如5.0英寸,都是指的对角线的长度,而不是手机面积。
- Resolution(分辨率) 在屏幕上显示的物理像素总和。比如分辨率是720*1280,则指设备垂直方向有1280个像素点,水平方向有720个像素点。需要注意的是:尽管分辨率通常用宽x高表示,但分辨率并不意味着具体的屏幕长宽比,比如分辨率为720*1280的手机屏幕宽高比不一定是720:1280,但是为了显示效果和谐,两者一般都是一致的。
- Density(密度) 指单位英寸中的像素数。DisplayMetrics类中属性density的值即为此值,可用于px与dip的互相转换
- Dpi(像素密度dots per inch ) 指每英寸中的像素数。dp是一个与密度无关的像素,在不同的像素密度的设备上会自动适配,在逻辑尺寸上,与一个位于像素密度为 160DPI 的屏幕上的像素是一致的,在运行的时候,平台会以目标屏幕的密度作为基准,处理所有需要的DIP缩放操作。假定设备分辨率为320*240,屏幕长2英寸宽1.5英寸,dpi=320/2=240/1.5=160,此160dpi表示手机水平或垂直方向上每英寸距离有160个像素点。要把DIP像素转换为屏幕像素,可以用这样一个简单的公式: pixels = dips * (density / 160)。
- Dip(设备独立像素Device-independent pixel) 同dp,不同设备有不同的显示效果,这个和设备硬件有关,不依赖像素。dip和具体像素值的对应公式是dip值 =设备密度/160* pixel值,可以看出在dpi为160dpi的设备上1px=1dip
- Sp(放大像素ScaledPixels) 主要用于字体显示(best for textsize)。根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。
Activity
public class MainActivity extends Activity {private TextView tv_info;public static final String FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath();protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);tv_info = new TextView(this);setContentView(tv_info);tv_info.setText("" + DensityUtils.getStatusBarHeight(this));//奇酷72。华为75tv_info.append("\n" + DensityUtils.getDisplayMetrics(this));//奇酷2.875。华为3.0tv_info.append("\n" + DensityUtils.dp2px(this, 10.3f));tv_info.append("\n" + DensityUtils.px2dp(this, 10.3f));tv_info.append("\n" + DensityUtils.sp2px(this, 10.3f));tv_info.append("\n" + DensityUtils.px2sp(this, 10.3f));tv_info.append("\n" + DensityUtils.getScreenWidth(this) + "-" + DensityUtils.getScreenWidth2(this));tv_info.append("\n屏幕高度:" + DensityUtils.getScreenHeight(this));//奇酷1920。华为1794tv_info.append("\n状态栏高度:" + DensityUtils.getStatusBarHeight(this));//奇酷72。华为75//需要 root 权限,且可能会被360报毒// DensityUtils.saveBitmap2Pic(DensityUtils.snapShotWithStatusBar(this), FILE_PATH + "1.png");// DensityUtils.saveBitmap2Pic(DensityUtils.snapShotWithoutStatusBar(this), FILE_PATH + "2.png");}@Overridepublic void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus);if (hasFocus) {tv_info.append("\n标题栏高度:" + DensityUtils.getTitleBarHeight(this));//奇酷161。华为168}}}
工具类
public class DensityUtils {//******************************************************************************************// 单位转换//******************************************************************************************/**像素密度*/public static float getDisplayMetrics(Context context) {return context.getResources().getDisplayMetrics().density;}/** dp 转成为 px */public static int dp2px(Context context, float dpValue) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, context.getResources().getDisplayMetrics());}/** px 转成为 dp */public static int px2dp(Context context, float pxValue) {return (int) (pxValue / getDisplayMetrics(context) + 0.5f);}/** sp转px */public static int sp2px(Context context, float spVal) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, context.getResources().getDisplayMetrics());}/** px转sp */public static float px2sp(Context context, float pxVal) {return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);}//******************************************************************************************// 屏幕宽高//******************************************************************************************/** 获取屏幕宽 */public static int getScreenWidth(Context context) {DisplayMetrics metric = new DisplayMetrics();((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metric);return metric.widthPixels;}/** 获取屏幕高,包含状态栏,但不包含某些手机最下面的【HOME键那一栏】,如1920屏幕只有1794 */public static int getScreenHeight(Context context) {DisplayMetrics metric = new DisplayMetrics();((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metric);return metric.heightPixels;}/** 获取屏幕宽 */public static int getScreenWidth2(Context context) {Point point = new Point();((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getSize(point);return point.x;}/** 获取屏幕高,包含状态栏,但不包含某些手机最下面的【HOME键那一栏】,如1920屏幕只有1794 */public static int getScreenHeight2(Context context) {Point point = new Point();((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getSize(point);return point.y;}//******************************************************************************************// 状态栏、标题栏//******************************************************************************************/** 状态栏高度,单位px,一般为25dp */public static int getStatusBarHeight(Context context) {int height = 0;int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) {height = context.getResources().getDimensionPixelSize(resourceId);}return height;}/** 状态栏高度,单位px,【注意】要在onWindowFocusChanged中获取才可以,不建议采用这种方式获取 */public static int getStatusBarHeight2(Activity activity) {Rect rect = new Rect();//DecorView是Window中的最顶层view,可以从DecorView获取到程序显示的区域,包括标题栏,但不包括状态栏。所以状态栏的高度即为显示区域的top坐标值activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);return rect.top;}/**标题栏的高度,【注意】要在onWindowFocusChanged中获取才可以,不建议采用这种方式获取*/public static int getTitleBarHeight(Activity activity) {int contentTop = activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();return contentTop - getStatusBarHeight(activity);}//******************************************************************************************// 屏幕截图//******************************************************************************************/** 获取当前屏幕截图,包含状态栏,需要 root 权限,且可能会被360【报毒】 */public static Bitmap snapShotWithStatusBar(Activity activity) {View view = activity.getWindow().getDecorView();view.setDrawingCacheEnabled(true);view.buildDrawingCache();Bitmap bmp = view.getDrawingCache();int width = getScreenWidth(activity);int height = getScreenHeight(activity);Bitmap bp = null;bp = Bitmap.createBitmap(bmp, 0, 0, width, height);view.destroyDrawingCache();return bp;}/** 获取当前屏幕截图,不包含状态栏,需要 root 权限,且可能会被360【报毒】*/public static Bitmap snapShotWithoutStatusBar(Activity activity) {View view = activity.getWindow().getDecorView();view.setDrawingCacheEnabled(true);view.buildDrawingCache();Bitmap bmp = view.getDrawingCache();Rect frame = new Rect();activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);int statusBarHeight = frame.top;int width = getScreenWidth(activity);int height = getScreenHeight(activity);Bitmap bp = null;bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height - statusBarHeight);view.destroyDrawingCache();return bp;}/** 保存bitmap为图片 */public static void saveBitmap2Pic(Bitmap bitmap, String fileName) {File file = new File(fileName);try {FileOutputStream out = new FileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);out.flush();out.close();} catch (Exception e) {e.printStackTrace();}}}
标签:
原文地址:http://www.cnblogs.com/baiqiantao/p/5634279.html