package cn.demo.videolist;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Build;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import cn.demo.videolist.media.IjkVideoView;
import cn.demo.videolist.media.VideoAdapter;
import tv.danmaku.ijk.media.player.IMediaPlayer;
/**
* Author wangchenchen
* CreateDate 2016/8/23.
* Email wcc@jusfoun.com
* Description
*/
public class VideoListLayout extends RelativeLayout {
private RecyclerView videoList;
private LinearLayoutManager mLayoutManager;
private VideoAdapter adapter;
private FrameLayout videoLayout;
private int postion = -1;
private int lastPostion = -1;
private Context context;
private VideoPlayView videoItemView;
private FrameLayout fullScreen;
private VideoListData listData;
private RelativeLayout smallLayout;
private ImageView close;
public VideoListLayout(Context context) {
super(context);
initView(context);
initActions();
}
public VideoListLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
initActions();
}
public VideoListLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
initActions();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public VideoListLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initView(context);
initActions();
}
private void initView(Context context){
LayoutInflater.from(context).inflate(R.layout.layout_video_list,this,true);
this.context = context;
mLayoutManager = new LinearLayoutManager(context);
videoList = (RecyclerView) findViewById(R.id.video_list);
videoList.setLayoutManager(mLayoutManager);
adapter = new VideoAdapter(context);
videoList.setAdapter(adapter);
fullScreen = (FrameLayout) findViewById(R.id.full_screen);
videoLayout = (FrameLayout) findViewById(R.id.layout_video);
videoItemView = new VideoPlayView(context);
String data = readTextFileFromRawResourceId(context, R.raw.video_list);
listData = new Gson().fromJson(data, VideoListData.class);
adapter.refresh(listData.getList());
smallLayout = (RelativeLayout) findViewById(R.id.small_layout);
close = (ImageView) findViewById(R.id.close);
}
private void initActions() {
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (videoItemView.isPlay()) {
videoItemView.stop();
postion = -1;
lastPostion = -1;
videoLayout.removeAllViews();
smallLayout.setVisibility(View.GONE);
}
}
});
smallLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
smallLayout.setVisibility(View.GONE);
((Activity)context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
});
videoItemView.setCompletionListener(new VideoPlayView.CompletionListener() {
@Override
public void completion(IMediaPlayer mp) {
//播放完还原播放界面
if (smallLayout.getVisibility() == View.VISIBLE) {
videoLayout.removeAllViews();
smallLayout.setVisibility(View.GONE);
videoItemView.setShowContoller(true);
}
FrameLayout frameLayout = (FrameLayout) videoItemView.getParent();
videoItemView.release();
if (frameLayout != null && frameLayout.getChildCount() > 0) {
frameLayout.removeAllViews();
View itemView = (View) frameLayout.getParent();
if (itemView != null) {
itemView.findViewById(R.id.showview).setVisibility(View.VISIBLE);
}
}
lastPostion = -1;
}
});
adapter.setClick(new VideoAdapter.onClick() {
@Override
public void onclick(int position) {
VideoListLayout.this.postion = position;
if (videoItemView.VideoStatus() == IjkVideoView.STATE_PAUSED) {
if (position != lastPostion) {
videoItemView.stop();
videoItemView.release();
}
}
if (smallLayout.getVisibility() == View.VISIBLE)
{
smallLayout.setVisibility(View.GONE);
videoLayout.removeAllViews();
videoItemView.setShowContoller(true);
}
if (lastPostion != -1)
{
ViewGroup last = (ViewGroup) videoItemView.getParent();//找到videoitemview的父类,然后remove
if (last != null) {
last.removeAllViews();
View itemView = (View) last.getParent();
if (itemView != null) {
itemView.findViewById(R.id.showview).setVisibility(View.VISIBLE);
}
}
}
if (videoItemView.getParent() != null) {
((ViewGroup) videoItemView.getParent()).removeAllViews();
}
View view = videoList.findViewHolderForAdapterPosition(postion).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.layout_video);
frameLayout.removeAllViews();
frameLayout.addView(videoItemView);
videoItemView.start(listData.getList().get(position).getMp4_url());
lastPostion = position;
}
});
videoList.addOnChildAttachStateChangeListener(new RecyclerView.OnChildAttachStateChangeListener() {
@Override
public void onChildViewAttachedToWindow(View view) {
int index = videoList.getChildAdapterPosition(view);
view.findViewById(R.id.showview).setVisibility(View.VISIBLE);
if (index == postion) {
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.layout_video);
frameLayout.removeAllViews();
if (videoItemView != null &&
((videoItemView.isPlay()) || videoItemView.VideoStatus() == IjkVideoView.STATE_PAUSED)) {
view.findViewById(R.id.showview).setVisibility(View.GONE);
}
if (videoItemView.VideoStatus() == IjkVideoView.STATE_PAUSED) {
if (videoItemView.getParent() != null)
((ViewGroup) videoItemView.getParent()).removeAllViews();
frameLayout.addView(videoItemView);
return;
}
if (smallLayout.getVisibility() == View.VISIBLE && videoItemView != null && videoItemView.isPlay()) {
smallLayout.setVisibility(View.GONE);
videoLayout.removeAllViews();
videoItemView.setShowContoller(true);
frameLayout.addView(videoItemView);
}
}
}
@Override
public void onChildViewDetachedFromWindow(View view) {
int index = videoList.getChildAdapterPosition(view);
if (index == postion) {
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.layout_video);
frameLayout.removeAllViews();
if (smallLayout.getVisibility() == View.GONE && videoItemView != null
&& videoItemView.isPlay()) {
videoLayout.removeAllViews();
videoItemView.setShowContoller(false);
videoLayout.addView(videoItemView);
smallLayout.setVisibility(View.VISIBLE);
}
}
}
});
}
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (videoItemView != null) {
videoItemView.onChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
fullScreen.setVisibility(View.GONE);
videoList.setVisibility(View.VISIBLE);
fullScreen.removeAllViews();
if (postion <= mLayoutManager.findLastVisibleItemPosition()
&& postion >= mLayoutManager.findFirstVisibleItemPosition()) {
View view = videoList.findViewHolderForAdapterPosition(postion).itemView;
FrameLayout frameLayout = (FrameLayout) view.findViewById(R.id.layout_video);
frameLayout.removeAllViews();
frameLayout.addView(videoItemView);
videoItemView.setShowContoller(true);
} else {
videoLayout.removeAllViews();
videoLayout.addView(videoItemView);
videoItemView.setShowContoller(false);
smallLayout.setVisibility(View.VISIBLE);
}
videoItemView.setContorllerVisiable();
} else {
ViewGroup viewGroup = (ViewGroup) videoItemView.getParent();
if (viewGroup == null)
return;
viewGroup.removeAllViews();
fullScreen.addView(videoItemView);
smallLayout.setVisibility(View.GONE);
videoList.setVisibility(View.GONE);
fullScreen.setVisibility(View.VISIBLE);
}
} else {
adapter.notifyDataSetChanged();
videoList.setVisibility(View.VISIBLE);
fullScreen.setVisibility(View.GONE);
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (videoItemView==null)
videoItemView=new VideoPlayView(context);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (videoLayout == null)
return;
if (smallLayout.getVisibility() == View.VISIBLE) {
smallLayout.setVisibility(View.GONE);
videoLayout.removeAllViews();
}
if (postion != -1) {
ViewGroup view = (ViewGroup) videoItemView.getParent();
if (view != null) {
view.removeAllViews();
}
}
videoItemView.stop();
videoItemView.release();
videoItemView.onDestroy();
videoItemView = null;
}
public String readTextFileFromRawResourceId(Context context, int resourceId) {
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(context.getResources().openRawResource(
resourceId)));
try {
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
builder.append(line).append("\n");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return builder.toString();
}
}