package com.amlogic.tzr.charismatic_yichang.activity; import android.annotation.SuppressLint; import android.content.Context; import android.media.AudioManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageView; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.TextView; import com.amlogic.tzr.charismatic_yichang.BaseActivity; import com.amlogic.tzr.charismatic_yichang.R; import com.amlogic.tzr.charismatic_yichang.Tool.DensityUtil; import com.amlogic.tzr.charismatic_yichang.adapter.VideoListAdapter; import com.amlogic.tzr.charismatic_yichang.bean.VideoListBean; import com.amlogic.tzr.charismatic_yichang.view.FullVideoView; import java.util.ArrayList; /** * 视频播放界面 * * @author WangYuWen * @version 1.0 * @date 2015年3月5日 * @Copyright: Copyright (c) 2014 Shenzhen Utoow Technology Co., Ltd. All rights * reserved. */ public class VideoPlayActivity extends BaseActivity { /** 右边列表控件 */ private ListView listview; /** 右边缩放控件 */ private RelativeLayout right_relative; /** 上一首 */ private ImageView img_last; /** 下一首 */ private ImageView img_next; /** 播放 */ private ImageView img_start; /** 全屏播放 */ private ImageView img_full; /** 加减声音 */ private ImageView img_voice; /** 列表适配器 */ private VideoListAdapter adapter; /** 列表集合 */ private ArrayList<VideoListBean> list; /** 播放视频的背景图片 */ private ImageView video_img; /** 亮度或者声音的图片 */ private ImageView img_center; /** 调节进度 */ private ImageView img_pres_white; /** 底部视图栏 */ private RelativeLayout buttom_relative; private View view; private FullVideoView video_VideoView; /** 当前播放时间 */ private TextView txt_current_time; /** 总时间 */ private TextView txt_max_time; /** 当前播放进度 */ private ImageView img_white; /** 播放进度背景 */ private ImageView img_bg; /** 拖放进度 */ private ImageView img_center_speed; private AudioManager mAudioManager; /** 最大音量 */ private int mMaxVolume; /** 当前声音 */ private int mVolume = -1; /** 当前亮度 */ private float mBrightness = -1f; /** 屏幕宽度 */ private int width; /** 屏幕高度 */ private int height; /** 手势 */ private GestureDetector mGestureDetector; /** 视频总长度 */ private long mVideo_total_length; /** 视频当前长度 */ private long mVideo_current_length; /** 按下手势时的X点 */ private float downX = 0; /** 按下手势时的Y点 */ private float downY = 0; /** 移动手势时的Y点 */ private float moveY = 0; /** 移动手势时的X点 */ private float moveX = 0; /** 记录上一次移动手势时的X点 */ private float OldMoveX = 0; /** 记录上一次移动手势时的y点 */ private float OldMoveY = 0; /** 双数才执行(在用到的地方有详细的解释) */ private int evens = 0; /** 是否显示全屏 */ private boolean isVH = true; /** 是否快进了 */ private boolean isVideo = false; /** 是否调节了音量 */ private boolean isVoice = false; /** 是否调节了亮度 */ private boolean isBright = false; /** 是否点击了开始播放 */ private boolean isStart = false; /** 当前播放位置 */ private int index_position = 0; private static final int handKey = 123; /** 视频路径 这是视频本地路径,资源的话你们自己去找,文件夹有创建,*/ private String Path = Environment.getExternalStorageDirectory() + "/wywVideo/"; private String url; private Uri mUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_video_list); Bundle bundle=getIntent().getExtras(); if (bundle!=null){ url=bundle.getString("video_url"); mUri=Uri.parse(url); } // mUri=Uri.parse("http://vod.yichang.gov.cn/2009/%E6%97%85%E6%B8%B8%E7%AF%87%E7%BD%91%E7%BB%9C%E7%89%88.wmv"); findViews(); init(); } private void findViews() { img_last = (ImageView) findViewById(R.id.video_img_last); img_start = (ImageView) findViewById(R.id.video_img_start); img_next = (ImageView) findViewById(R.id.video_img_next); img_full = (ImageView) findViewById(R.id.video_img_full); img_voice = (ImageView) findViewById(R.id.video_img_voice); video_img = (ImageView) findViewById(R.id.video_img); img_center = (ImageView) findViewById(R.id.video_img_center); img_pres_white = (ImageView) findViewById(R.id.video_img_pres_front); txt_current_time = (TextView) findViewById(R.id.video_txt_current_time); txt_max_time = (TextView) findViewById(R.id.video_txt_max_time); img_white = (ImageView) findViewById(R.id.video_videoview_pres_front); img_bg = (ImageView) findViewById(R.id.video_videoview_pres_bg); img_center_speed = (ImageView) findViewById(R.id.video_img_center_speed); video_VideoView = (FullVideoView) findViewById(R.id.video_VideoView); view = findViewById(R.id.video_frame); // 获取屏幕宽度 width = getWindowManager().getDefaultDisplay().getWidth(); // 获取屏幕高度 height = getWindowManager().getDefaultDisplay().getHeight(); right_relative = (RelativeLayout) findViewById(R.id.video_relative_right); right_relative.setVisibility(View.INVISIBLE); buttom_relative = (RelativeLayout) findViewById(R.id.video_relative_buttom); // 右边试图宽度为屏幕宽度的3分之1 right_relative.getLayoutParams().width = width / 3; listview = (ListView) findViewById(R.id.video_listview); widgetListener(); } private void init() { mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); // File file = new File(Path); // if (!file.exists()) { // file.mkdirs(); // } list = new ArrayList<VideoListBean>(); mGestureDetector = new GestureDetector(this, new MyGestureListener()); adapter = new VideoListAdapter(VideoPlayActivity.this, list); listview.setAdapter(adapter); // new Thread(runnable2).start(); mVideo_total_length = video_VideoView.getDuration();// 获取视频总长度 // 设置总时长(总长度换算成时间) txt_max_time.setText(length2time(mVideo_total_length)); isStart = true; video_VideoView.setVideoURI(mUri); video_VideoView.start(); img_start.setImageResource(R.drawable.pause_video_df); handler.postAtTime(runnable, 0); } @Override protected void onStart() { super.onStart(); } /** 点击事件 */ private void widgetListener() { /** 列表点击事件 */ listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { index_position = position; txt_max_time.setText(R.string.play_time); img_start.setImageResource(R.drawable.start_video_df); video_VideoView.stopPlayback(); // setVideo(position); } }); /** 上一首 */ img_last.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { index_position--; if (index_position>=0) { txt_max_time.setText(R.string.play_time); img_start.setImageResource(R.drawable.start_video_df); video_VideoView.stopPlayback(); // setVideo(index_position); }else{ index_position=0; } } }); /** 下一首 */ img_next.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { index_position++; img_start.setImageResource(R.drawable.start_video_df); txt_max_time.setText(R.string.play_time); video_VideoView.stopPlayback(); // setVideo(index_position); } }); /** 播放 */ img_start.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { video_img.setVisibility(View.GONE); if (video_VideoView.isPlaying()) { video_VideoView.pause(); img_start.setImageResource(R.drawable.start_video_df); } else { mVideo_total_length = video_VideoView.getDuration();// 获取视频总长度 // 设置总时长(总长度换算成时间) txt_max_time.setText(length2time(mVideo_total_length)); isStart = true; video_VideoView.start(); img_start.setImageResource(R.drawable.pause_video_df); handler.postAtTime(runnable, 0); } } }); /** 全屏 */ img_full.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isVH) { WindowManager.LayoutParams params = getWindow().getAttributes(); params.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setAttributes(params); getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); right_relative.setVisibility(View.GONE); buttom_relative.setVisibility(View.GONE); isVH = false; } else { WindowManager.LayoutParams params = getWindow().getAttributes(); params.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setAttributes(params); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); buttom_relative.setVisibility(View.VISIBLE); isVH = true; } } }); /** 是否显示右边视图点击事件 */ img_voice.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (right_relative.isShown()) { right_relative.setVisibility(View.GONE); } else { right_relative.setVisibility(View.VISIBLE); } } }); /** 右边视图 */ right_relative.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { right_relative.setVisibility(View.GONE); } }); } private Runnable runnable2 = new Runnable() { @Override public void run() { // doSearch(Path); Message message = handler.obtainMessage(); message.what = handKey; handler.sendMessage(message); } }; /** * 搜索该路径下面的所有文件 * * @version 1.0 * @createTime 2015年3月12日,下午2:11:47 * @updateTime 2015年3月12日,下午2:11:47 * @createAuthor WangYuWen * @updateAuthor WangYuWen * @updateInfo (此处输入修改内容,若无修改可不写.) * * @param */ /* private void doSearch(String path) { File file = new File(path); if (file.exists()) { if (file.isDirectory()) { File[] fileArray = file.listFiles(); for (File f : fileArray) { if (f.isDirectory()) {// 判断是否文件夹 // 文件夹为true doSearch(f.getPath()); } else { if (f.getName().endsWith("mp4") || f.getName().endsWith("3gp")) { VideoListBean bean = new VideoListBean(); bean.setVideo_name(f.getName()); bean.setVideo_path(f.getAbsolutePath()); Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(f.getAbsolutePath(), Thumbnails.MINI_KIND); if (bitmap != null) { bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth() * 300 / bitmap.getHeight(), 300, true); bean.setVideo_imgbg(bitmap); } list.add(bean); } } } } } }*/ @Override public boolean onTouchEvent(MotionEvent event) { if (mGestureDetector.onTouchEvent(event)) return true; // 处理手势结束 switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_UP: endGesture(); break; } return super.onTouchEvent(event); } /** * 手势结束 * * @version 1.0 * @createTime 2015年3月5日,上午11:36:43 * @updateTime 2015年3月5日,上午11:36:43 * @createAuthor WangYuWen * @updateAuthor WangYuWen * @updateInfo (此处输入修改内容,若无修改可不写.) * */ private void endGesture() { if (!isVideo && !isVoice && !isBright) { if (right_relative.isShown()) { right_relative.setVisibility(View.GONE); } if (buttom_relative.isShown()) { buttom_relative.setVisibility(View.GONE); } else { buttom_relative.setVisibility(View.VISIBLE); } } isVideo = false; isVoice = false; isBright = false; OldMoveX = 0; OldMoveY = 0; // 隐藏 img_center.setVisibility(View.GONE); img_center_speed.setVisibility(View.GONE); view.setVisibility(View.GONE); } @SuppressLint("HandlerLeak") private Handler handler = new Handler() { public void handleMessage(Message msg) { if (msg.what == handKey) { // setVideo(index_position); adapter.notifyDataSetChanged(); } }; }; /** * 设置Video该播放视频的准备和视频的背景图片 * * @version 1.0 * @createTime 2015年3月12日,下午2:17:55 * @updateTime 2015年3月12日,下午2:17:55 * @createAuthor WangYuWen * @updateAuthor WangYuWen * @updateInfo (此处输入修改内容,若无修改可不写.) * * @param position */ @SuppressWarnings("deprecation") /* private void setVideo(int position) { if (list.size() > position && position>-1) { Drawable drawable = new BitmapDrawable(list.get(position).getVideo_imgbg()); video_VideoView.setVideoPath(list.get(position).getVideo_path()); video_VideoView.requestFocus(); video_img.setVisibility(View.VISIBLE); video_img.setBackgroundDrawable(drawable); } }*/ private Runnable runnable = new Runnable() { @Override public void run() { mVideo_current_length = video_VideoView.getCurrentPosition(); if (mVideo_current_length >= mVideo_total_length) { mVideo_current_length = mVideo_total_length; } /** 设置当前时长 */ txt_current_time.setText(length2time(mVideo_current_length)); /** 设置视频进度 */ LayoutParams layoutParams = (LayoutParams) img_white.getLayoutParams(); layoutParams.width = (int) (((float) img_bg.getWidth()) / mVideo_total_length * mVideo_current_length); img_white.setLayoutParams(layoutParams); handler.postDelayed(runnable, 1000); if (mVideo_current_length >= mVideo_total_length) { handler.removeCallbacks(runnable); } } }; /** * 调节音量 * * @version 1.0 * @createTime 2015年3月5日,上午11:16:35 * @updateTime 2015年3月5日,上午11:16:35 * @createAuthor WangYuWen * @updateAuthor WangYuWen * @updateInfo (此处输入修改内容,若无修改可不写.) * * @param num */ private void setVoiceNum(float num) { evens++;//这里为什么要用个双数执行呢,因为手势滑动的太快音量只有15,控制了下音量增减速度,不然稍微滑动一下就到了最高或者最低这是我们用户不喜欢看到的。 mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); if (mVolume < 0) { mVolume = 0; } if (num < 0 && evens % 2 == 0) { mVolume -= 1; } else if (num > 0 && evens % 2 == 0) { mVolume += 1; } if (mVolume > mMaxVolume) { mVolume = mMaxVolume; } else if (mVolume < 0) { mVolume = 0; } img_center.setImageResource(R.drawable.video_voice_bg); img_center.setVisibility(View.VISIBLE); view.setVisibility(View.VISIBLE); // 变更声音 mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mVolume, 0); // 变更进度条 ViewGroup.LayoutParams lp = img_pres_white.getLayoutParams(); lp.width =DensityUtil.dp2px(VideoPlayActivity.this, 100) * mVolume / mMaxVolume; img_pres_white.setLayoutParams(lp); } /** * 调节视频进度 * * @version 1.0 * @createTime 2015年3月5日,下午4:48:07 * @updateTime 2015年3月5日,下午4:48:07 * @createAuthor WangYuWen * @updateAuthor WangYuWen * @updateInfo (此处输入修改内容,若无修改可不写.) * * @param distanceX */ private void onVideoSpeed(float distanceX) { mVideo_current_length = video_VideoView.getCurrentPosition();// 当前播放长度 if (distanceX > 0) {// 往左滑动 -- img_center_speed.setVisibility(View.VISIBLE); img_center_speed.setImageResource(R.drawable.retreat_video); mVideo_current_length -= 1000;// 快进之后长度 } else if (distanceX < 0) {// 往右滑动 ++ img_center_speed.setVisibility(View.VISIBLE); img_center_speed.setImageResource(R.drawable.speed_video); mVideo_current_length += 1000;// 快进之后长度 } if (mVideo_current_length >= mVideo_total_length) { mVideo_current_length = mVideo_total_length; } else if (mVideo_current_length <= 0) { mVideo_current_length = 0; } video_VideoView.seekTo((int) mVideo_current_length); // //定位播放在哪个位置 handler.postDelayed(runnable, 0); } /** * 将进度长度转变为进度时间 * * @version 1.0 * @createTime 2015年3月5日,下午4:25:05 * @updateTime 2015年3月5日,下午4:25:05 * @createAuthor WangYuWen * @updateAuthor WangYuWen * @updateInfo (此处输入修改内容,若无修改可不写.) * * @param length * @return */ @SuppressLint("DefaultLocale") private String length2time(long length) { length /= 1000L; long minute = length / 60L; long hour = minute / 60L; long second = length % 60L; minute %= 60L; return String.format("%02d:%02d:%02d", hour, minute, second); } /** * 调节亮度 * * @version 1.0 * @createTime 2015年3月5日,上午11:16:44 * @updateTime 2015年3月5日,上午11:16:44 * @createAuthor WangYuWen * @updateAuthor WangYuWen * @updateInfo (此处输入修改内容,若无修改可不写.) * * @param percent */ private void onBrightnessSlide(float percent) { WindowManager.LayoutParams lpa = getWindow().getAttributes(); mBrightness = lpa.screenBrightness; img_center.setImageResource(R.drawable.video_brightness_bg); img_center.setVisibility(View.VISIBLE); view.setVisibility(View.VISIBLE); lpa.screenBrightness = mBrightness + percent; if (lpa.screenBrightness > 1.0f) { lpa.screenBrightness = 1.0f; } else if (lpa.screenBrightness < 0.01f) { lpa.screenBrightness = 0.01f; } getWindow().setAttributes(lpa); // 变更亮度进度条 ViewGroup.LayoutParams lp = img_pres_white.getLayoutParams(); lp.width = (int) (DensityUtil.dp2px(VideoPlayActivity.this, 100) * lpa.screenBrightness); img_pres_white.setLayoutParams(lp); } private class MyGestureListener extends SimpleOnGestureListener { /** 双击 */ @Override public boolean onDoubleTap(MotionEvent e) { return true; } /** 滑动 */ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // e1==按下的点 e2==移动的点 downX = e1.getX(); downY = e1.getY(); moveX = e2.getX(); moveY = e2.getY(); if (OldMoveX == 0) { OldMoveX = downX; OldMoveY = downY; } if (Math.abs(moveY - downY) < Math.abs(moveX - downX) && !isVoice && !isBright && isStart) { handler.removeCallbacks(runnable); onVideoSpeed((OldMoveX - moveX) / width); OldMoveX = moveX; isVideo = true; } else { if (downX > width * 4 / 5 && !isVideo && !isBright) {// 右边滑动 setVoiceNum((OldMoveY - moveY) / height); OldMoveY = moveY; isVoice = true; } else if (downX < width / 5 && !isVideo && !isVoice) {// 左边滑动 onBrightnessSlide((OldMoveY - moveY) / height); OldMoveY = moveY; isBright = true; } } return super.onScroll(e1, e2, distanceX, distanceY); } } }