Android开发基础之屏幕显示

  • Post author:
  • Post category:其他


Android开发基础之屏幕显示

老子 ——– 天下难事必作于易,天下大事必作于细.


  • 像素

  • 颜色

  • 屏幕分辨率

像素

Android中支持的像素单位有:

px

(像素),

in

(英寸),

mm

(毫米),

pt

(英镑,1/72英寸),

dp

(与设备无关的现实单位),

dip

(就是dp),

sp

(用于设置字体大小).

其中常用的有:

px

,

dp



sp

三种.

    px: 手机屏幕上可显示的最小单位,与物理设备的显示屏有关,像素密度越高,以 px 计量的分辨率越大,屏幕越清晰;
    dp: 与物理设备无关,只与屏幕尺寸有关,一般来说,同尺寸的屏幕,以 dp 计量的分辨率是一样的,无论这个手机屏幕是哪个手机厂家生产的, dp 大小都一样;
    sp: 原理与 dp 差不多,专门用于设置字体大小,但是 dp 与系统设置的字体大小没有关系, sp 会随着系统设置的字体大小变大或者变小.所以,系统设置普通字体大小时,同数值的 dp 和 sp 的文字看起来一样大

dp 和 px 的联系取决于具体设备上的像素密度, 像素密度就是 DisplayMetrics 里的 density 参数. 当 density = 1.0 时, 表示一个 dp 值对应一个 px值; 当 density = 1.5 时, 表示 两个 dp 值对应 三个 px值, 具体转换函数如下:

/**
 * Created by Mr.Fu on 2018/2/27 0027.
 * dp(dip) 与 px 之间相互转换
 */

public class Utils {

    /**
     * 根据手机的分辨率从 dp 的单位转成 px(像素)
     * @param context
     * @param dpValue
     * @return
     */
    public static int dip2px (Context context, float dpValue) {

        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素)转成 dp 的单位
     * @param context
     * @param pxValue
     * @return
     */
    public static int px2dip (Context context, float pxValue) {

        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }
}


使用:


1. 在 XML 布局文件中, 为了让不同的设备屏幕拥有统一的显示效果, 除了 sp 用于设置字体大小以外, 其他使用大小的地方都是用 dp.

2. 在代码中情况又有所不同, Android 中用于设置大小的函数都是以 px 为单位的, 所以要在代码中设置布局的大小或间距, 都需要先把 dp 值转换成 px 值 (

设置字体大小时不用进行转换,直接使用 sp 的数值

),


示例代码如下:

        TextView tv_padding = findViewById(R.id.tv_padding);
        TextView tv_hello = findViewById(R.id.tv_hello);

        int padding = Utils.dip2px(this, 8.0f);
        tv_padding.setPadding(padding, padding, padding, padding);     // 设置内间距

        tv_padding.setTextSize(20);     // 设置字体大小
        float size = tv_padding.getTextSize();
        Log.i(TAG, "padding 字体大小: " + size);    // size = 60.0
        float size2 = tv_hello.getTextSize();
        Log.i(TAG, "hello 字体大小: " + size2);     // size2 = 60.0 在 xml布局文件中设置 textSize = 20

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="com.fu.mr.screendisplay.MainActivity">

    <TextView
        android:id="@+id/tv_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:background="@color/colorPrimary"
        android:textSize="20sp"
        android:text="Hello World!" />

    <TextView
        android:id="@+id/tv_padding"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorAccent"
        android:text="Hello World!" />
</LinearLayout>

运行效果:

这里写图片描述

颜色

在 Android 中,颜色值由

透明度 alpha



RGB (红, 绿, 蓝)

三原色组成, 有八位十六进制数和六位十六进制数两种编码

1. 八位编码, 如

FFEEDDCC

, 其中

FF

表示透明度,

EE

表示红色浓度,

DD

表示绿色浓度,

CC

表示蓝色浓度

(透明度为 FF, 表示完全不透明, 为 00 表示完全透明, RGB 三原色的数值越大颜色越浓也就越亮, 数值越小颜色越暗, 亮到极致就是白, 暗到极致就是黑)

;

2. 六位编码有两种情况, 在 XML 布局文件中默认不透明

(透明度为 FF)

, 在代码中默认透明

(透明度为 00)

,所以在代码中使用六位编码看不到任何背景(颜色)

在 Android 中,使用颜色有下列 3 种方式:

  1. 使用系统已定义的颜色常量(12种, android.graphics.Color 类中)

    Color.BLACK 黑色
    Color.BLUE 蓝色
    Color.CYAN 青绿色
    Color.DKGRAY 灰黑色
    Color.GRAY 灰色
    Color.GREEN 绿色
    Color.LTGRAY 浅灰色
    Color.MAGENTA 红紫色
    Color.RED 红色
    Color.TRANSPARENT 透明
    Color.WHITE 白色
    Color.YELLOW 黄色
    
  2. 使用十六进制的颜色编码

    在布局文件中设置颜色需要在色值前面加 **"#"**, 如 android:textColor="#FF34fd45"
    在代码中设置颜色, 可以直接使用八位十六进制数值, 如 tv_padding.setTextColor(0xff00ff00); 
    因为六位编码在代码中设置默认为透明,所以一般不使用六位编码
    
  3. 使用 colors.xml 中定义的颜色

    res/values 目录下有个 colors.xml 文件,是颜色常量的定义文件, 
    在布局文件中使用 XML 颜色常量, 可引用 "@color/ 颜色常量名", 如: 
    android:background="@color/colorAccent" , 
    在代码中使用 XML 颜色常量, 可通过这样代码获取:
    tv_hello.setBackgroundColor(getResources().getColor(R.color.colorAccent));
    



(未完, 待续 … …)

屏幕分辨率



版权声明:本文为Mr_FuSS原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。