//适配布局
package com.example.lenovo.surfaceview.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.example.lenovo.surfaceview.R;
import com.example.lenovo.surfaceview.bean.VideoBean;
import com.example.lenovo.surfaceview.widget.VideoSurfaceView;
import java.util.List;
public class VideoListAdapter extends RecyclerView.Adapter<VideoListAdapter.ViewHolder> {
private Context mContext;
private List<VideoBean> mDatas;
// 记录上一次播放的VideoView
private VideoSurfaceView mPlayingView;
public VideoListAdapter(Context context, List<VideoBean> datas) {
mContext = context;
mDatas = datas;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_video, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final VideoBean videoBean = mDatas.get(position);
holder.mTitleTextView.setText(videoBean.getTitle());
// item刚复用进入屏幕时,无论是否播放都停止并隐藏
holder.mSurfaceView.stop();
holder.mSurfaceView.setVisibility(View.INVISIBLE);
holder.mPlayBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 下一次播放时,停止上一次播放
if (mPlayingView != null) {
mPlayingView.stop();
mPlayingView.setVisibility(View.INVISIBLE);
}
// 播放当前位置的视频
holder.mSurfaceView.setVisibility(View.VISIBLE);// 显示
holder.mSurfaceView.playVideo(videoBean.getPlayUrl());
mPlayingView = holder.mSurfaceView;
}
});
}
@Override
public int getItemCount() {
return mDatas == null ? 0 : mDatas.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
Button mPlayBtn;
TextView mTitleTextView;
TextView mProgressTextView;
VideoSurfaceView mSurfaceView;
public ViewHolder(View itemView) {
super(itemView);
mPlayBtn = ((Button) itemView.findViewById(R.id.play_btn));
mTitleTextView = ((TextView) itemView.findViewById(R.id.title_tv));
mProgressTextView = ((TextView) itemView.findViewById(R.id.progress_tv));
mSurfaceView = ((VideoSurfaceView) itemView.findViewById(R.id.video_view));
}
}
}
package com.example.lenovo.surfaceview.bean;
import java.util.List;
public class KaiyanBean {
private List<ItemBean> itemList;
public List<ItemBean> getItemList() {
return itemList;
}
public void setItemList(List<ItemBean> itemList) {
this.itemList = itemList;
}
public static class ItemBean {
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
private String type;
private DataBean data;
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
private String title;
private String playUrl;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPlayUrl() {
return playUrl;
}
public void setPlayUrl(String playUrl) {
this.playUrl = playUrl;
}
}
}
}
1 package com.example.lenovo.surfaceview.bean;
2
3 public class VideoBean {
4
5 private String title;
6 private String playUrl;
7
8 public VideoBean(String title, String playUrl) {
9 this.title = title;
10 this.playUrl = playUrl;
11 }
12
13 public String getTitle() {
14 return title;
15 }
16
17 public void setTitle(String title) {
18 this.title = title;
19 }
20
21 public String getPlayUrl() {
22 return playUrl;
23 }
24
25 public void setPlayUrl(String playUrl) {
26 this.playUrl = playUrl;
27 }
28 }
package com.example.lenovo.surfaceview.httpservice;
import com.example.lenovo.surfaceview.bean.KaiyanBean;
import retrofit2.Call;
import retrofit2.http.GET;
public interface KaiyanHttpService {
@GET("api/v4/tabs/selected?udid=11111&vc=168&vn=3.3.1&deviceModel=Huawei%36&first_channel=eyepetizer_baidu_market&last_channel=eyepetizer_baidu_market&system_version_code=20")
Call<KaiyanBean> getKaiyanCall();
}
//http
package com.example.lenovo.surfaceview.widget;
import android.content.Context;
import android.media.MediaPlayer;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* 能播放视频的SurfaceView,封装MediaPlayer
* 提供一个public方法用于设置播放路径和播放的方法
*/
public class VideoSurfaceView extends SurfaceView implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener {
private SurfaceHolder mHolder;
private MediaPlayer mMediaPlayer;
public VideoSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
// 获得缓冲区持有者
mHolder = getHolder();
// 设置生命周期的回调
mHolder.addCallback(this);
}
// 设置播放路径并播放
public void playVideo(String path) {
if (mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer();
// 准备完毕监听器
mMediaPlayer.setOnPreparedListener(this);
}
try {
// 重置MediaPlayer
mMediaPlayer.reset();
// 设置画面播放源
mMediaPlayer.setDisplay(mHolder);
// 设置播放源
mMediaPlayer.setDataSource(path);
// 准备播放
mMediaPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
Log.e("1507", e.getMessage());
}
}
// 停止播放
public void stop() {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mMediaPlayer != null) {
mMediaPlayer.release();// 释放资源
mMediaPlayer = null;
}
}
@Override
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start();
}
}
package com.example.lenovo.surfaceview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import com.example.lenovo.surfaceview.adapter.VideoListAdapter;
import com.example.lenovo.surfaceview.bean.KaiyanBean;
import com.example.lenovo.surfaceview.bean.VideoBean;
import com.example.lenovo.surfaceview.httpservice.KaiyanHttpService;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* 1、封装播放视频的SurfaceView
* 2、网络请求数据(手写bean):bean、httpservice
* 3、放在RecyclerView中展示
* 4、item中放入SurfaceView
* 5、点击播放弹出通知
* 6、进度
*/
public class MainActivity extends AppCompatActivity implements Callback<KaiyanBean> {
protected RecyclerView mRecyclerView;
private Object mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_main);
initView();
initData();
}
private void initData() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://baobab.kaiyanapp.com/")
.addConverterFactory(GsonConverterFactory.create()).build();
retrofit.create(KaiyanHttpService.class)
.getKaiyanCall()
.enqueue(this);
}
private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
}
@Override
public void onResponse(Call<KaiyanBean> call, Response<KaiyanBean> response) {
KaiyanBean kaiyanBean = response.body();
List<VideoBean> videoList = new ArrayList<>();
for (KaiyanBean.ItemBean itemBean : kaiyanBean.getItemList()) {
Log.d("1507","type: " + itemBean.getType()+ ", title : " + itemBean.getData().getTitle() + "url : " + itemBean.getData().getPlayUrl());
if ("video".equals(itemBean.getType())) {
// 过滤掉type不为video的数据
VideoBean videoBean = new VideoBean(itemBean.getData().getTitle(), itemBean.getData().getPlayUrl());
videoList.add(videoBean);
}
}
VideoListAdapter adapter = new VideoListAdapter(this, videoList);
mRecyclerView.setAdapter(adapter);
}
@Override
public void onFailure(Call<KaiyanBean> call, Throwable t) {
}
}
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"/>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/progress_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="当前进度"/>
<Button
android:id="@+id/play_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="播放"/>
<TextView
android:id="@+id/title_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题"/>
//重写
<com.example.lenovo.surfaceview.widget.VideoSurfaceView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_gravity="center_horizontal"/>
</LinearLayout>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.github.bumptech.glide:glide:3.8.0'