在Android开发中,`VideoView`是一个非常实用的组件,用于播放视频内容。然而,系统默认的`VideoView`往往无法满足所有用户界面和交互的需求,因此开发者有时需要自定义控制栏来提供更加个性化的用户体验。本文将详细介绍如何在Android应用中实现一个自定义导航栏的`VideoView`,支持横屏、竖屏以及全屏播放。 我们需要创建一个新的布局文件,用于定义自定义的控制栏。这个布局通常包括播放/暂停按钮、进度条、全屏切换按钮等元素。例如,我们可以创建一个名为`video_controller.xml`的布局文件,包含如下内容: ```xml <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@color/black" android:alpha="0.5"> <ImageButton android:id="@+id/btn_play_pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_play"/> <SeekBar android:id="@+id/progress_bar" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:maxHeight="4dp" android:minHeight="4dp" android:thumb="@drawable/thumb"/> <ImageButton android:id="@+id/btn_fullscreen" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_fullscreen"/> </LinearLayout> ``` 接下来,我们需要在`VideoView`的父布局中添加这个自定义控制栏,并监听`VideoView`的状态变化。在Java代码中,我们可以这样实现: ```java public class CustomVideoViewActivity extends AppCompatActivity { private VideoView videoView; private View videoController; private ImageButton btnPlayPause; private SeekBar progressBar; private ImageButton btnFullScreen; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_video_view); videoView = findViewById(R.id.video_view); videoController = getLayoutInflater().inflate(R.layout.video_controller, null); btnPlayPause = videoController.findViewById(R.id.btn_play_pause); progressBar = videoController.findViewById(R.id.progress_bar); btnFullScreen = videoController.findViewById(R.id.btn_fullscreen); // 设置VideoView的源和监听器 videoView.setVideoURI(Uri.parse("your_video_path")); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { // 显示控制栏 videoView.bringToFront(); videoView.addView(videoController); updateControlsVisibility(); // 初始化进度条 progressBar.setMax(mediaPlayer.getDuration()); progressBar.setProgress(0); // 开始播放 mediaPlayer.start(); } }); // 监听播放/暂停按钮 btnPlayPause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (videoView.isPlaying()) { videoView.pause(); btnPlayPause.setImageResource(R.drawable.ic_play); } else { videoView.start(); btnPlayPause.setImageResource(R.drawable.ic_pause); } } }); // 监听进度条 progressBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { videoView.seekTo(progress); } } @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) {} }); // 全屏切换 btnFullScreen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { toggleFullScreen(); } }); } private void toggleFullScreen() { if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } else { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } updateControlsVisibility(); } private void updateControlsVisibility() { if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // 在横屏模式下,隐藏控制栏 videoController.setVisibility(View.GONE); } else { // 在竖屏模式下,显示控制栏 videoController.setVisibility(View.VISIBLE); } } } ``` 在这个例子中,我们首先初始化`VideoView`并设置其视频源,然后添加自定义控制栏并设置相应的点击事件。播放/暂停按钮的点击事件会根据`VideoView`的状态切换播放和暂停。进度条则用于调整视频播放的位置。全屏切换按钮会根据当前屏幕方向改变设备的屏幕方向,从而实现全屏播放。 为了支持横屏和竖屏,我们使用`Activity`的`setRequestedOrientation()`方法来切换屏幕方向。同时,`updateControlsVisibility()`方法会在屏幕方向改变时更新控制栏的可见性,确保在横屏模式下控制栏被隐藏,以提供更好的观看体验。 这个自定义的`VideoView`导航栏解决方案可以灵活地适应不同的界面需求,同时提供了播放、暂停、进度调整和全屏播放的功能。通过自定义布局和Java代码,我们可以根据项目需求进一步定制控制栏的行为和外观。在实际开发中,你可以根据自己的设计和功能需求进行相应的调整和优化。
- 1
- qq_300622312015-11-10借鉴一下,虽然还达不到我想要的效果
- 随风影随动2015-12-07下了,感觉没什么用,浪费了我的积分啊。。。
- 粉丝: 1
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- FeiQ.rar 局域网内通信服务软件
- 172.16.100.195
- 光储并网simulink仿真模型,直流微电网 光伏系统采用扰动观察法是实现mppt控制,储能可由单独蓄电池构成,也可由蓄电池和超级电容构成的混合储能系统,并采用lpf进行功率分配 并网采用pq控制
- python编写微信读取smart200plc的数据发送给微信联系人
- 光储并网VSG系统Matlab simulink仿真模型,附参考文献 系统前级直流部分包括光伏阵列、变器、储能系统和双向dcdc变器,后级交流子系统包括逆变器LC滤波器,交流负载 光储并网VSG系
- file_241223_024438_84523.pdf
- 质子交膜燃料电池PEMFC Matlab simulink滑模控制模型,过氧比控制,温度控制,阴,阳极气压控制
- IMG20241223015444.jpg
- 模块化多电平变器(MMC),本模型为三相MMC整流器 控制策略:双闭环控制、桥臂电压均衡控制、模块电压均衡控制、环流抑制控制策略、载波移相调制,可供参考学习使用,默认发2020b版本及以上
- Delphi 12 控件之FlashAV FFMPEG VCL Player For Delphi v7.0 for D10-D11 Full Source.7z