PreviewSeekBar
来源:互联网 发布:优化关键词密度的方法 编辑:程序博客网 时间:2024/06/06 01:38
PreviewSeekBar
A SeekBar suited for showing a preview of something. As seen in Google Play Movies.
Google Play Movies
PreviewSeekBar's sample
Build
Add the following to your app's build.gradle:
dependencies { compile 'com.github.rubensousa:previewseekbar:1.0' // If you want to use this with ExoPlayer, use this one: compile 'com.github.rubensousa:previewseekbar-exoplayer:2.5.1'}
How to use
Add the following XML:
<com.github.rubensousa.previewseekbar.PreviewSeekBarLayout android:id="@+id/previewSeekBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <FrameLayout android:id="@+id/previewFrameLayout" android:layout_width="@dimen/video_preview_width" android:layout_height="@dimen/video_preview_height"> <View android:id="@+id/videoView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="start" android:background="@color/colorPrimary" /> </FrameLayout> <com.github.rubensousa.previewseekbar.PreviewSeekBar android:id="@+id/previewSeekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/previewFrameLayout" android:layout_marginTop="25dp" android:max="800" /></com.github.rubensousa.previewseekbar.PreviewSeekBarLayout>
You need to add at least one PreviewSeekBar and a FrameLayout inside PreviewSeekBarLayout, else an exception will be thrown.
PreviewSeekBarLayout extends from RelativeLayout so you can add other views or layouts there.
Create a PreviewLoader and pass it to PreviewSeekBarLayout:
// Create a class that implements this interface and implement your own preview logic therepublic interface PreviewLoader { void loadPreview(long currentPosition, long max);}PreviewLoader loader = new ExoPlayerLoader();previewSeekBarLayout.setup(loader);
How to use with ExoPlayer
Add a custom controller to your SimpleExoPlayerView
<com.google.android.exoplayer2.ui.SimpleExoPlayerView android:id="@+id/player_view" android:layout_width="match_parent" android:layout_height="match_parent" app:controller_layout_id="@layout/exoplayer_controls"/>
Here's the sample's exoplayer_controls: https://raw.githubusercontent.com/rubensousa/PreviewSeekBar/master/sample/src/main/res/layout/exoplayer_controls.xml
The PreviewSeekBarLayout inside exoplayer_controls should be similar to this:
<com.github.rubensousa.previewseekbar.exoplayer.PreviewTimeBarLayout android:id="@+id/previewTimeBarLayout" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"> <FrameLayout android:id="@+id/previewFrameLayout" android:layout_width="@dimen/video_preview_width" android:layout_height="@dimen/video_preview_height" android:background="@drawable/video_frame" android:padding="@dimen/video_frame_width"> <com.google.android.exoplayer2.ui.SimpleExoPlayerView android:id="@+id/previewPlayerView" android:layout_width="match_parent" android:layout_height="match_parent" app:controller_layout_id="@layout/exo_simple_player_view" app:surface_type="texture_view" app:use_artwork="false" app:use_controller="false" /> </FrameLayout> <com.github.rubensousa.previewseekbar.exoplayer.PreviewTimeBar android:id="@+id/exo_progress" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/previewFrameLayout" android:layout_marginTop="10dp" android:max="800" /></com.github.rubensousa.previewseekbar.PreviewSeekBarLayout>
Use the following SimpleExoPlayerView for the preview:
<com.google.android.exoplayer2.ui.SimpleExoPlayerView android:id="@+id/previewPlayerView" android:layout_width="match_parent" android:layout_height="match_parent" app:controller_layout_id="@layout/exo_simple_player_view" app:surface_type="texture_view" app:use_artwork="false" app:use_controller="false" />
We specify another controller layout because the default one includes a SeekBar with the same id as ours.
Create a player with a custom TrackSelection and LoadControl
private SimpleExoPlayer createPreviewPlayer() { TrackSelection.Factory videoTrackSelectionFactory = new WorstVideoTrackSelection.Factory(); TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); LoadControl loadControl = new PreviewLoadControl(); SimpleExoPlayer player = ExoPlayerFactory.newSimpleInstance( new DefaultRenderersFactory(context), trackSelector, loadControl); player.setPlayWhenReady(false); player.setVolume(0f); player.prepare(mediaSourceBuilder.getMediaSource(true)); return player;}
PreviewLoadControl and WorstVideoTrackSelection are already included in previewseekbar-exoplayer. Check the next section for some improvements notes.
Create your own ExoPlayerLoader that seeks the video to the current position
@Overridepublic void loadPreview(long currentPosition, long max) { previewPlayer.seekTo(currentPosition); previewPlayer.setPlayWhenReady(false);}
Improvements
The sample uses some code adapted from the ExoPlayer official demo: https://github.com/google/ExoPlayer
A few improvements would be:
Adding a stream with lower bitrate to load and display the images faster.
Using some kind of special stream just for the thumbnails. Maybe this is how the Google Play team did it, I don't know. They load the thumbnails a lot faster than this sample.
Caching thumbnails in disk for offline use.
Any ideas for improving this would be welcomed!
- PreviewSeekBar
- 【队内胡策】2017.10.22
- gradlew在基于Gradle项目构建中的应用分析
- C++递归创建、非递归遍历二叉树的基本操作
- SSH 连接、远程上传下载文件
- 前端监控--Puppeteer终探
- PreviewSeekBar
- codeforces 870c 大数分裂
- bootstrap日期控件与文档编辑器的使用
- springmvc 拦截器思维导图
- Httpd-2.2常见配置总结
- 099 复习:中值定理习题之型二:有ξ,有a,b ,型三: 有ξ,η
- 鸟哥私房菜 第十五章 磁盘配额(Quota)与高级文件系统管理
- OpenCV3.3+CUDA9.0+Cmake3.9 环境搭建
- MySQL半同步复制--master dump线程1