《Android群英传》读书笔记6.Android绘图机制与处理技巧

1. 屏幕的尺寸信息

1.1. 屏幕参数

  • 屏幕大小:指屏幕对角线的长度,例如4.7寸手机、5.5寸手机
  • 分辨率:指手机屏幕的像素点个数,例如720×1280,指宽有720个像素点,而高有1280个像素点
  • PPI:每英寸像素(Pixels Per Inch)又被称为DPI(Dots Per Inch),由对角线的像素点数除以屏幕的大小得到

1.2. 系统屏幕密度

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

密度 ldpi mdpi hdpi xhdpi xxhdpi
密度值 120 160 240 320 480
分辨率 240×320 320×480 480×800 720×1280 1080×1920

注:此表仅供参考,如小米4c手机,分辨率1920×1080,尺寸5英寸,屏幕像素密度441ppi。因在具体应用中1dp = 3px,故密度为xxhdpi

1.3. 独立像素密度dp

由于各种屏幕密度的不同,导致同样像素大小的长度,在不同密度的屏幕上显示长度不同
Android系统使用mdpi的屏幕作为标准,在这个屏幕上1px = 1dp
例如同样是100dp的长度,在mdpi中为100px,而在hdpi中为150px
在hdpi中1dp = 1.5px,在xhdpi中1dp = 2px,在xxhdpi中1dp = 3px

1.4. 单位转换

可将dp、sp转换为px的工具类保存到项目中

2. 2D绘图基础

系统通过提供的Canvas对象来提供绘图方法,如drawPoint(点)、drawLine(直线)、drawLines(多条直线)、drawRect(矩形)、drawRoundRect(圆角矩形)、drawCircle(圆)、drawVertices(多边形)、drawArc(弧形或扇形)、drawOval(椭圆)、drawText(文本)、drawPosText(指定位置文本)、drawPath(路径)等等,例

paint.setStyle(Paint.Style.STROKE);
canvas.drawRect(left, top, right, bottom, paint);

3. Android XML绘图

3.1. Bitmap

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/ic_launcher">

3.2. Shape

例子:通过渐变实现阴影效果

<?xml version="1.0" encoding="uft-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" // 默认为rectangle android:shape="rectangle">

    <corners // 当shape="rectangle"时使用 // 半径,会被topLeftRadius等单个半径属性覆盖,默认为1dp android:radius="8dp"/>

    <gradient // 渐变 android:startColor="#FF5DA2FF" android:endColor="#805FBBFF" android:angle="45"/>

    <padding  android:left="7dp" android:top="7dp" android:right="7dp" android:bottom="7dp"/>
</shape>

3.3. Layer

<?xml version="1.0" encoding="uft-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_launcher" />
    <item  android:drawable="@drawable/ic_launcher" android:left="10.0dip" android:top="10.0dip" android:right="10.0dip" android:bottom="10.0dip" />
</layer-list>

通过layer、layer-list可以实现图层效果,图片会依次叠加

3.4. Selector

Selector的作用在于帮助开发者实现静态绘图中的事件反馈,通过给不同的事件设置不同的图像,从而在程序中根据用户输入,返回不同的效果

<?xml version="1.0" encoding="uft-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 默认时的背景图片 -->
    <item android:drawable="@drawable/X1" />
    <!-- 没有焦点时的背景图片 -->
    <item android:state_window_focused="false" android:drawable="@drawable/X2" />
    <!-- 非触摸模式下获得焦点并单击时的背景图片 -->
    <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/X3" />
    <!-- 触摸模式下单击时的背景图片 -->
    <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/X4" />
    <!-- 选中时的图片背景 -->
   <item android:state_selected="true" android:drawable="@drawable/X5" />
    <!-- 获得焦点时的图片背景 -->
   <item android:state_focused="true" android:drawable="@drawable/X5" />
</selector>

4. Android绘图技巧

4.1. Canvas

  • Canvas.save():保存画布,将之前的所有已绘制图像保存起来,让后续的操作就好像在一个新的图层上操作一样
  • Canvas.restore():合并图层操作,将在save()之后绘制的所有图像与save()之前的图像进行合并
  • Canvas.translate():画布平移,即坐标系平移。在调用translate(x, y)方法之后,则将原点(0, 0)移动到了(x, y),之后的所有绘图操作都将以(x, y)为原点执行
  • Canvas.rotate():画布翻转,即坐标系翻转,将坐标系旋转一定的角度

4.2. Layer图层

Android通过调用saveLayer()方法、saveLayerAlpha()方法将一个图层入栈,使用restore()方法、restoreToCount()方法将一个图层出栈。入栈的时候,后面所有的操作都发生在这个图层上,而出栈的时候,则会把图像绘制到上层Canvas上。

5. Android图像处理之色彩特效处理

(待续……)

你可能感兴趣的:(android)