package com.example.dremone.fragment;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.res.Configuration;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import com.example.dremone.R;
import com.example.dremone.VideoHorizontalActivity;
import com.example.video.DensityUtil;
import com.example.video.FullScreenVideoView;
import com.example.video.LightnessController;
public class FragmentVideoVertical extends Fragment implements OnClickListener {
// 含参视频播放
public FragmentVideoVertical(String videoUrl, String title) {
this.videoUrl = videoUrl;
this.title = title;
}
@Override
public void onResume() {
super.onResume();
}
// 自定义VideoView
private FullScreenVideoView mVideo;
// 头部View
private View mTopView;
// 底部View
private View mBottomView;
// 视频播放拖动条
private SeekBar mSeekBar;
private ImageView mPlay;
private TextView mPlayTime;
private TextView mDurationTime;
// 屏幕宽高
private float width;
private float height;
// 视频播放时间
private int playTime;
// 视频地址
private String videoUrl;
// 视频标题
private String title;
// 自动隐藏顶部和底部View的时间
private static final int HIDE_TIME = 1000;
// 原始屏幕亮度
private int orginalLight;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.video_vertical, container, false);
init(view);
return view;
}
private void init(View view) {
mVideo = (FullScreenVideoView) view.findViewById(R.id.videoview);
mPlayTime = (TextView) view.findViewById(R.id.play_time);
mDurationTime = (TextView) view.findViewById(R.id.total_time);
mPlay = (ImageView) view.findViewById(R.id.play_btn);
mSeekBar = (SeekBar) view.findViewById(R.id.seekbar);
mTopView = view.findViewById(R.id.top_layout);
mBottomView = view.findViewById(R.id.bottom_layout);
width = DensityUtil.getWidthInPx(getActivity());
height = DensityUtil.getHeightInPx(getActivity());
threshold = DensityUtil.dip2px(getActivity(), 18);
// 设置标题
((TextView) view.findViewById(R.id.detail_title_font)).setText(title);
// 返回按钮设置
((ImageView) view.findViewById(R.id.iv_back_video))
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getActivity().finish();
}
});
// 最大化转屏设置
((ImageView) view.findViewById(R.id.iv_big_video))
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mVideo.isPlaying()) {
mVideo.pause();
}
// 开启全屏播放
Intent intent = new Intent(getActivity(),
VideoHorizontalActivity.class);
intent.putExtra("url", videoUrl);
intent.putExtra("title", title);
startActivity(intent);
}
});
;
orginalLight = LightnessController.getLightness(getActivity());
mPlay.setOnClickListener(this);
mSeekBar.setOnSeekBarChangeListener(mSeekBarChangeListener);
playVideo();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
height = DensityUtil.getWidthInPx(getActivity());
width = DensityUtil.getHeightInPx(getActivity());
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
width = DensityUtil.getWidthInPx(getActivity());
height = DensityUtil.getHeightInPx(getActivity());
}
super.onConfigurationChanged(newConfig);
}
@Override
public void onPause() {
super.onPause();
LightnessController.setLightness(getActivity(), orginalLight);
}
private OnSeekBarChangeListener mSeekBarChangeListener = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mHandler.postDelayed(hideRunnable, HIDE_TIME);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
mHandler.removeCallbacks(hideRunnable);
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if (fromUser) {
int time = progress * mVideo.getDuration() / 100;
mVideo.seekTo(time);
}
}
};
private void backward(float delataX) {
int current = mVideo.getCurrentPosition();
int backwardTime = (int) (delataX / width * mVideo.getDuration());
int currentTime = current - backwardTime;
mVideo.seekTo(currentTime);
mSeekBar.setProgress(currentTime * 100 / mVideo.getDuration());
mPlayTime.setText(formatTime(currentTime));
}
private void forward(float delataX) {
int current = mVideo.getCurrentPosition();
int forwardTime = (int) (delataX / width * mVideo.getDuration());
int currentTime = current + forwardTime;
mVideo.seekTo(currentTime);
mSeekBar.setProgress(currentTime * 100 / mVideo.getDuration());
mPlayTime.setText(formatTime(currentTime));
}
private void lightDown(float delatY) {
int down = (int) (delatY / height * 255 * 3);
int transformatLight = LightnessController.getLightness(getActivity())
- down;
LightnessController.setLightness(getActivity(), transformatLight);
}
private void lightUp(float delatY) {
int up = (int) (delatY / height * 255 * 3);
int transformatLight = LightnessController.getLightness(getActivity())
+ up;
LightnessController.setLightness(getActivity(), transformatLight);
}
@Override
public void onDestroy() {
super.onDestroy();
mHandler.removeMessages(0);
mHandler.removeCallbacksAndMessages(null);
}
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
if (mVideo.getCurrentPosition() > 0) {
mPlayTime.setText(formatTime(mVideo.getCurrentPosition()));
int progress = mVideo.getCurrentPosition() * 100
/ mVideo.getDuration();
mSeekBar.setProgress(progress);
if (mVideo.getCurrentPosition() > mVideo.getDuration() - 100) {
mPlayTime.setText("00:00");
mSeekBar.setProgress(0);
}
mSeekBar.setSecondaryProgress(mVideo.getBufferPercentage());
} else {
mPlayTime.setText("00:00");
mSeekBar.setProgress(0);
}
break;
case 2:
showOrHide();
break;
default:
break;
}
}
};
@SuppressLint("ClickableViewAccessibility")
private void playVideo() {
mVideo.setVideoPath(videoUrl);
mVideo.requestFocus();
mVideo.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mVideo.setVideoWidth(mp.getVideoWidth());
mVideo.setVideoHeight(mp.getVideoHeight());
mVideo.start();
if (playTime != 0) {
mVideo.seekTo(playTime);
}
mHandler.removeCallbacks(hideRunnable);
mHandler.postDelayed(hideRunnable, HIDE_TIME);
mDurationTime.setText(formatTime(mVideo.getDuration()));
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
mHandler.sendEmptyMessage(1);
}
}, 0, 1000);
}
});
mVideo.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mPlay.setImageResource(R.drawable.video_btn_down);
mPlayTime.setText("00:00");
mSeekBar.setProgress(0);
}
});
mVideo.setOnTouchListener(mTouchListener);
}
private Runnable hideRunnable = new Runnable() {
@Override
public void run() {
showOrHide();
}
};
@SuppressLint("SimpleDateFormat")
private String formatTime(long time) {
DateFormat formatter = new SimpleDateFormat("mm:ss");
return formatter.format(new Date(time));
}
private float mLastMotionX;
private float mLastMotionY;
private int startX;
private int startY;
private int threshold;
private boolean isClick = true;
private OnTouchListener mTouchListener = new OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
final float x = event.getX();
final float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mLastMotionX = x;
mLastMotionY = y;
startX = (int) x;
startY = (int) y;
break;
case MotionEvent.ACTION_MOVE:
float deltaX = x - mLastMotionX;
float deltaY = y - mLastMotionY;
float absDeltaX = Math.abs(deltaX);
float absDeltaY = Math.abs(deltaY);
// 声音调节标识
boolean isAdjustAudio = false;
if (absDeltaX > threshold && absDeltaY > threshold) {
if (absDeltaX < absDeltaY) {
isAdjustAudio = true;
} else {
isAdjustAudio = false;
}
} else if (absDeltaX < threshold && absDeltaY > threshold) {
isAdjustAudio = true;
} else if (absDeltaX > threshold && absDeltaY < threshold) {
isAdjustAudio = false;
} else {
return true;
}
if (isAdjustAudio) {
if (x < width / 2) {
if (deltaY > 0) {
lightDown(absDeltaY);
} else if (deltaY < 0) {
lightUp(absDeltaY);
}
} else {
if (deltaY > 0) {
// volumeDown(absDeltaY);
} else if (deltaY < 0) {
// volumeUp(absDeltaY);
}
}
} else {
if (deltaX > 0) {
forward(absDeltaX);
} else if (deltaX < 0) {
backward(absDeltaX);
}
}
mLastMotionX = x;
mLastMotionY = y;
break;
case MotionEvent.ACTION_UP:
if (Math.abs(x - startX) > threshold
|| Math.abs(y - startY) > threshold) {
isClick = false;
}
mLastMotionX = 0;
mLastMotionY = 0;
startX = (int) 0;
if (isClick) {
showOrHide();
}
isClick = true;
break;
default:
break;
}
return true;
}
};
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.play_btn:
if (mVideo.isPlaying()) {
mVideo.pause();
mPlay.setImageResource(R.drawable.video_btn_down);
} else {
mVideo.start();
mPlay.setImageResource(R.drawable.video_btn_on);
}
break;
default:
break;
}
}
private void showOrHide() {
if (mTopView.getVisibility() == View.VISIBLE) {
mTopView.clearAnimation();
Animation animation = AnimationUtils.loadAnimation(getActivity(),
R.anim.option_leave_from_top);
animation.setAnimationListener(new AnimationImp() {
@Override
public void onAnimationEnd(Animation animation) {
super.onAnimationEnd(animation);
mTopView.setVisibility(View.GONE);
}
});
mTopView.startAnimation(animation);
mBottomView.clearAnimation();
Animation animation1 = AnimationUtils.loadAnimation(getActivity(),
R.anim.option_leave_from_bottom);
animation1.setAnimationListener(new AnimationImp() {
@Override
public void onAnimationEnd(Animation animation) {
super.onAnimationEnd(animation);
mBottomView.setVisibility(View.GONE);
}
});
mBottomView.startAnimation(animation1);
} else {
mTopView.setVisibility(View.VISIBLE);
mTopView.clearAnimation();
Animation animation = AnimationUtils.loadAnimation(getActivity(),
R.anim.option_entry_from_top);
mTopView.startAnimation(animation);
mBottomView.setVisibility(View.VISIBLE);
mBottomView.clearAnimation();
Animation animation1 = AnimationUtils.loadAnimation(getActivity(),
R.anim.option_entry_from_bottom);
mBottomView.startAnimation(animation1);
mHandler.removeCallbacks(hideRunnable);
mHandler.postDelayed(hideRunnable, HIDE_TIME);
}
}
private class AnimationImp implements AnimationListener {
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationStart(Animation animation) {
}
}
}