1 计算机表示图形的几种方式
多媒体:(包含文字 图片 音频 视频)
图形的大小 = 图片的总像素 * 每个像素的大小
单色 每个像素最多可以表示2种颜色 只需要使用长度为1的二进制位来表示 那么每个像素占1/8byte
16色 每个像素最多可以表示16种颜色 0000 - 1111 那么只需要使用长度为4的二进制表示 那么每个像素占1/2个byte
256色 每个像素最多可以表示256种颜色 0000 0000 - 1111 1111 那么只需要使用长度8的二进制位表示 那么每个像素占1byte
24位 rgb
r 1byte 0-255
g 1byte 0-255
b 1byte 0-255 那么一个像素占3byte
jpg 格式
png 格式 Android采用的是png格式
2 缩放加载加载大图片
09-14 00:59:51.813: E/AndroidRuntime(2128): Caused by: java.lang.OutOfMemoryError
09-14 00:59:51.813: E/dalvikvm-heap(2128): Out of memory on a 30720012-byte allocation.
在Android下采用ARGB来表示颜色 每个像素占4byte
图片:2400*3200
手机:320*480
宽缩放: 7
高缩放: 6
需要考虑的问题 (1)动态获取图片的分辨率
(2)动态获取手机分辨率
实现步骤 (***)
(1)获取手机的宽和高
(2)获取图片的宽和高
(3)计算缩放比
(4)按照缩放比显示图片
3 创建原图的副本
步骤如下
4 图形处理的api
[1]旋转
matrix.setRotate(
degrees
, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2);
[2]缩放
matrix.setScale(0.5f, 0.5f);
[3]位移
matrix.setTranslate(20, 0);
[4]倒影效果
[5]镜面效果
5 画画板小案例
主要代码如下
//[4]给iv设置一个触摸事件
iv.setOnTouchListener(new OnTouchListener() {
int startX = 0;
int startY = 0;
@Override
public boolean onTouch(View v, MotionEvent event) {
//[5]获取手指触摸的事件类型
int action = event.getAction();
//[6]具体判断一下是什么事件类型
switch (action) {
case MotionEvent.ACTION_DOWN: //按下
//[7]获取手指按下坐标
startX = (int) event.getX();
startY= (int) event.getY();
System.out.println("按下:"+startX+"---"+startY);
break;
case MotionEvent.ACTION_MOVE://移动
//[8]获取停止的坐标
int stopX = (int) event.getX();
int stopY = (int) event.getY();
System.out.println("移动:"+stopX+"---"+stopY);
//[9]画线
canvas.drawLine(startX, startY, stopX, stopY, paint);
//[9.1]更新一下起点坐标
startX = stopX;
startY = stopY;
//[10]记得更新ui
iv.setImageBitmap(copyBitmap);
break;
case MotionEvent.ACTION_UP: //抬起;
break;
}
return true;
}
});
}
6 撕衣服小案例
//[5]给iv设置一个触摸事件
iv.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//[6]获取触摸事件的类型
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE: //移动
for (int i = -7; i < 7; i++) { //改变x
for (int j = -7; j <7; j++) {
//为了 良好的用户体验 撕一个圆
if (Math.sqrt(i*i+j*j)<7) {
//一次修改一个像素
try {
alterbBitmap.setPixel((int)event.getX()+i, (int)event.getY()+j, Color.TRANSPARENT);
} catch (Exception e) {
}
}
}
}
//一定要记得更新iv
iv.setImageBitmap(alterbBitmap);
break;
}
return true;
}
});
7 使用mediaplayer播放音频文件
[1]作用:这个类用于播放音频或者是视频
8 百度音乐盒完成
[1]获取当前歌曲进度和总时长
[2]在服务中添加一个播放进度的方法
[3]通过handler 把数据传递到mainActivity
[4]seekbar处理数据
9 mediaplayer的生命周期
10 surfaceview介绍
[1]surfaceview 控件是一个重量级控件
[2]内部维护了2个线程
A 获取数据 负责显示
B 负责显示 获取数据
[3]他可以直接在子线程更新ui 与进度相关的控件可以直接在子线程更新ui
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到控件
final SurfaceView sfv = (SurfaceView) findViewById(R.id.sfv);
final SurfaceHolder surfaceHolder = sfv.getHolder();
//添加一个callback
surfaceHolder.addCallback(new Callback() {
//当surfaceview销毁的时候调用
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
System.out.println("surfaceDestroyed");
if (player!=null && player.isPlaying()) {
//获取当前视频播放的位置
currentPosition = player.getCurrentPosition();
player.stop();
}
}
//当surfaceview 初始化了
@Override
public void surfaceCreated(SurfaceHolder holder) {
//[1]初始化mediaplayer
player = new MediaPlayer();
//[2]设置要播放的资源 path 可以是本地也可是网络路径
try {
player.setDataSource("http://192.168.13.89:8080/cc.MP4");
//[2.1]设置播放视频的内容 SurfaceHolder 是用来维护视频播放的内容
player.setDisplay(surfaceHolder);
//[3]准备播放
// player.prepare();
player.prepareAsync();
//设置一个准备完成的监听
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//[4]开始播放
player.start();
//[5]继续上次的位置继续播放
player.seekTo(currentPosition);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
});
补充1 VideoView
[1]这个控件就是对surfaceview 和 meidiaplayer进行封装
[2]meidiaplayer 播放视频他只支持 3gp MP4格式
补充2 vitamio框架
meidiaplayer
videoview
ffmpeg 是由好几十个C大神写的
不重复造轮子 谷歌
多线程断点下载
xutils 360手机助手 腾讯助手
11照相和录像
三星 小米 华为 ....
深圳 华强北
代码如下