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) { } } }