android 如何实现图片视频混合播放啊
刚才没人回复,再发一次,我现在只实现了视频图片在一个控件上都能显示,但是将他们混合在一块即一个视频播放完后接着显示几张图片然后在播放另一个视频这个功能应该怎么实现啊,求大...
刚才没人回复,再发一次,我现在只实现了视频图片在一个控件上都能显示,但是将他们混合在一块即一个视频播放完后接着显示几张图片然后在播放另一个视频这个功能应该怎么实现啊,求大神帮忙。给个大体思路就行
展开
5个回答
展开全部
直接上代码:
布局文件就是两个全屏的videoview和imageview重叠
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/pictureView"
android:scaleType="fitXY"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
java部分:
/*
视频图片混合展示demo
*/
package com.example.administrator.hunbo;
import android.content.Context;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Handler;
import android.os.storage.StorageManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.VideoView;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private VideoView videoView;
private ImageView pictureView;
boolean isPlaying = false;
private ArrayList arrayList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().hide();//隐藏actionBar
//初始化控件
videoView = findViewById(R.id.videoView);
pictureView = findViewById(R.id.pictureView);
//最开始两个view都是隐藏的
videoView.setVisibility(View.GONE);
pictureView.setVisibility(View.GONE);
//检测SD卡是否存在
String[] result = null;
StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
try {
Method method = StorageManager.class.getMethod("getVolumePaths");
method.setAccessible(true);
try {
result = (String[]) method.invoke(storageManager);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if (result.length > 1) {
//Toast.makeText(this, "检测到U盘", Toast.LENGTH_SHORT).show();
AllFilesPath("/mnt/usb/");
playList();
} else {
Toast.makeText(this, "未检测到U盘,请在开机前插入U盘,或者重新启动此应用", Toast.LENGTH_SHORT).show();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
finish();
}
}, 2500);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//获取所有图片视频的绝对路径到arraylist
private ArrayList AllFilesPath(String path) {
File file = new File(path);
File[] files = file.listFiles();
for (File f : files) {
if (f.getName().endsWith("jpg") || f.getName().endsWith("jpeg") || f.getName().endsWith("mp4")
|| f.getName().endsWith("avi") || f.getName().endsWith("mkv") || f.getName().endsWith("rmvb")
|| f.getName().endsWith("flv")) {
System.out.println("------------获取到了一个可用路径:"+f.getAbsolutePath());
arrayList.add(f.getAbsolutePath());//添加到arralist
} else if (f.isDirectory()) {
AllFilesPath(f.getAbsolutePath());
}
}
return arrayList;
}
//依次混合播放arralist里的图片或视频
public int listNum;
private void playList() {
if (listNum >= arrayList.size()){
finish();
//listNum = 0;
}else {
System.out.println("---------------------------收入路径---------------------------");
System.out.println("isplaying = "+isPlaying);
final File f = new File(arrayList.get(listNum).toString());
if (f.getName().endsWith("jpg") || f.getName().endsWith("jpeg")||f.getName().endsWith("png")) {
System.out.println("---------------------------添加了一张图片:"+f.getAbsolutePath());
pictureView.setVisibility(View.VISIBLE);
pictureView.setImageURI(Uri.fromFile(f));
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("---------------------------播完了一张位于"+f.getAbsolutePath()+"的图片》》》》》》》》》》》》》》》》》");
pictureView.setVisibility(View.GONE);
listNum++;
playList();
}
}, 2000);//2秒后结束当前图片
} else if (f.getName().endsWith("mp4") || f.getName().endsWith("avi") || f.getName().endsWith("mkv")
|| f.getName().endsWith("rmvb") || f.getName().endsWith("flv")) {
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~添加了一个视频"+f.getAbsolutePath());
videoView.setVideoPath(f.getAbsolutePath());
videoView.setVisibility(View.VISIBLE);//播放之前显示videoView
videoView.start();
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
System.out.println("---------------------------播完了一个位于"+f.getAbsolutePath()+"的视频《《《《《《《《《《《《《《《《《《");
videoView.setVisibility(View.GONE);//视频播放完毕后隐藏videoView
listNum++;
playList();
}
});
}
}
}
推荐于2017-05-19
展开全部
楼主其实你这个可以用ViewAnimator来实现的,它是继承FrameLayout的,你可以现将videoview(surfaceview也可以)和imageview控件加入到ViewAnimator里面,自己用mediafile类来检测下一个要播放的是视频还是图片,再将对应的控件显示到最上面进行播放(ViewAnimator有对应的接口,你看下源码就知道了的)。顺便问下楼主,你是怎么让一个视频和图片在同一个控件上显示的啊?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-07
展开全部
借鉴的网上的播放器代码,继承他,在继承的类里判断是图片还是视频。如果是视频直接播放如果是图片再调用draw()方法(draw就是在继承的类里写入的播放图片的方法)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-07
展开全部
被标题吸引而来,路过
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-07
展开全部
被标题吸引而来,路过
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询