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
相信你自己,完全可以的。世上无难事只怕有心人。

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