50 Android Hacks(hack 14)
2015-09-25 16:44
399 查看
技巧14 VideoViews和方向变化
给应用程序增加视频是增强用户体验的一个好方法。我曾经见过这样的应用程序:用丰富的图标,包括视频展现了公司的信息。有时,在复杂的视图中,不使用编辑动画逻辑的方法而采用视频,是一个呈现信息的简单方法。
我注意到,当播放视频时,用户倾向于把设备平放来欣赏,所以在本技巧中我会演示当设备旋转时,如何使视频全屏。
为了实现这样的效果,我们要告诉系统,我们要手动改变方向。当设备旋转时,我们将改变VideoView的尺寸和位置。
要做的第一件事是创建Activity的布局。该技巧中,我创建了一个由一条细直线分割为两部分的布局。上半部分左边有一小块文字,右边是一个视频,下半部分是一个比较长的描述。当我创建该视图的XML文件时,我没有用VideoView,而是用了一个带有白色背景的View。这个View用来保存它的尺寸和位置来正确的安放VideoView。从图14.1中你可以看到完成的布局。
在图14.2中,你能看到视图树是如何创建的。videoView和竖屏内容一样挂在根视图下。把videoView放在这个位置,允许我们改变它的尺寸和位置,这样,当发生旋转时,不需要两个不同的布局或改变VideoView的父窗口。换句话说,白色背景的view,叫做portrait
position的那个,在树中放置的比较深。
既然我们有了布局,我们能够设计Activity的代码了。要做的第一件事是处理方向变化。我们需要在AndroidManifest.xml中,给<Activity>标签中增加android:configChange=”orientation”.增加该属性是为了在设备旋转时,启动onConfigurationChanged()方法,而不是重启Activity。
当方向发生改变时,我们需要改变视频的尺寸和位置。为此,我们调用一个私有方法setVideoViewPosition().以下是该方法的内容:
if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
mPortraitContent.setVisibility(View.VISIBLE);
int[] locationArray = new int[2];
mPortraitPosition.getLocationOnScreen(locationArray);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
mPortraitPosition.getWidth(), mPortraitPosition.getHeight());
params.leftMargin = locationArray[0];
params.topMargin = locationArray[1];
mVideoView.setLayoutParams(params);
} else {
mPortr
4000
aitContent.setVisibility(View.GONE);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
mVideoView.setLayoutParams(params);
}
setVideoViewPosition()方法被分为两部分:垂直和水平配置。首先,我们让垂直内容可见。因为VideoView和白色背景的视图有相同的位置和尺寸,我们把它的位置设置到videoView布局参数中。
在水平方向上,一些相同的步骤同样要做。在该情形下,我们首先隐藏垂直内容。然后我们创建布局参数,使videoView占据整个屏幕。最后,我们把布局参数设置到videoView中。
14.1
概述
正如我们在这个技巧刚开始位置提到的,视频能有效提升应用程序的内容。你应当知道,当尺寸变化时,默认的videoView类会遵循纵横比,如果你想让它填满可用空间,你需要在你的自定义view中重写onMeasure()方法。
给应用程序增加视频是增强用户体验的一个好方法。我曾经见过这样的应用程序:用丰富的图标,包括视频展现了公司的信息。有时,在复杂的视图中,不使用编辑动画逻辑的方法而采用视频,是一个呈现信息的简单方法。
我注意到,当播放视频时,用户倾向于把设备平放来欣赏,所以在本技巧中我会演示当设备旋转时,如何使视频全屏。
为了实现这样的效果,我们要告诉系统,我们要手动改变方向。当设备旋转时,我们将改变VideoView的尺寸和位置。
要做的第一件事是创建Activity的布局。该技巧中,我创建了一个由一条细直线分割为两部分的布局。上半部分左边有一小块文字,右边是一个视频,下半部分是一个比较长的描述。当我创建该视图的XML文件时,我没有用VideoView,而是用了一个带有白色背景的View。这个View用来保存它的尺寸和位置来正确的安放VideoView。从图14.1中你可以看到完成的布局。
在图14.2中,你能看到视图树是如何创建的。videoView和竖屏内容一样挂在根视图下。把videoView放在这个位置,允许我们改变它的尺寸和位置,这样,当发生旋转时,不需要两个不同的布局或改变VideoView的父窗口。换句话说,白色背景的view,叫做portrait
position的那个,在树中放置的比较深。
既然我们有了布局,我们能够设计Activity的代码了。要做的第一件事是处理方向变化。我们需要在AndroidManifest.xml中,给<Activity>标签中增加android:configChange=”orientation”.增加该属性是为了在设备旋转时,启动onConfigurationChanged()方法,而不是重启Activity。
当方向发生改变时,我们需要改变视频的尺寸和位置。为此,我们调用一个私有方法setVideoViewPosition().以下是该方法的内容:
if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
mPortraitContent.setVisibility(View.VISIBLE);
int[] locationArray = new int[2];
mPortraitPosition.getLocationOnScreen(locationArray);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
mPortraitPosition.getWidth(), mPortraitPosition.getHeight());
params.leftMargin = locationArray[0];
params.topMargin = locationArray[1];
mVideoView.setLayoutParams(params);
} else {
mPortr
4000
aitContent.setVisibility(View.GONE);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
mVideoView.setLayoutParams(params);
}
setVideoViewPosition()方法被分为两部分:垂直和水平配置。首先,我们让垂直内容可见。因为VideoView和白色背景的视图有相同的位置和尺寸,我们把它的位置设置到videoView布局参数中。
在水平方向上,一些相同的步骤同样要做。在该情形下,我们首先隐藏垂直内容。然后我们创建布局参数,使videoView占据整个屏幕。最后,我们把布局参数设置到videoView中。
14.1
概述
正如我们在这个技巧刚开始位置提到的,视频能有效提升应用程序的内容。你应当知道,当尺寸变化时,默认的videoView类会遵循纵横比,如果你想让它填满可用空间,你需要在你的自定义view中重写onMeasure()方法。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories