图片大小的计算:图片的像素 * 每个像素所占的大小
- 单色位图:只能表示两种颜色,使用两个数字 0 与 1 表示,使用一个长度为 1 的二进制数组就可以表示了,每个像素占用 1/8 个字节
- 16 色位图:能表示 16 种颜色,需要 16 个数字, 0 - 15, 0000 - 1111
使用一个长度为 4 的二进制数组就能够表示了,每个像素占用 1/2 个字节 - 256 色位图:能表示 256 种颜色
需要 256 个数字:0 - 255, 0000 0000 - 1111 1111
使用一个长度为 8 的二进制数字
每个像素占用 1 个字节 - 24 位位图
每个像素占用 24 位,也就是 3 个字节,所以叫 24 位位图
R: 0 - 255
G: 0 - 255
B: 0 - 255
利用缩放加载大图片
计算机把图片所有像素信息全部解析出来,保存至内存
Android 保存图片像素信息,是用 ARGB 保存的,每个像素占用 4 个字节
手机屏幕 320 x 480,总像素 153600
图片宽高 2400 x 3200,总像素 7680000
2400 / 320 = 7
3200 / 480 = 6
用大的数来缩放,这样才可以在屏幕上显示完整的图片1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33public void click(View v){
Options opt = new Options();
//不为像素申请内存,只获取图片宽高
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile("/sdcaed/dog.jpg", opt);
int width = opt.outWidth();
int height = opt.outHeight();
//获取屏幕宽高
Display dp = getWindowManager().getDefaultDisplay();
int screenWidth = dp.getWidth();
int screenHeight = dp.getHeight();
//api 13 才能使用
//dp.getSize(new Point())
//计算缩放比例
int scale = 1;
int scaleWidth = width / screenWidth;
int scaleHeight = height /screenHeight;
scale = scaleWidth >= screenHeight ? scaleWidth : scaleHeight;
if(scaleWidth >= scaleHeight && scaleWidth >= 1){
scale = scaleWidth;
}else if(scaleWidth < scaleHeight && scaleHeight >= 1){
scale = scaleHeight;
}
//设置缩放比例
opt.inSampleSize = scale;
opt.inJustDecodeBounds = false;
Bitmap bm = BitmapFactory.decodeFile("/sdcaed/dog.jpg", opt);
imageView.setImageBitmap(bm);
}
创建图片副本
在内存中创建一个图片的拷贝1
2
3
4
5
6
7
8
9
10
11
12//这个对象是只读的
Bitmap bm = BitmapFactory.decodeFile("/sdcaed/dog.jpg");
//创建图片副本
//在内存中创建一个与原图一模一样大小的bitmap对象,里面还没有绘制任何内容
//该对象可读可写
Bitmap bmCopy = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), bm.getConfig());
//创建画笔
Paint paint = new Paint();
//创建画板对象
Canvas canvas = new Canvas(bmCopy);
//开始绘制
canvas.drawBitmap(bm, new Matrix(), paint);
简单特效处理
1 | Matrix matrix = new Matrix(); |
触摸事件:画板
1 | Bitmap bm = BitmapFactory.decodeResources(getResources(), R.drawable.bg); |
画板图片的保存
SD卡每次准备的时候,系统会遍历SD卡中的所有文件,系统会把所有的多媒体文件都放在一个MediaStore数据库中生成一个索引,数据库中保存了文件的文件名、路径、大小、长度、艺术家等。
图库、音乐、视频每次启动时,其实不会去遍历SD卡寻找多媒体文件,而是从MediaStore数据库中读取多媒体文件,通过库中的索引找到相对应的多媒体文件后,把文件显示在界面1
2
3
4
5
6
7
8File file = new File(getFilesDir(), "zuopin.png");
FileOutputStream fos = new FileOutputStream(file);
bmCopy.compress(CompressFormat.PNG, 100, fos);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
播放网络音乐
1 | interface MusicInterface{ |
1 | class MusicService extends Service{ |
1 | public class MainActivity extends Activity{ |
播放视频 MediaPlayer + SurfaceView
双缓冲技术
重量级组件
只要不可见,就不会创建,可见时才会创建
只要不可见,就会销毁1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48class MainActivity extends Activity{
MediaPlayer player;
SurfaceView sv;
static int currentPosition;
protected coid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sv= (SurfaceView)findViewById(R.id.surfaceView);
final SurfaceHolder sh = sv.getHolder();
sh.addCallback(new Callback(){
public void surfacceDestoryed(SurfaceHolder holder){
if(plyer != null){
currentPosition = player.getCurrentPosition();
player.stop();
player.release();
player = null;
}
}
public void surfacceCreated(SurfaceHolder holder){
if(player == null){
player = new MediaPlayer();
player.reset();
try{
player.setDataSource(getFilesDir + "/a.mp4");
palyer.setDisplay(holder);
player.prepare();
player.start();
player.seekTo(currentPosition);
}catch(Exception e){
e.printStackTrace();
}
}
}
public void surfacceChanged(SurfaceHolder holder,
int format, int width, int height){
}
});
}
}
VideoView
1 | //本地播放 |
FFMPEG
开源免费的音视频编解码器
Vitamio 视频播放第三方框架
封装了 FFMPEG 的视频播放框架
对外提供的 API 全部都是 java api
封装的有 VideoView1
2
3
4
5
6
7//检测硬件是否支持 Vitamio 引擎
if(!LibsChecker.checkVitamioLibs(this)){
return;
}
video.setVideoPath(getFilesDir + "/a.rmvb");
video.start();
video.setMediaController(new MediaController(this));
拍照与摄像
1 | public image(View v){ |