Android绘图机制(一)--屏幕尺寸信息

来源:互联网 发布:数据分析就业前景 编辑:程序博客网 时间:2024/06/06 00:28

前言:

在看完Android群英传这本书后,感觉自己还是空落落的,整本书看的很快,追求速度,和里面的代码实现,想着知道怎么用就行了,后来到了整个项目的开发时就觉得,确实是知道怎么做,却很难脱离书本,或者是源码去写自己的东西,所以我打算停下目前这种赶进度的心态,真正的沉下来,把这本数好好的回味一遍.也希望和我有同样想法的朋友,不要急于求成,这样不仅不能学好,而且会让自己感受不到Android的魅力,而渐渐的丧失学习的动力.
我先写Android的绘图机制是为了后面自定义View,做下铺垫的.索然书上安排的顺序是先讲解自定义View,再讲解绘图机制的,可能希望我们有一个整体的把握,但是这样比较难以入门,所以我觉得应该再学习自定义View前,先把绘图机制弄明白,后续自定义View也会学的轻松一些.好了言归正转,下面就是本篇博客的主题内容了.

概述

想要了解如何绘制图形,首先得要了解一些背景知识.我们绘制图形的硬件基础就是那块手机屏幕,所以想要了解如何画好一幅画,首先得对画画的纸有着深入的理解,才能画出一幅画.Android的手机屏幕,不管是分辨率,还是大小都是五花八门的样式.这在一定程度上提高了绘图的难度.要想保证再不同的屏幕上我们所绘出的图形的准确性,那么我们就必须对屏幕有着充分的认知

屏幕参数

手机屏幕的常用参数有

  • 屏幕大小 : 指屏幕对角线的长度, “寸”

  • 分辨率 : 指手机屏幕上的像素点的个数

  • PPI : 又叫DPI 每英寸像素 , 由对角线的像素点数除以屏幕大小 , 通常400PPI就很高了

系统屏幕密度

系统定义了几个标准的DPI值,作为手机固定的DPI

密度 ldpi mdpi hdpi xhdpi xxhdpi 密度值 120 160 240 320 480

独立像素dp

Android系统以mdpi的屏幕为标准,1px = 1dp , 其他屏幕则通过该比例进行换算
ldpi : mdpi : hdpi : xhdpi : xxdpi = 3 : 4 : 6 : 8 : 12.

注: px是像素的意思 , 即屏幕中可以显示的最小单元 , pt则是磅数的意思,常用作字体的单位 , dp , sp则是全新单位,他们代表了在这个屏幕中的一个比例大小.以保证不同的控件在不同的密度的屏幕上的显示比例保持一致.

单位转换

package com.example.screenutil;import android.content.Context;import android.util.TypedValue;public class DisplayUtil {    /**     * 将px转换为dip,保证尺寸大小不变     */    public static int px2dp(Context context , float pxValue){        final float scale = context.getResources().getDisplayMetrics().density;//换算比例        return (int)(pxValue/scale + 0.5f);    }    /**     * 将dip或dp转换为px值,保证尺寸大小不变     */    public static int dip2px(Context context , float dipValue){        final float scale = context.getResources().getDisplayMetrics().density;        return (int)(dipValue * scale + 0.5f);    }    /**     * 将px值转换为sp,保证文字大小不变     */    public static int px2sp(Context context , float pxValue){        final float fontScale = context.getResources().getDisplayMetrics().density;        return  (int)(pxValue/fontScale + 0.5f);    }    /**     * 将sp值转换为px值     */    public static int sp2px(Context context , float spValue){        final float fontScale = context.getResources().getDisplayMetrics().density;        return (int)(spValue * fontScale + 0.5f);    }    /**     *系统提供的TypeValue类也可以用于转换     * dp2px     */    protected  int dp2px(Context context,int dp){        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP , dp ,context.getResources().getDisplayMetrics());    }    /**     * sp2px     */    protected int sp2px(Context context , int sp){        return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP , sp , context.getResources().getDisplayMetrics());    }}
0 0
原创粉丝点击