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图像处理之色彩特效处理
(待续……)