多媒体应用: 图形、音频、视频

多媒体应用是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工程,界面效果见

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值