多媒体应用是Android 中比较有趣的部分,本博客内容很长
一 图形
1 基本图形
绘制图形通常在android.view.View 或子类的onDraw 方法中进行.方法定义如下:
protected void onDraw(Canvas canvas);主要包括绘制像素点、直线、圆形、弧、文本
一个示例:绘制基本的图形和文本,要实现用程序控制View 的重绘,只需要调用View 类的invalidate 方法即可.也就是说,调用invalidate 方法后,系统就会调用onDraw 方法来重绘View ,本示例中运用了触摸事件(onTouchEvent)
具体代码请参见 my_draw 工程,界面效果见
2 绘制位图
绘制位图有两种方式:
(1) 绘制Bitmap对象 ,使用此方式需要装载图像资源,并获得图像资源的InputStream 对象.
具体代码如下:
protected void onDraw(Canvas canvas)
{
//装载图像资源, 并获得 InputStream 对象
InputStream is = context.getResource().openRawResource(R.drawable.panda);
BitmapFactory.Option opt = new BitmapFactory.Options();
opts.inSampleSize = 2; //按2:1比例绘制
//InputStream 对象解码成 Bitmap 对象
Bitmap bitmap = BitmapFactory.decodeStream(is, null, opts);
canvas.drawBitmap(bitmap, 10, 10, null);
}
注意:inSampleSize 属性表示原位图与绘制的位图的比例,如果该属性值为1 ,表示原位图和绘制的位图的大小比例是1:1, 如果该属性值为2, 表示按原位图50%(2:1) 的大小绘制位图
2. 使用Drawable.draw 方法绘制位图
这种方式先获得图像资源的Drawable对象,然后使用Drawable.draw 方法绘制位图,代码如下:
protected void onDraw(Canvas canvas) {
//获得图像资源的Drawable对象
Drawable drawable = context.getResource().getDrawable(R.drawable.button);
// 设置位图的左上角坐标(前两个参数值)和绘制在View 上的位图宽度和高度(后两个参数值)
drawable.setBounds(50, 350, 180, 420);
//绘制位图
drawable.draw(canvas);
}
具体代码参见 ch10_drawbitmap 工程, 界面效果
--------------------------------------
再来一个旋转图像的示例,ch10_roundanim工程,界面效果(实际上是一个动画,有点遗憾)
要如何旋转图像,基本原理是通过Matrix类的setRotate() 设置要旋转的角度(正值为顺时针,负值为逆时针),然后使用Bitmap.createBitmap方法创建一个已经旋转了的图像(Bitmap对象)。
代码如下:
Matrix matrix = new Matrix();
matrix.setRotate(); //顺时针旋转50度
Bitmap bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
要实现不断旋转的动画,只需要在onDraw()中调用invalidate() 即可,每调用一次 invalidate(),onDraw 方法就会调用一次,当在onDraw() 中调用invalidata()时,就意味着onDraw方法会不断被调用,因此只要将旋转图像的代码放在 onDraw 方法中就会使图像不断地旋转.
---------------------------------------
接着看一个扭曲图像的示例 ch10_mess工程,界面mess.jpg, mess2.jpg 注意扭曲图像的算法
示意图如下
--------------------------------------------------------
二 音频
使用android.media.MediaPlayer 类可以播放MP3 音频资源,音乐可以是包含在apk文件中、保存在SD卡、手机内存中的MP3文件
播放 在apk中的MP3 文件的代码如下:
// 通过MediaPlayer 类的 create 方法指定保存在res\raw 目录中的MP3 资源,并创建MediaPlayer 对象
MediaPlayer mp = MediaPlayer.create(this,R.raw.music);
if(mp != null)
mp.stop();
// 在播放MP3资源之前,必须调用perpare()完成一些准备工作
mp.prepare();
mp.start(); // 开始播放MP3 音频资源
-----------
如果要播放保存在SD卡或手机内存中的MP3,需要以下代码:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource("/sdcard/music.mp3"); // 指定 mp3 文件的路径
mp.prepare();
mp.start();
具体代码请参见 my_playmp3工程, 效果 见
, 主要是听播放声音,界面倒在其次
-------------
再看一个录音的示例, 录音必须在真机上才能实现
使用android.media.MediaRecorder 类可以通过手机的mic录音,代码如下:
File recordAudioFile = File.createTempFile("record", ".amr");
MediaRecorder mediaRecorder = new MediaRecorder();
// 1. 指定音频来源: mic
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 2. 指定音频输出格式: MPEG4
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
// 3. 指定音频编码方式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 4. 指定录制的音频信息输出的文件
mediaRecorder.setOutputFile(recordAudioFile.getAbsolutePath());
// 5. 调用prepare方法
mediaRecorder.prepare();
// 6. 调用start 方法开始录音
mediaRecorder.start();
具体代码请参见 ch10_recorder工程,界面效果见
-------------------
三 视频
使用 Video View 播放视频的示例
使用 android.widget.VideoView 组件可以播放MP4的H.264、3GP和WMV格式的视频文件,主要代码如下:
// 指定要播放的视频文件
videoView.setVideoURI(Uri.parse(file://sdcard/video.3gp));
// 设置视频控制器
videoView.setMediaController(new MediaController(this));
// 开始播放视频
videoView.start();
如果要暂停或停止,代码如下:
videoView.pause(); // 暂时视频
videoView.stopPlayback(); // 停止视频
具体代码请参见 ch10_playvideo 工程,界面效果见
---------------
使用SurfaceVie 播放视频
VideoView 组件可以播放视频,但播放的位置和大小并不受我们的控制,这时可以使用MediaPlayer 配合 SurfaceView 来播放视频
在使用SurfaceView 组件之前需要创建SurfaceHolder 对象,并进行相应的设置,代码如下:
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
SurfaceHolder surfaceHolder = surfaceView.getHolder();
surfaceHolder.setFixexSize(100, 100); // 用来设置播放视频界面的固定大小
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
播放视频代码如下:
mediaPlayer = new MediaPlayer();
// 设置音频流类型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
// 设置用于播放视频的SurfaceView 组件
mediaPlayer.setDisplay(surfaceHolder);
try{
//指定视频文件
mediaPlayer.setDataSource("sdcard/simaoyi.3gp");
mediaPlayer.prepare();
mediaPlayer.start();
}catch(Exception e){}
使用MediaPlayer 播放视频的关键是指定用于显示视频的 SurfaceView 对象(通过setDiaplay方法)。暂停和停止可以直接使用MediaPlayer类的pause() 和 stop()。
具体代码请参见 ch10_surfaceview工程,界面效果见