第六章:Android 绘图机制与处理技巧

2018-08-18  本文已影响0人  夜瑾漠

《Android群英传》——个人读书笔记

6.1 屏幕的尺寸信息

6.1.1 屏幕参数

6.1.2 系统屏幕密度

        不同的手机厂商,不同的手机,不同的大小尺寸,不同的像素密度。想要统一,基本不可能。因此,系统定义了几个标准的DPI值:

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

6.1.3 独立像素密度 dp

1)Android系统使用 mdpi 的屏幕作为标准屏幕,在此屏幕上 1px = 1dp
2)密度的换算公式:

密度 Idpi mdpi hdpi xhdpi xxhdpi
换算公式 \ 1dp = 1px 1dp = 1.5px 1dp = 2px 1dp = 3px

各个分辨率的比例:Idpi:mdpi:hdpi:xhdpi:xxhdpi = 3:4:6:8:12

6.1.4 单位转换

6.2 2D绘图基础

6.3 Android XML绘图

6.3.1 mipmap

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

这样引用图片,可以直接将图片转换成Bitmap

6.3.2 Shape

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 填充的颜色 -->
    <solid android:color="#ffffff" />

    <!-- 设置边框宽度 -->
    <stroke
        android:color="#ffffff"
        android:width="1dp" />

    <!-- 四个角的弧度 -->
    <corners
        android:bottomLeftRadius="15dp"
        android:bottomRightRadius="15dp"
        android:topLeftRadius="15dp"
        android:topRightRadius="15dp" />

    <padding
        android:bottom="5dp"
        android:left="2dp"
        android:right="2dp"
        android:top="5dp" />

</shape>

除此之外还有好多其他属性,这里不再说明

6.3.3 Layer

        通过Layer可以实现类似PhotoShop中图层的概念

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 阴影部分 -->
    <!-- 个人觉得更形象的表达:top代表下边的阴影高度,left代表右边的阴影宽度。其实也就是相对应的offset,solid中的颜色是阴影的颜色,也可以设置角度等等 -->
    <item
        android:bottom="2dp"
        android:left="2dp"
        android:right="2dp"
        android:top="2dp">
        <shape android:shape="rectangle">
            <gradient
                android:endColor="#ED1A3D"
                android:startColor="#ED1A3D" />
        </shape>
    </item>
    <!-- 背景部分 -->
    <!-- 形象的表达:bottom代表背景部分在上边缘超出阴影的高度,right代表背景部分在左边超出阴影的宽度(相对应的offset) -->
    <item
        android:bottom="3dp"
        android:left="3dp"
        android:right="3dp"
        android:top="3dp">
        <shape android:shape="rectangle">
            <gradient
                android:endColor="#1D1D27"
                android:startColor="#1D1D27" />
        </shape>
    </item>
</layer-list>

6.3.4 Selector

        用于实现静态绘图中的反馈

<?xml version="1.0" encoding="utf-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>

6.4 Android 绘图技巧

6.4.1 Canvas

    绘制图形的直接对象

6.4.2 Layer

    1)图层入栈:saveLayer()saveLayerAlpha()
    2)图层出栈:restore()restoreToCount()

6.5 Android图像处理之色彩特效处理

6.5.1 色彩矩阵分析

6.5.1.1 改变偏移量

6.5.1.2 改变颜色系数

6.5.1.3 改变色光属性

6.5.2 Android颜色矩阵——ColorMatrix

6.5.3 常用图像颜色矩阵处理效果

6.5.3.1 灰度效果

6.5.3.2 图像反转

6.5.3.3 怀旧效果

6.5.3.4 去色效果

6.5.3.5 高饱和度

6.5.4 像素点分析

        更加精准的像素处理方式,可以通过改变每个像素点的具体ARGB值,来处理图像。

需注意,传递进来的原始图像是不可以直接进行修改的,要根据原始图像生成一张新的图像来进行改动。

bitmap.getPixels(pixels, offset, stride, x, y, width, height) 提取像素点的方法

参数的含义:

6.5.5 常用图像像素点处理效果

6.5.5.1 底片效果

6.5.5.2 老照片效果

6.5.5.3 浮雕效果

6.6 Android图像处理之图形特效处理

6.6.1 Android 变形矩阵——Matrix

6.6.1.1 平移变换

6.6.1.2 旋转变换

6.6.1.3 缩放变换

6.6.1.4 错切变换

6.6.2 像素块分析

drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight,float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint)

其中最重要的参数是一个数组——verts

6.7 Android图像处理之画笔特效处理

6.7.1 PoterDuffXfermode

6.7.2 Shade

        又被称为 着色器渲染器,用于实现渐变、渲染的效果。

6.7.3 PathEffect

        就是用各种笔触效果来绘制一个路劲

6.8 View 之孪生兄弟——SurfaceView

6.8.1 SurfaceView 与 View 的区别

        View 通过刷新来重绘视图,Android系统通过发出VSYNC信号来进行屏幕的重绘,刷新时间间隔在16ms。如果View的绘制超过16ms,用户就会产生视觉上的卡顿。

如果自定义的View需要频繁的刷新或者刷新时处理的数据量较大,那么就可以考虑考虑使用SurfaceView了。

6.8.2 SurfaceView 的使用

注意,这里获取到的Canvas对象还是继续上次的Canvas对象,而不是一个新的对象。之前的绘图操作都将被保留。但是可以通过 drawColor() 来进行清屏操作。

6.8.3 SurfaceView 实例

6.8.3.1 正弦曲线

6.8.3.2 绘图板

上一篇 下一篇

猜你喜欢

热点阅读