本帖最后由 王震阳老师 于 2015-3-23 22:27 编辑
汇总贴:http://bbs.itheima.com/thread-180149-1-1.html
pdf附件回复可下载: 1. 加载大图片(★★★)Android虚拟机默认为每个应用分配的堆内存空间是16M,当加载大图片时,加载图片需要的内存空间不是按图片的大小来算的,而是按像素点的多少来算的。图片加载到内存中需要把每一个像素都加载到内存中. 所以对内存的要求非常高, 一不小心就会造成OOM(OutOfMemoryError) 内存溢出致命错误。 假设: 当前有一张图片,大小仅为1M,但是其规格为3648*2736,现在需要加载此图片总像素数=3648*2736=9980928 三种像素单位如下: ARGB_4444 : 2bytes ARGB_8888 : 4bytes RGB_565 : 4bytes 假设现在像素采用ARGB_4444标准,则其占用的总空间为: 图片占用空间=总像素数 *像素的单位 =9980928 * 2bytes =19961856bytes =19M>16M OOM内存溢出 解决方案: Java代码可以对图片进行比例缩放 假设: 图片的宽和高: 3648 * 2736 屏幕的宽和高: 320 * 480
计算缩放比: 宽度缩放比例: 3648 / 320 = 11 高度缩放比例: 2736 / 480 = 5 比较宽和高的缩放比例, 哪一个大用哪一个进行缩放 缩放后的图片: 3648 / 11 = 331 2736 / 11 = 248 缩放后图片的宽和高: 331* 248 331* 248=882088 * 2bytes=160K 1.1实现图片的缩放加载:这里只给出核心代码,用于演示加载大图片的原理。 普通方法加载图片代码清单: 采用缩放方式加载图片:
2. 图片加水印(★★)Android提供了两个类Canvas和Paint: Canvas 画画板,用于绘制各种图形(点, 线, 圆, 矩形等等) Paint 画笔,和Canvas搭配使用,用于指定绘制的颜色, 线条的粗细, 过 渡, 渐变等效果。 使用方法: 2.1图片加水印代码实现 需求:图片加水印,即准备一张原图和一张水印图片,然后对两个图片进行合成。 前提知识:两张图片的合成有如下几种方式,在该案例中我们为了让两张图片都显示,因此我们选择Darken方法。图片合成的几种方式见下图。
现在有两张图片,1、原图: - 水印:
:这里我会新创建一个Android工程,并把这两个资源加入到drawable目录中。关于创建工程的步骤等简单操作在以后的文档中就一笔带过,我们直接将重点放在核心代码上。 图片合成代码清单: 运行上面的代码,效果图如下: 我们发现在Android图片的右下角成功添加了黑马的LOGO作为水印。 3. 图片特效(★★)图片的特效包括,图形的缩放、镜面、倒影、旋转、位移等。图片的特效是将原图的图形矩阵乘以一个特效矩阵,形成一个新的图形矩阵来实现的。 Matrix维护了一个3*3的矩阵去更改像素点的坐标。 图形的默认矩阵用数组表示为: { 1, 0, 0, 表示向量x = 1x + 0y + 0z 0, 1, 0, 表示向量y = 0x + 1y + 0z 0, 0, 1 } 表示向量z = 0x + 0y + 1z 通过更改图形矩阵的值,可以做出缩放/镜面/倒影等图片特效。 下面分别给出各种特效实现的代码,在代码中会有详细的注释。 3.1缩放 矩阵示例: { 2, 0, 0, 0, 1, 0, 0, 0, 1 } 意义:x轴所有的像素点放大2倍, 展现的效是: 图片宽度x2 代码清单: 3.2[color=rgb(87, 137, 220) !important][url=]镜面[/url] 矩阵示例: { -1, 0, 0, x坐标变为复数,代表以y轴为镜面成像 0, 1, 0, 0, 0, 1 } 意义:x轴所有的像素点沿负数方向反过来, 展现的效果是: 镜面。 通过上面的代码其实我们发现镜面的代码跟缩放其实基本相同的,唯一不同的就是矩阵的参数不同而已。 3.3倒影 矩阵示例: { 1, 0, 0, x轴不变 0, -1, 0, y轴变为负数 0, 0, 1 } y轴所有的像素点沿负数方向反过来, 展现的效果是: 倒影 :倒影的代码跟3.2章节中的代码一样,唯一不同的就是矩阵参数不同。同时为了看到倒影后的效果需要在矩阵中添加如下代码: 3.4旋转Matrix中提供了设置图片旋转角度的方法: setRotate(float degrees, float px, float py) degrees:要旋转的角度 px : 旋转原点的X轴坐标 py : 旋转原点的Y轴坐标 3.5位移Matrix中提供了设置图片位移的方法: setTranslate(float dx, float dy) dx : 位移的X轴距离 dy : 位移的Y轴距离
4. 图片颜色处理(★★)4.1颜色过滤器ColorMatrixColorFilterAndroid提供了颜色过滤器来进行颜色处理。 ColorMatrixColorFilter:通过使用一个4*5的颜色矩阵来创建一个颜色过滤器,改变图片的颜色信息。 图形颜色默认矩阵是一个4x5的矩阵, 数组表现为: {1, 0, 0, 0, 0, // red 1*R + 0*G + 0*B + 0*A + 0 0, 1, 0, 0, 0, // green 0*R + 1*G + 0*B + 0*A + 0 0, 0, 1, 0, 0, // blue 0*R + 0*G + 1*B + 0*A + 0 0, 0, 0, 1, 0} // alpha 0*R + 0*G + 0*B + 1*A + 0 颜色矩阵的每一行的最后一个值更改时,其对应的颜色值就会发生改变,所以更改颜色只需修改其对应颜色矩阵行的最后一项的值即可,最大值范围为255。 4.2实现图片美化功能 需求:加载一张图片,通过4个SeekBar分别调整R(Red)、G(Green)、B(Blue)、A(Alpha)值,第四个同时改变RGB值,实现图片颜色的变亮。 设置页面布局 在drawable目录下放置一张需要处理的图片 实现业务逻辑代码 运行效果如下图:
5. 案例-随手涂鸦(★★)5.1实现原理Android中只有View才可以捕获到用户触摸的事件。 ImageView控件可以设置一个触摸事件的监听器来监听触摸事件,重写OnTouchListener的onTouch方法,结合Canvas类,即可实现随手涂鸦的画板功能 :onTouch方法的返回值默认是false的,必须设置为true,否则触摸事件将 不会被处理。 触摸事件的类型分为: MotionEvent.ACTION_DOWN 按下 MotionEvent.ACTION_MOVE 移动 MotionEvent.ACTION_UP 抬起 5.2代码实现 需求:手指在界面滑动的时候绘制线条。点击保存按钮可以将绘制的图形保证到存储卡上,点击取消按钮可以将当前界面清空。 布局文件比较简单,这里不再给出。 代码清单: 运行改项目,效果如下图: 6. 案例-撕衣服游戏(★★)6.1实现原理使用帧布局,准备2张图片,一张图片有衣服,一张图片没有衣服。没有衣服的图片放置在下面,有衣服的图片放置在上面,为在上面的ImageView设置触摸的事件,当手指触摸到图片上时,将手指触摸的点周边的上层图片的像素点设置为透明的,就会出现一个撕衣服的效果。 : - 触摸事件onTouch的返回值必须设置为true,否则触摸的事件将不被处理
- 使用BitmapFactory的decodeResouces方法得到的图片是没有透明度的,即图片格式为RGB_565,所以若想能够修改透明度,需要使用Canvas对象对图片进行重绘,重新绘制的图片格式采用ARGB。
- 加载图片时需要对其进行一下压缩,防止图片与控件大小不匹配,导致触摸时点对不上,达不到触摸那里就设置哪里的像素点透明的效果。
6.2 代码实现运行效果如下图所示:
至此,本文档完! 2014-12-21 14.12.21 北京市海淀区东馨园小区
|