A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王震阳老师 于 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颜色过滤器ColorMatrixColorFilter
Android提供了颜色过滤器来进行颜色处理。
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
  北京市海淀区东馨园小区

207 个回复

倒序浏览
沙发沙发,虽然不怎么看懂··先收藏了!
回复 举报
顶 ,学习学习
回复 举报
非专业,看不懂,咋办?
回复 举报
王鹏飞 发表于 2015-3-23 22:11
非专业,看不懂,咋办?

世上无难事,
回复 举报
感觉老牛了,我要学安卓
回复 举报
回复 举报
回复看帖   
回复 举报
我就看看 不说话
回复 举报
赞一个。
回复 举报
收藏先,非常感谢
回复 举报
想到自己将来也有可能达到这样的水平就充满了力量!
回复 举报
何明睿 发表于 2015-3-23 22:59
想到自己将来也有可能达到这样的水平就充满了力量!

相信你自己,完全可以的。世上无难事只怕有心人。
回复 举报
我来了看看看
回复 举报
a1301155262 来自手机 中级黑马 2015-3-23 23:49:35
15#
先收藏一下
回复 举报
学了java基础,看这玩意似懂非懂啊,就业班的搞起,希望也能早日向大神级别靠近
回复 举报
shi469391 发表于 2015-3-23 23:50
学了java基础,看这玩意似懂非懂啊,就业班的搞起,希望也能早日向大神级别靠近 ...

加油。
回复 举报
谢谢阳哥:lol
回复 举报
:D学习学习
回复 举报
王震阳老师 发表于 2015-3-23 23:00
相信你自己,完全可以的。世上无难事只怕有心人。

嗯,谢谢王老师!
回复 举报
您需要登录后才可以回帖 登录 | 加入黑马