最近在做一个视频播放器
现在市场上,一个比较完善的视频播放器
大概具有以下功能:
快进、快退、声音、亮度控制
这一次就根据这几个基础的功能
通过系统的手势控制类GestureDetector来完成
做了一个实用的工具类
只需要简单的配置
就可以实现对视频播放器控件的手势进行监听
工具类内部实现了相关功能,不需要视频播放器自己写
实现了代码解耦,也方便复用
下面就开始介绍这个工具类的使用,以及实现的原理。
先把工具类的实际代码贴上来
public class VideoGestureControlUtil {
private static final String TAG = "VideoGestureControlUtil";
private Context mContext;
private GestureDetector mGestureDetector;//手势类
private MyGestureListener myGestureListener;//手势监听
private OnVideoControlListener videoControlListener;//视频View回调监听
private Rect VideoViewRect = null;//视频控件范围
//状态相关
private static int SCROLL_FLAG = 0;//记录状态
private static final int SCROLL_FLAG_RESET = 0;//初始状态,无任何操作
private static final int SCROLL_FLAG_TOPBOTTOM_LEFT = 1;//左边屏幕上下滑动
private static final int SCROLL_FLAG_TOPBOTTOM_RIGHT = 2;//右边屏幕上下滑动
private static final int SCROLL_FLAG_LEFTRIGHT = 3;//左右滑动
//拖动相关
protected static final float FLIP_DISTANCE = 50;//确定滑动方向的最小滑动距离
private int SCROLL_VIDEO_SCROLL_RANGE = 1000;//拖动范围 0~1000
private float SCROLL_VIDEO_PLAY_RANGE = 0.25f;//视频可拖动部分的范围
//视频进度相关
private float SCROLL_VIDEO_PLAY_INDEX = 0f;//拖动的视频进度
private double videoIndex = 0;//拖动的视频毫秒数
private double newVideoIndex;//拖动结束后视频的位置,单位毫秒
private double SCROLL_VIDEO_PLAYING_INDEX = 0;//视频播放位置
private double SCROLL_VIDEO_PLAYING_INDEX_CATCH = 0;//缓存的视频播放位置(手指按下去的视频播放位置)
private double SCROLL_VIDEO_LENTH = 0;//视频总长度 单位毫秒
//声音和亮度相关
private AudioManager systemService;
private int SCROLL_VIDEO_VOICE_INDEX = 0;//拖动的视频声音
private double SCROLL_VIDEO_LIGHT_INDEX = 0;//拖动的视频亮度
private int SCROLL_VOICE_MAX = 0;//声音总长度
private int SCROLL_LIGHT_MAX = 255;//亮度总长度
private int SCREEN_LIGHT = 0;//屏幕亮度
private int SCREEN_LIGHT_CATCH = 0;//缓存的屏幕亮度
private int SCREEN_VOICE = 0;//音量大小
//弹框部分
private Dialog indexDialog;//弹框
private View videoDialogView;//弹框View
private ImageView indeximg;
private LinearLayout indexll, voicell;
private TextView indextv;
private ImageView voiceLightImg;
private SeekBar voiceLightsb;
private WindowManager.LayoutParams indexDialogLp;
private DisplayMetrics displayMetrics;
public VideoGestureControlUtil(Context context, View view) {
myGestureListener = new MyGestureListener();
this.mContext = context;
systemService = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
SCROLL_VOICE_MAX = systemService.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mGestureDetector = new GestureDetector(context, myGestureListener);
mGestureDetector.setOnDoubleTapListener(myGestureListener);
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
videoDialogView = layoutInflater.inflate(R.layout.video_gesture_dialog, null);
indexll = videoDialogView.findViewById(R.id.indexll);
voicell = videoDialogView.findViewById(R.id.voicell);
indeximg = videoDialogView.findViewById(R.id.indeximg);
indextv = videoDialogView.findViewById(R.id.indextv);
voiceLightImg = videoDialogView.findViewById(R.id.voice_light_img);
voiceLightsb = videoDialogView.findViewById(R.id.voice_light_sb);
indexDialog = new Dialog(context);
/*随意定义个Dialog*/
Window dialogWindow = indexDialog.getWindow();
/*实例化Window*/
indexDialogLp = dialogWindow.getAttributes();
/*实例化Window操作者*/
indexDialogLp.x = 0; // 新位置X坐标
indexDialogLp.y = 0; // 新位置Y坐标
dialogWindow.setGravity(Gravity.CENTER);
dialogWindow.getDecorView().setBackground(null);
dialogWindow.setAttributes(indexDialogLp);
/*放置属性*/
indexDialog.setContentView(videoDialogView, new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
dialogWindow.setDimAmount(0);
dialogWindow.setBackgroundDrawableResource(android.R.color.transparent);
try {
int dividerID = indexDialog.getContext().getResources().getIdentifier("android:id/titleDivider", null, null);
View divider = indexDialog.findViewById(dividerID);
if (divider != null) {
divider.setBackgroundColor(Color.TRANSPARENT);
}
} catch (Exception e) {
//上面的代码,是用来去除Holo主题的蓝色线条
e.printStackTrace();
}
indexDialog.setCanceledOnTouchOutside(false);
}
public boolean touch(MotionEvent event) {
boo

最低0.47元/天 解锁文章
4730





