android多媒体(十五)
介绍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多媒体(十五)相关推荐
- android 猜歌游戏报告,Android第二十五期 - 猜歌小游戏
周五开会时,有人提出在团队中采用结对开发的Agile实践. 当然团队里有人说,如果让新手与水平高的人结对,基本上就是知识的单向传递了,对于新手来说的确是个不错的学... //#include ...
- Android多媒体学习五:调用Android自带的播放器播放Audio
Android有其自带的播放器,我们可以使用隐式Intent来调用它:通过传入一个Action为ACTION_VIEW同时,指定Data为所要播放的Audio的Uri对象,并指定格式信息,则我们就可以 ...
- Android第十五课 Jni自带的iconv库不支持GBK转码
场景说明 NDK环境下使用sqlite3存储用户数据,存储的是UTF-8格式,读取数据库,转换为GBK显示中文. 结论 Android自带的iconv库不支持GBK转码,也不支持GBK ...
- Android 第十五课 如何使用LitePal从SQLite数据库中删除数据(十四课用来保留讲解如何向SQLite数据库中存入数据)
使用LitePal删除数据的方式主要有两种,第一种就是直接调用已存对象的delete()方法,所谓已存储对象就是调用过save()方法的对象,或者说是通过LitePal提供的查询API查出来的对象,都 ...
- Android第二十五课 native程序异常crash 定位
Android程序崩溃退出的时候,会将崩溃的堆栈信息保存在/data/tombstones目录下.该目录需要ROOT权限才能够访问.所以为了访问该路径,手机必须先ROOT破解.jni或者java代码崩 ...
- Android第二十五期 - 猜歌小游戏
代码已经整理好了,如下效果图: 地址:http://yunpan.cn/cArkdixh5NbpQ 提取码 9300
- Android进阶知识(二十五):Bitmap简介及其高效加载
Android进阶知识(二十五):Bitmap简介及其高效加载 一.Bitmap Bitmap代表一个位图,在Android中指的是一张图片,可以是png.jpg等格式的图片.BitmapDraw ...
- Android 数据库和存储文件(第十五 十六 十七节课)
第十五节课 页面之问传递参数 1.构建lntent //1.返回结果的跳转 Intent intent=new Intent(MainActivity.this ,Main2Activity.c1as ...
- Android 天气APP(十五)增加城市搜索、历史搜索记录
上一篇:Android 天气APP(十四)修复UI显示异常.优化业务代码逻辑.增加详情天气显示 添加城市 新版------------------- 一.推荐城市数据 二.推荐城市item布局和适配器 ...
- android相册幻灯片功能,玩机教程 篇四十五:「MIUI玩机技巧63」MIUI相册新增“幻灯片播放”功能...
玩机教程 篇四十五:「MIUI玩机技巧63」MIUI相册新增"幻灯片播放"功能 2020-02-17 16:15:35 0点赞 0收藏 0评论 本帖主要解决2大问题: 1) 功能科 ...
最新文章
- mybatis mapper绑定
- 设置Tomcat字符集为utf-8
- Flex3.0 图片浏览器(平移、光标中心点放缩、任意角度旋转)
- mobx使用数组提示越界_向Mobx可观察数组添加操作
- 【Tiny4412】烧写最小文件系统到SD卡
- POJ1655 Balancing Act
- 小程序同时设置点击跳转与自动跳转导致重复跳转的问题及解决
- 协议簇:TCP 解析: 连接断开
- 镜像的使用(6-13)
- 如何通过Keras来掌握深度学习
- 存储设备在linux名称,Linux下的存储设备的管理
- 桌面上计算机图标怎么改成中文,怎么修改电脑桌面上的图标
- python协程多线程HTMLParser下载mp3
- 三循环流水灯电路的原理
- 2019 ICPC 上海站网络赛 K.Peekaboo (圆上整点)
- win7无法打开计算机共享文件夹,Win7共享文件夹无法访问怎么办?Win7共享文件夹无法访问解决方法...
- [ERROR Port-10250]: Port 10250 is in use
- nove6怎么升级鸿蒙系统,华为手机怎么升级鸿蒙,华为鸿蒙系统支持手机型号大全...
- 链表(线性表的一种存储结构)
- 【C++】-- AVL树详解