介绍App开发常见的多媒体技术,主要包括如何使用各种图像控件实现自定义相册、如何使用几种主要的音频播放技术、如何使用几种常见的视频播放控件、如何在屏幕上划分多窗口进行特殊处理。

一、相    册

介绍自定义相册的实现过程,首先说明使用画廊或循环视图如何实现简单相册;接着阐述使用图像切换器如何实现相册的左右滑动功能;然后分别介绍卡片视图与调色板的用法

1.画廊Gallery

在电脑上,通过查看一组图片的缩略图列表,很容易找到想要的图片。

在手机上可以使用相应的图像控件做出缩略图展示的相册效果。

画廊Gallery是专门用于展示图片列表的控件,左右滑动手势即可展示内嵌的图片列表,画面效果类似于一个平面                      万花筒。

如何使用画廊

下面是Gallery的常用方法说明。

setSpacing:设置图片之间的间隔大小。

setUnselectedAlpha:设置未选定图片的透明度。

setAdapter:设置画廊的适配器。

getSelectedItemId:获取当前选中的视图序号。

setSelection:设置当前选中第几个视图。

setOnItemClickListener:设置单项的点击监听器。

使用画廊的编码步骤

(1)首先在布局文件中放置一个框架布局FrameLayout,里面放一个画廊控件与一个图像视图控件,                                     ImageView设置为充满整个屏幕,Gallery放在屏幕下方;

(2)然后监听Gallery控件的单项点击事件,当用户点击指定图片项时,使用ImageView控件填充该图片,也就                       是点小图看大图。

如果想用其他控件替换Gallery,可以考虑采取水平方向线性布局管理器的循环视图RecyclerView。

画廊的展示效果

2.图像切换器ImageSwitcher

图像切换器ImageSwitcher能够实现前后图片的切换动画,它继承自视图动画器ViewAnimator。

同样源于ViewAnimator的有下列3种切换器:

(1)图像切换器ImageSwitcher,用来承载前后两个图像的变换动画;

(2)文本切换器TextSwitcher,用来承载前后两个文本的变换动画。

(3)飞掠视图ViewFlipper,用来承载前后两个视图的变换动画。

如何使用图像切换器

下面介绍ImageSwitcher的常用方法。

setFactory:设置一个视图工厂。

setImageResource:设置当前图像的资源ID。

setImageDrawable:设置当前图像的图形对象。

setImageURI:设置当前图像的URI地址。

setInAnimation:设置后一个图像的进入动画。

setOutAnimation:设置前一个图像的退出动画。

使用图像切换器的编码步骤

(1)首先,对前后图片的切换动画可以事先设置好集合动画,通过setInAnimation和setOutAnimation方法完成动                      画调用;

(2)其次,根据手势的左滑和右滑触发图片切换操作,因此可通过检测左滑手势和右滑手势自动轮播图片。

注意:视图工厂由ViewFactory派生而来,需重写makeView方法返回工厂的具体视图。对于ImageSwitcher来说,                   工厂返回的是ImageView对象。

图像切换器的播放效果

3.图片查看器——青青相册

CardView拥有一个卡片式的圆角边框,边框外缘有一圈阴影,边框内缘有一圈空白。

CardView实际上是一个布局视图,继承自Framelayout,可以当作具有边框效果的特殊布局。

CardView的常用属性与方法的说明见下表。

卡片视图的展示效果

调色板Palette

调色板把多种颜色混合在一起,调和均匀后显示出新颜色。 根据每幅图片的色彩情况自动计算该图片的总体色调,通过          调色板控件Palette就能完成。

下面是Palette的常用方法说明。

from:从位图对象中获得调色板的构建对象。

Builder.generate:给构建对象注册调色板的调色监听器。

getVibrantSwatch:获取偏亮色调的色板对象。

getSwatches:获取所有色板对象。

装饰后的相册效果

二、音频播放

介绍了音频播放的几种方式,首先说明了铃声工具的适用场合与简单用法;接着阐述了声音池的运用场景,它的优缺点,以及基本用法;然后说明了音轨的产生背景,以及如何进行音轨的录制和播放。

1.铃声Ringtone

MediaPlayer存在某些播音方面的不足之处,主要包括:

(1)MediaPlayer的初始化比较消耗资源,尤其是播放短小铃音时反应偏慢;

(2)一个MediaPlayer同时只能播放一个媒体文件,无法同时播放多个声音;

(3)MediaPlayer只能播放已经完成编码的音频文件,无法直接播放原始音频,也不能流式播放(即边录边播);

对第一个问题来说,Android提供了铃声工具Ringtone处理铃音的播放。

如何使用Ringtone

铃声管理器支持的系统铃音类型取值说明见下表。

下面是Ringtone的常用方法说明:

play:开始播放铃声。

stop:停止播放铃声。

isPlaying:判断铃声是否正在播放。

2.声音池SoundPool

对于MediaPlayer无法同时播放多个声音的问题,Android提供了声音池工具SoundPool,使用声音池即可对多个声                   音的播放进行调度。 使用SoundPool可以事先加载多个音频,在需要时再播放指定音频,这样有几个好处:

(1)资源占用量小,不像MediaPlayer那么耗资源;

(2)相对MediaPlayer来说,延迟时间非常小;

(3)可以同时播放多个音频,从而实现游戏过程中多个声音叠加的情景;

如何使用SoundPool

下面是SoundPool的常用方法说明:

构造函数:可设置最大音频个数、音频类型、音频质量。

load:加载指定的音频文件。

unload:卸载指定编号的音频。

play:播放指定编号的音频。

pause:暂停播放指定编号的音频。

resume:恢复播放指定编号的音频。

stop:停止播放指定编号的音频。

release:释放所有音频资源。

setOnLoadCompleteListener:设置音频加载完毕的监听器。

3.音轨录播AudioTrack

语音通话功能要求实时传输,但是MediaRecorder与MediaPlayer组合只能整句话都录完编码好了,才能传给对方去               播放,这个实效性就太差了。

音频录制器AudioRecord与音轨播放器AudioTrack组合起来可用于实时音频处理,该组合的音频格式为原始的二进制              音频数据,没有文件头和文件尾,故而可以实现边录边播的实时语音对话。

如何使用AudioRecord

下面是AudioRecord的录音方法说明:

getMinBufferSize:根据采样频率、声道配置、音频格式获得缓冲区大小。

构造函数:可设置录音来源、采样频率、声道配置、音频格式与缓冲区大小。

startRecording:开始录音。

read:从缓冲区中读取音频数据。

stop:停止录音。

release:停止录音并释放资源。

setNotificationMarkerPosition:设置需要通知的标记位置。

setPositionNotificationPeriod:设置需要通知的时间周期。

setRecordPositionUpdateListener:设置录制位置变化的监听器对象。

如何使用AudioTrack

下面是AudioTrack的播音方法说明:

getMinBufferSize:根据采样频率、声道配置、音频格式获得缓冲区大小。

构造函数:可设置音频类型、采样频率、声道配置、音频格式、播放模式与缓冲区大小。

play:开始播音。

write:把缓冲区的音频数据写入音轨。

stop:停止播音。

release:停止播音并释放资源。

setNotificationMarkerPosition:设置需要通知的标记位置。

setPositionNotificationPeriod:设置需要通知的时间周期。

setPlaybackPositionUpdateListener:设置播放位置变化的监听器对象。

三、视频播放

介绍视频播放的相关技术,首先说明视频视图的工作原理,并结合拖动条实现简单的视频播放器;接着阐述媒                       体控制条的用法,以及媒体控制条与视频视图的两种绑定方式;最后演示了如何实现自定义样式的视频播放控制                           条。

1.视频视图VideoView

视频视图VideoView内部集成了SurfaceView和MediaPlayer,从而实现视频画面与视频操作的统一管理。 由于                   VideoView只是一个播放界面,本身不会显示进度条,因此实际开发中至少得给它配备一个拖动条SeekBar,一方面用                来展示当前的播放进度,另一方面用来拖动播放位置。

如何使用VideoView(上)

下面是VideoView的常用设置方法说明。

setVideoPath:设置视频文件的路径。

setMediaController:设置媒体控制条的对象。

setOnPreparedListener:设置预备播放监听器。

setOnCompletionListener:设置结束播放监听器。

setOnErrorListener:设置播放异常监听器。

setOnInfoListener:设置播放信息监听器。

requestFocus:请求获得焦点。

如何使用VideoView(下)

下面是VideoView的常用播放方法说明。

start:开始播放视频。

pause:暂停播放视频。

resume:恢复播放视频。

suspend:结束播放并释放资源。

seekTo:拖动视频到指定进度开始播放。

getDuration:获得视频的总时长。

getCurrentPosition:获得当前的播放位置。

isPlaying:判断是否正在播放。

getBufferPercentage:获得已缓冲的比例。

视频视图的播放效果

2.媒体控制条MediaController

MediaController支持下列基本的播放控制操作:

(1)显示当前的播放进度。

(2)拖动到指定位置播放。

(3)暂停播放与恢复播放。

(4)查看视频的总时长和已播放时长。

(5)对视频做快进或快退操作。

如何使用MediaController

下面是MediaController的常用方法说明。

setMediaPlayer:设置媒体播放器的对象。

setAnchorView:设置绑定的主视图。

show:显示媒体控制条。

hide:隐藏媒体控制条。

isShowing:判断媒体控制条是否正在显示。

setPrevNextListeners:设置前一个按钮与后一个按钮的点击监听器。

注意: setMediaPlayer和setAnchorView只能同时调用其中一个方法。

如何集成VideoView与MediaController

VideoView与MediaController的集成方式有两种:

(1). 在布局文件中声明VideoView 视频视图对象的使用步骤不变,即:

1)先调用setVideoPath方法指定视频文件,

2)然后调用setMediaController方法指定控制条,

3)最后调用start方法开始播放。

(2). 在代码中动态添加VideoView 视频视图对象需要在代码中构建并添加,其余使用步骤同上。

媒体控制条的播放效果

3.自定义播放控制条

MediaController只提供基本的播放控制,却无法进行其它个性化的定制,比如以下功能就不支持:

(1)控制条分上下两行,上面是控制按钮,下面是进度条,高度太宽了,有碍观瞻;

(2)按钮样式无法定制,且不能增加新按钮,也无法删除按钮;

(3)进度条与播放时间的样式也不能定制;

视频控制条的定制要求

自定义的视频控制条需要提供以下控件:

(1)一个播放按钮,点击按钮暂停播放,再点击恢复播放;

(2)一个拖动条,动态显示当前的播放进度,并允许把视频拖动到指定位置开始播放;

(3)两个文本控件,一个显示视频的总时长,另一个显示视频的已播放时长;

如何关联视频视图和视频控制条

视频控制条的难点在于如何跟VideoView同步当前的播放进度,解决办法如下。

(1)对于视频视图向控制条通知播放进度,可以设置定时器持续刷新播放进度;

(2)对于控制条向视频视图通知播放动作,可以监听播放按钮的点击事件,以及拖动条的拖动事件,并将事                            件处理结果传给VideoView。

视频控制条的播放效果

四、多  窗  口

为了实现将屏幕分窗口运行的功能,可采取分屏、画中画、自定义悬浮窗等技术手段,下面分别进行详细介绍。

1.分屏——多窗口模式

Android从7.0开始推出了分屏功能,也称作多窗口模式。

比如把竖长的手机屏幕分成上下两个窗口,一边在上面的窗口中观看电影,一边在下面的窗口中聊天。

按下任务键,屏幕左上角就出现“分屏模式”的按钮,点击该按钮即可启用分屏模式。

分屏模式的演示效果

分屏模式的注意事项

(1) App默认允许分屏模式。

(2) App页面从全屏模式切换到分屏模式,它的Activity生命周期会经历销毁后重建的过程。

(3)对于视频播放页面,Activity代码应当在onStop方法中暂停播放,并在onStart方法中恢复播放视频。

(4)调用isInMultiWindowMode方法可获知当前是否处于分屏模式。

(5)重载onMultiWindowModeChanged方法,可以实时收到分屏与全屏的切换通知。

2.画中画——特殊的多窗口

分屏模式之下,分屏的区域是固定的,要么在屏幕的上半部分,要么在屏幕的下半部分,不但尺寸无法调整而且                    还不能拖动。

Android8.0带来另一种更高级的多窗口模式,号称“Picture in Picture”(简称PIP,即“画中画”)。

应用一旦进入画中画模式,就会缩小为屏幕上的一个小窗口,该窗口既可拖动还可调整大小,非常适合用来播放视                 频。

画中画模式的注意事项

(1)App页面从全屏模式切换到画中画模式,它的Activity生命周期也会经历销毁后重建的过程。

(2)对于视频播放页面,Activity代码应当在onStop方法中暂停播放,并在onStart方法中恢复播放视频。

(3)调用isInPictureInPictureMode方法可获知当前是否处于画中画模式。

(4)重载onPictureInPictureModeChanged方法,可以实时收到画中画与全屏的切换通知。

(5)不能直接把应用拖入画中画,只能通过代码切到画中画。

画中画模式的演示效果

3.自定义悬浮窗

不管是分屏还是画中画,都存在着局限性:

(1)一方面窗口的位置和大小比较固定;

(2)另一方面只有Android7乃至Android8系统才支持。

要想拥有一种更灵活的窗口形式,并且不受系统版本的限制,就得通过自定义悬浮窗来实现。

如何使用WindowManager(上)

每个App页面都是一个Window窗口,在手机屏幕上新增或删除页面窗口,都可以归结为WindowManager的管理操                  作。

下面是WindowManager的常用方法说明:

getDefaultDisplay:获取默认的显示屏信息。

addView:往窗口添加视图。

updateViewLayout:更新指定视图的布局参数。

removeView:从窗口移除指定视图。

如何使用WindowManager(下)

下面是窗口布局参数WindowManager.LayoutParams的属性说明:

alpha:窗口的透明度。

gravity:内部视图的对齐方式。

x和y:分别表示窗口左上角的X坐标和Y坐标。

width:窗口的宽度。

height:窗口的高度。

format:窗口的像素点格式。

type:窗口的显示类型。

flags:窗口的行为准则。

悬浮窗与对话框的区别

自定义的悬浮窗有点类似对话框,它们都是独立于Activity页面的窗口,但是悬浮窗又有一些与众不同的特性,                              例如:

(1)悬浮窗是可以拖动的,对话框则不可拖动。

(2)悬浮窗不妨碍用户触摸窗外的区域,对话框则不让用户操作框外的控件。

(3)悬浮窗独立于Activity页面,即当页面退出后,悬浮窗仍停留在屏幕上;而对话框与Activity页面是共存关                         系,一旦页面退出则对话框也消失了。

悬浮窗的展示效果

4.截图和录屏

Android5.0之后开放了屏幕捕捉的API,开发者可以直接调用公开方法来截图与录屏。

屏幕捕捉的功能由MediaProjectionManager媒体投影管理器实现,主要用途是截图和录屏。

截图和录屏用到了以下三个工具类:

(1)图像读取器ImageReader,获得最近的一幅图像数据。

(2)媒体编码器MediaCodec,把媒体数据编码写入缓冲区。

(3)媒体转换器MediaMuxer,把缓冲区中的数据进行转换并生成视频文件。

如何使用MediaCodec

下面是媒体编码器MediaCodec的主要方法说明:

createEncoderByType:静态函数,根据编码格式构造一个媒体编码器。

configure:设置媒体编码的参数,包括视频格式、宽高、位率、帧率等。

createInputSurface:创建一个用于输入的表面对象。

start:开始给媒体编码。

dequeueOutputBuffer:给输出缓冲区排队。

getOutputFormat:获取输出格式。

getOutputBuffer:根据索引位置获取输出缓冲区的数据。

releaseOutputBuffer:释放指定索引位置的输出缓冲区。

stop:停止给媒体编码。

release:释放媒体编码资源。

如何使用MediaMuxer

下面是媒体转换器MediaMuxer的主要方法说明:

构造函数:根据文件路径与文件格式构造一个媒体转换器。

addTrack:把指定格式添加到转换轨道上,并返回轨道的索引位置。

start:开始媒体转换工作。

writeSampleData:把编码转换后的数据写入索引位置的轨道。

stop:停止媒体转换工作。

release:释放媒体转换资源。

android多媒体(十五)相关推荐

  1. android 猜歌游戏报告,Android第二十五期 - 猜歌小游戏

    周五开会时,有人提出在团队中采用结对开发的Agile实践.     当然团队里有人说,如果让新手与水平高的人结对,基本上就是知识的单向传递了,对于新手来说的确是个不错的学... //#include ...

  2. Android多媒体学习五:调用Android自带的播放器播放Audio

    Android有其自带的播放器,我们可以使用隐式Intent来调用它:通过传入一个Action为ACTION_VIEW同时,指定Data为所要播放的Audio的Uri对象,并指定格式信息,则我们就可以 ...

  3. Android第十五课 Jni自带的iconv库不支持GBK转码

    场景说明     NDK环境下使用sqlite3存储用户数据,存储的是UTF-8格式,读取数据库,转换为GBK显示中文. 结论     Android自带的iconv库不支持GBK转码,也不支持GBK ...

  4. Android 第十五课 如何使用LitePal从SQLite数据库中删除数据(十四课用来保留讲解如何向SQLite数据库中存入数据)

    使用LitePal删除数据的方式主要有两种,第一种就是直接调用已存对象的delete()方法,所谓已存储对象就是调用过save()方法的对象,或者说是通过LitePal提供的查询API查出来的对象,都 ...

  5. Android第二十五课 native程序异常crash 定位

    Android程序崩溃退出的时候,会将崩溃的堆栈信息保存在/data/tombstones目录下.该目录需要ROOT权限才能够访问.所以为了访问该路径,手机必须先ROOT破解.jni或者java代码崩 ...

  6. Android第二十五期 - 猜歌小游戏

    代码已经整理好了,如下效果图: 地址:http://yunpan.cn/cArkdixh5NbpQ  提取码 9300

  7. Android进阶知识(二十五):Bitmap简介及其高效加载

    Android进阶知识(二十五):Bitmap简介及其高效加载 一.Bitmap   Bitmap代表一个位图,在Android中指的是一张图片,可以是png.jpg等格式的图片.BitmapDraw ...

  8. Android 数据库和存储文件(第十五 十六 十七节课)

    第十五节课 页面之问传递参数 1.构建lntent //1.返回结果的跳转 Intent intent=new Intent(MainActivity.this ,Main2Activity.c1as ...

  9. Android 天气APP(十五)增加城市搜索、历史搜索记录

    上一篇:Android 天气APP(十四)修复UI显示异常.优化业务代码逻辑.增加详情天气显示 添加城市 新版------------------- 一.推荐城市数据 二.推荐城市item布局和适配器 ...

  10. android相册幻灯片功能,玩机教程 篇四十五:「MIUI玩机技巧63」MIUI相册新增“幻灯片播放”功能...

    玩机教程 篇四十五:「MIUI玩机技巧63」MIUI相册新增"幻灯片播放"功能 2020-02-17 16:15:35 0点赞 0收藏 0评论 本帖主要解决2大问题: 1) 功能科 ...

最新文章

  1. mybatis mapper绑定
  2. 设置Tomcat字符集为utf-8
  3. Flex3.0 图片浏览器(平移、光标中心点放缩、任意角度旋转)
  4. mobx使用数组提示越界_向Mobx可观察数组添加操作
  5. 【Tiny4412】烧写最小文件系统到SD卡
  6. POJ1655 Balancing Act
  7. 小程序同时设置点击跳转与自动跳转导致重复跳转的问题及解决
  8. 协议簇:TCP 解析: 连接断开
  9. 镜像的使用(6-13)
  10. 如何通过Keras来掌握深度学习
  11. 存储设备在linux名称,Linux下的存储设备的管理
  12. 桌面上计算机图标怎么改成中文,怎么修改电脑桌面上的图标
  13. python协程多线程HTMLParser下载mp3
  14. 三循环流水灯电路的原理
  15. 2019 ICPC 上海站网络赛 K.Peekaboo (圆上整点)
  16. win7无法打开计算机共享文件夹,Win7共享文件夹无法访问怎么办?Win7共享文件夹无法访问解决方法...
  17. [ERROR Port-10250]: Port 10250 is in use
  18. nove6怎么升级鸿蒙系统,华为手机怎么升级鸿蒙,华为鸿蒙系统支持手机型号大全...
  19. 链表(线性表的一种存储结构)
  20. 【C++】-- AVL树详解

热门文章

  1. Python学习:安装pycharm教程(Python、pycharm安装包,永久免费使用)
  2. jquery的优势是什么?
  3. Linux之4G模块串口通信
  4. JavaScript - 基础+WebAPI(笔记)
  5. 有C++/C的java学习
  6. 使用Python对excel中的数据进行处理
  7. 手机app抓包,无视SSLPinning
  8. 漫步数理统计三十——依概率收敛
  9. 【笔记】OpenSSL 使用
  10. expect pexpect on Windows