小学渣一枚,自己在模仿着写视频播放器,总布局是TabHost的样式(继承TabActivity实现),问题就此出现。首先,进入下面这个界面会特别卡(界面的滑动更卡 ,求解):但是进入别的包含ListView的界面就不会,而且我把这个模块单独拉出来写个App,就不卡。这个界面采用ListView中添加VideoView的形式,视频播放功能的实现没有问题,点击图片会开始播放视频,正在播放的视频划出界面后,会暂停播放。
问题来了,视频在加载播放之前,背景透明了(没错,那个透明的部分是我的手机桌面 ):而且滑动ListView的时候,正在播放但即将被划出导致暂停的视频,会因为卡,部分背景也透明了:Activity代码:public class HomeHotActivity extends Activity{

private ListView mListView;
private List<VideoInfo> videoList=new ArrayList<VideoInfo>();
private VideoInfo video;
private myAdapter adapter;
private int currentIndex=-1;
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;

@Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_hot);

initListView();
} private void initListView() {
for(int i=0;i<50;i++){
if(i%2==0){
video=new VideoInfo(url1,"猛龙过江"+i,R.drawable.c);
}else{
video=new VideoInfo(url2,"猛龙过江"+i,R.drawable.b);
}
videoList.add(video);
}
mListView=(ListView) findViewById(R.id.lv_hot);
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) {
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);
}
}
});
}

class myAdapter extends BaseAdapter{ @Override
public int getCount() {
return videoList.size();
} @Override
public Object getItem(int position) {
return videoList.get(position);
} @Override
public long getItemId(int position) {
return position;
} class ViewHolder{
ImageView videoImage;
TextView videoNameText;
ImageButton videoPlayBtn;
ProgressBar mProgressBar;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
final int mPosition=position;
if(convertView==null){
convertView=LayoutInflater.from(HomeHotActivity.this).inflate(R.layout.hot_lisview_item, 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(HomeHotActivity.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();
currentIndex=-1;
isPaused=false;
        isPlaying=false;
        holder.mProgressBar.setVisibility(View.GONE);
adapter.notifyDataSetChanged();
}
}
});
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) {
currentIndex=mPosition;
playPosition=-1;
adapter.notifyDataSetChanged();
}
});
return convertView;
};
}

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;
}

}
ListView  item的布局文件:<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"
android:background="@color/black" >

<VideoView 
android:id="@+id/videoview"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_centerInParent="true" />

<ProgressBar 
android:id="@+id/progressbar"
android:visibility="gone"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_centerInParent="true" /> <ImageView
    android:id="@+id/video_image"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:background="@drawable/b"
    android:scaleType="centerCrop" /> <ImageButton
    android:id="@+id/video_play_btn"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:background="@drawable/play_btn" /> <TextView
    android:id="@+id/video_name_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/video_image"
    android:textSize="10sp"
    android:textColor="@color/white"
    android:background="#99454545"
    android:text=" 杜斯卡" /></RelativeLayout>
求大神解答,求解答,求解答(重要的事情要说三遍) 

解决方案 »

  1.   

    请问楼主    现在问题解决了么  我现在也遇到了这样的问题,视频播放的时候向上和向下滑动,videoview快要滑出界面时,视频会覆盖顶上的导航条,求教楼主········
      

  2.   

    videoview加载耗时。 可以尝试使用surfaceview
      

  3.   


    請問可否說下解決的方法, listview內嵌影片的方式我也很想知道
    播放影片時滑動不會有buffer的殘留嗎
      

  4.   

    我是因为adapter多次重复调用了getview(),导致白屏,是由于listview的layout_height属性设置成了wrap_content导致,将layout_height属性设置成math_parent或者固定高度也可以解决这个问题。