此程序是根据csdn网上的代码修改后写出的
仿微信视频边滑动边播放,隐藏后自动停止,单击播放特定视频
主要思路:使用一个videoview播放视频,当滑动或者点击播放时,如果当前显示的视频改变则停止播放,进而播放新的视频,否而继续播放
滚动listbiewiew时,动态更新videoview播放的视频
请在有网的条件下测试
主要代码
private ListView mListView;
private List<VideoInfo> videoList=new ArrayList<VideoInfo>();private VideoInfo video;
private myAdapter adapter;
//默认播放的视频 从0开始
private int currentIndex=0;private String url1="http://ht-mobile.cdn.turner.com/nba/big/teams/kings/2014/12/12/HollinsGlassmov-3462827_8382664.mp4";
private String url2="http://ht-mobile.cdn.turner.com/nba/big/teams/kings/2014/12/12/VivekSilverIndiamov-3462702_8380205.mp4";
private VideoView mVideoView;
MediaController mMediaCtrl;
private int playPosition=-1;
// private boolean isPaused=false;
private boolean isPlaying=false;
private int preLast = -1;
private int ifFirst = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//构造视频数据
for(int i=0;i<50;i++){
if(i%2==0){
video=new VideoInfo(url1,"猛龙过江"+i,R.drawable.video2);
}else{
video=new VideoInfo(url2,"猛龙过江"+i,R.drawable.video1);
}
videoList.add(video);
}
mListView=(ListView) findViewById(R.id.video_listview);
adapter = new myAdapter();
mListView.setAdapter(adapter);
mListView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
System.out.println(firstVisibleItem + "--" + visibleItemCount);
if((currentIndex<firstVisibleItem || currentIndex>mListView.getLastVisiblePosition())&&isPlaying){
System.out.println("滑动的:"+mVideoView.toString());
playPosition=mVideoView.getCurrentPosition();
mVideoView.pause();
mVideoView.setMediaController(null);
// isPaused=true;
isPlaying=false;
System.out.println("视频已经暂停:"+playPosition);
}else
{
//防止界面一直刷新 更新界面当前视频
if(preLast==firstVisibleItem){
if(visibleItemCount>2 && currentIndex==0 && ifFirst!=3)
{
ifFirst =0;
currentIndex =firstVisibleItem + 1;
adapter.notifyDataSetChanged();
}else if(visibleItemCount== 2 && firstVisibleItem==0 && ifFirst==0)
{
ifFirst = 1;
currentIndex =firstVisibleItem ;
adapter.notifyDataSetChanged();
}
}else
{
preLast = firstVisibleItem;
ifFirst = 0;
if(visibleItemCount>=2)
{
currentIndex =firstVisibleItem + 1;
adapter.notifyDataSetChanged();
}else if(visibleItemCount==1)
{
currentIndex=firstVisibleItem;
adapter.notifyDataSetChanged();
}
}
}
}
});
/* mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
currentIndex=position;
adapter.notifyDataSetChanged();
}
});*/
}
class myAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stubs
return videoList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return videoList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
final int mPosition=position;
if(convertView==null){
convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.video_item_layout, null);
holder=new ViewHolder();
holder.videoImage=(ImageView) convertView.findViewById(R.id.video_image);
holder.videoNameText=(TextView)convertView.findViewById(R.id.video_name_text);
holder.videoPlayBtn=(ImageButton)convertView.findViewById(R.id.video_play_btn);
holder.mProgressBar=(ProgressBar) convertView.findViewById(R.id.progressbar);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
holder.videoImage.setImageDrawable(getResources().getDrawable(videoList.get(position).getVideoImage()));
holder.videoNameText.setText(videoList.get(position).getVideoName());
holder.videoPlayBtn.setVisibility(View.VISIBLE);
holder.videoImage.setVisibility(View.VISIBLE);
holder.videoNameText.setVisibility(View.VISIBLE);
mMediaCtrl = new MediaController(MainActivity.this,false);
if(currentIndex == position){
holder.videoPlayBtn.setVisibility(View.INVISIBLE);
holder.videoImage.setVisibility(View.INVISIBLE);
holder.videoNameText.setVisibility(View.INVISIBLE);
if(isPlaying || playPosition==-1){
if(mVideoView!=null){
mVideoView.setVisibility(View.GONE);
mVideoView.stopPlayback();
holder.mProgressBar.setVisibility(View.GONE);
}
}
mVideoView=(VideoView) convertView.findViewById(R.id.videoview);
mVideoView.setVisibility(View.VISIBLE);
mMediaCtrl.setAnchorView(mVideoView);
mMediaCtrl.setMediaPlayer(mVideoView);
mVideoView.setMediaController(mMediaCtrl);
mVideoView.requestFocus();
holder.mProgressBar.setVisibility(View.VISIBLE);
// if(playPosition>0 && isPaused){
// mVideoView.start();
// isPaused=false;
// isPlaying=true;
// holder.mProgressBar.setVisibility(View.GONE);
// }else{
mVideoView.setVideoPath(videoList.get(mPosition).getUrl());
// isPaused=false;
isPlaying=true;
System.out.println("播放新的视频");
// }
mVideoView.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if(mVideoView!=null){
mVideoView.seekTo(0);
mVideoView.stopPlayback();
mVideoView.start();
//currentIndex=-1;
// isPaused=false;
isPlaying=false;
holder.mProgressBar.setVisibility(View.GONE);
adapter.notifyDataSetChanged();
}
}
});
mVideoView.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mp.reset();
return true;
}
});
mVideoView.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
holder.mProgressBar.setVisibility(View.GONE);
mVideoView.start();
}
});
}else{
holder.videoPlayBtn.setVisibility(View.VISIBLE);
holder.videoImage.setVisibility(View.VISIBLE);
holder.videoNameText.setVisibility(View.VISIBLE);
holder.mProgressBar.setVisibility(View.GONE);
}
holder.videoPlayBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playPosition=mVideoView.getCurrentPosition();
mVideoView.pause();
mVideoView.setMediaController(null);
//isPaused=true;
isPlaying=false;
//当点击的是第一个视频时设置标志位防止借面滚动事件触发刷新界面
if(mPosition==0){
ifFirst = 3;
}
currentIndex=mPosition;
playPosition=-1;
adapter.notifyDataSetChanged();
}
});
return convertView;
};
}
static class ViewHolder{
ImageView videoImage;
TextView videoNameText;
ImageButton videoPlayBtn;
ProgressBar mProgressBar;
}
static class VideoInfo {
private String url;
private String videoName;
private int videoImage;
public VideoInfo(String url,String name,int path) {
this.videoName=name;
this.videoImage=path;
this.url=url;
}
public String getVideoName() {
return videoName;
}
public void setVideoName(String videoName) {
this.videoName = videoName;
}
public int getVideoImage() {
return videoImage;
}
public void setVideoImage(int videoImage) {
this.videoImage = videoImage;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
}
布局文件:
main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="5dip"
android:paddingLeft="5dip"
android:paddingRight="5dip"
android:paddingTop="5dip"
android:background="#ffffff"
>
<ListView
android:id="@+id/video_listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="#ffffff"
android:dividerHeight="5dp" ></ListView>
</RelativeLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:orientation="vertical"
android:descendantFocusability="blocksDescendants"
android:background="#000000" >
<VideoView
android:id="@+id/videoview"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:visibility="gone"
android:layout_centerInParent="true"
/>
<ImageView
android:id="@+id/video_image"
android:layout_width="fill_parent"
android:layout_height="300dp"
android:contentDescription="this is an image about the movie"
android:scaleType="centerCrop"
android:background="@drawable/video2"
/>
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_centerInParent="true"
android:visibility="gone"
/>
<TextView
android:id="@+id/video_name_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="小鸡小鸡"
android:textSize="24sp"
android:gravity="center_horizontal"
/>
<ImageButton
android:id="@+id/video_play_btn"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_centerInParent="true"
android:background="@drawable/ic_play_video"
android:contentDescription="this is a button and play a video"
/>
</RelativeLayout>
下载地址:http://download.csdn.net/detail/h291850336/9089985