在 GridView 中混合 ImageView 和 VideoView
Mix ImageView and VideoView in GridView
我有一些 url 可以是图片或视频。我只想将它们混合在一个 GridView (2*2) 中。因此,在构建适配器时,如何根据 url?
使用 ImageView 或 VideoView 实例化它
旧的实现只使用了一个只有图像和视频的 ImageView 的布局,并使用 clickListeners 启动另一个 activity 来播放视频。默认图像用作所有视频的占位符,这很难看。
如果 url 是图像,我只想显示图像,如果是视频,则显示视频的第一帧,例如 Instagram,但在 2*2 网格内。
您可以在网格项目布局中同时使用 ImageView 和 VideoView。
<FrameLayout
android:layout_width="match_parent"
android:layout_height="@dimen/post_image_size">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="@dimen/post_image_size"/>
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="@dimen/post_image_size" />
</FrameLayout>
在 adapter#getView() 中,您应该检查 url 的类型并设置其中一个,并将另一个设置为不可见。
if (!isVideo(url)) {
videoView.setVisibility(View.GONE);
Picasso.with(this).load(imageUrl)
.into(imageView);
} else {
Uri uri = Uri.parse(url);
videoView.setVideoURI(uri);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
imageView.setVisibility(View.GONE);
videoView.setBackgroundColor(Color.TRANSPARENT);
videoView.requestFocus();
videoView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// start your new activity to play video
return false;
}
});
}
});
}
PS1: 我用Picasso设置ImageView。
PS2: 在 Instagram 中,我们可以通过使用 Instagram API 获取视频 post 的图像。我们还有 mediaType 标志来确定它是视频还是图像。您可以从 here. I've developed an instagram repost app. In gridView, I am using the image that is coming from API of a video post. When clicking a video item, I start a new activity to play video as well. But, if you really need capture a frame of a video, you can see this entry.
查看 Instagram API
我有一些 url 可以是图片或视频。我只想将它们混合在一个 GridView (2*2) 中。因此,在构建适配器时,如何根据 url?
使用 ImageView 或 VideoView 实例化它旧的实现只使用了一个只有图像和视频的 ImageView 的布局,并使用 clickListeners 启动另一个 activity 来播放视频。默认图像用作所有视频的占位符,这很难看。
如果 url 是图像,我只想显示图像,如果是视频,则显示视频的第一帧,例如 Instagram,但在 2*2 网格内。
您可以在网格项目布局中同时使用 ImageView 和 VideoView。
<FrameLayout
android:layout_width="match_parent"
android:layout_height="@dimen/post_image_size">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="@dimen/post_image_size"/>
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="@dimen/post_image_size" />
</FrameLayout>
在 adapter#getView() 中,您应该检查 url 的类型并设置其中一个,并将另一个设置为不可见。
if (!isVideo(url)) {
videoView.setVisibility(View.GONE);
Picasso.with(this).load(imageUrl)
.into(imageView);
} else {
Uri uri = Uri.parse(url);
videoView.setVideoURI(uri);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
imageView.setVisibility(View.GONE);
videoView.setBackgroundColor(Color.TRANSPARENT);
videoView.requestFocus();
videoView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// start your new activity to play video
return false;
}
});
}
});
}
PS1: 我用Picasso设置ImageView。
PS2: 在 Instagram 中,我们可以通过使用 Instagram API 获取视频 post 的图像。我们还有 mediaType 标志来确定它是视频还是图像。您可以从 here. I've developed an instagram repost app. In gridView, I am using the image that is coming from API of a video post. When clicking a video item, I start a new activity to play video as well. But, if you really need capture a frame of a video, you can see this entry.
查看 Instagram API