package com.example.dremone; 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.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.media.AudioManager; 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.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; 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.video.DensityUtil; import com.example.video.FullScreenVideoView; import com.example.video.LightnessController; import com.example.video.VolumnController; public class VideoHorizontalActivity extends Activity implements OnClickListener { // 自定义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 AudioManager mAudioManager; // 屏幕宽高 private float width; private float height; // 视频播放时间 private int playTime; // 视频地址 private String videoUrl; // 视频标题 private String title; // 自动隐藏顶部和底部View的时间 private static final int HIDE_TIME = 5000; // 声音调节Toast private VolumnController volumnController; // 原始屏幕亮度 private int orginalLight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.video_horizontal); init(); playVideo(); } /** * 初始化数据 */ private void init() { // 加载视频信息 Intent intent = getIntent(); this.videoUrl = intent.getStringExtra("url"); this.title = intent.getStringExtra("title"); // 初始化视频信息 volumnController = new VolumnController(this); mVideo = (FullScreenVideoView) findViewById(R.id.videoview_h); mPlayTime = (TextView) findViewById(R.id.play_time_h); mDurationTime = (TextView) findViewById(R.id.total_time_h); mPlay = (ImageView) findViewById(R.id.play_btn_h); mSeekBar = (SeekBar) findViewById(R.id.seekbar_h); mTopView = findViewById(R.id.top_layout_h); mBottomView = findViewById(R.id.bottom_layout_h); // 设置标题 ((TextView) findViewById(R.id.detail_title_font_h)).setText(title); // 返回按钮设置 ((ImageView) findViewById(R.id.iv_back_video_h)) .setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); width = DensityUtil.getWidthInPx(this); height = DensityUtil.getHeightInPx(this); threshold = DensityUtil.dip2px(this, 18); orginalLight = LightnessController.getLightness(this); mPlay.setOnClickListener(this); mSeekBar.setOnSeekBarChangeListener(mSeekBarChangeListener); } @Override public void onConfigurationChanged(Configuration newConfig) { if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { height = DensityUtil.getWidthInPx(this); width = DensityUtil.getHeightInPx(this); } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { width = DensityUtil.getWidthInPx(this); height = DensityUtil.getHeightInPx(this); } super.onConfigurationChanged(newConfig); } @Override protected void onPause() { super.onPause(); LightnessController.setLightness(this, 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 volumeDown(float delatY) { int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); int current = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); int down = (int) (delatY / height * max * 3); int volume = Math.max(current - down, 0); mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0); int transformatVolume = volume * 100 / max; volumnController.show(transformatVolume); } private void volumeUp(float delatY) { int max = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); int current = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); int up = (int) ((delatY / height) * max * 3); int volume = Math.min(current + up, max); mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0); int transformatVolume = volume * 100 / max; volumnController.show(transformatVolume); } private void lightDown(float delatY) { int down = (int) (delatY / height * 255 * 3); int transformatLight = LightnessController.getLightness(this) - down; LightnessController.setLightness(this, transformatLight); } private void lightUp(float delatY) { int up = (int) (delatY / height * 255 * 3); int transformatLight = LightnessController.getLightness(this) + up; LightnessController.setLightness(this, transformatLight); } @Override protected 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_h: 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(this, 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(this, 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(this, R.anim.option_entry_from_top); mTopView.startAnimation(animation); mBottomView.setVisibility(View.VISIBLE); mBottomView.clearAnimation(); Animation animation1 = AnimationUtils.loadAnimation(this, 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) { } } /** * 转屏处理 */ @Override public void finish() { /** * 设置为竖直屏显示 */ if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } super.finish(); } }