http://blog.csdn.net/zanelove/article/details/46759321不够完整,今在此把完整的贴出来以备后用
直接上代码,先是布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:id="@+id/gesture_volume_layout" android:layout_width="150dip" android:layout_height="100dip" android:layout_centerInParent="true" android:background="@drawable/player_gesture_bg" android:gravity="center" android:visibility="gone" > <ImageView android:id="@+id/gesture_iv_player_volume" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:src="@drawable/player_volume" /> <TextView android:id="@+id/geture_tv_volume_percentage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/gesture_iv_player_volume" android:layout_centerHorizontal="true" android:gravity="right" android:text="80%" android:textColor="#ffececec" /> </RelativeLayout> <RelativeLayout android:id="@+id/gesture_bright_layout" android:layout_width="150dip" android:layout_height="100dip" android:layout_centerInParent="true" android:background="@drawable/player_gesture_bg" android:gravity="center" android:visibility="gone" > <ImageView android:id="@+id/gesture_iv_player_bright" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:src="@drawable/player_bright" /> <TextView android:id="@+id/geture_tv_bright_percentage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/gesture_iv_player_bright" android:layout_centerHorizontal="true" android:gravity="right" android:text="80%" android:textColor="#ffececec" /> </RelativeLayout> <RelativeLayout android:id="@+id/gesture_progress_layout" android:layout_width="150dip" android:layout_height="100dip" android:layout_centerInParent="true" android:background="@drawable/player_gesture_bg" android:gravity="center" android:visibility="gone"> <ImageView android:id="@+id/gesture_iv_progress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:src="@drawable/player_backward" /> <TextView android:id="@+id/geture_tv_progress_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/gesture_iv_progress" android:layout_centerHorizontal="true" android:gravity="right" android:text="00:00:35/00:24:89" android:textColor="#ffececec" /> </RelativeLayout>实现GestureDetector.OnGestureListener,View.OnTouchListener接口
初始化
private View v_gesture; private GestureDetector gestureDetector; private View gesture_volume_layout; private ImageView ivGestureVolume; private TextView tvGestureVolumePerc; private View gesture_bright_layout; private ImageView ivGestureBright; private TextView tvGestureBrightPerc; private View gesture_progress_layout; private ImageView ivGestureProgress; private TextView tvGestureProgressTime; private int mGestureMotion = 0; // 1调节进度, 2调节音量, 3调节亮度 private static final int GESTURE_MOTION_PROGRESS = 1; private static final int GESTURE_MOTION_VOLUME = 2; private static final int GESTURE_MOTION_BRIGHT = 3; private int GESTURE_PROGRESS_STEP = 3;// 设定进度滑动时的步长,避免每次滑动都改变,导致改变过快 单位s private int GESTURE_BRIGHTNESS_STEP = 2; private boolean ensureGestureMotion = false;// 每次触摸屏幕后,第一次scroll的标志 private AudioManager audiomanager; private int mGestureProgress = 0; //s private int playerWidth, playerHeight; private int maxVolume, currentVolume; private float mBrightness = -1f; // 亮度
v_gesture = findViewById(R.id.v_gesturetip); gesture_volume_layout = findViewById(R.id.gesture_volume_layout); ivGestureVolume = (ImageView) findViewById(R.id.gesture_iv_player_volume); tvGestureVolumePerc = (TextView) findViewById(R.id.geture_tv_volume_percentage); gesture_bright_layout = findViewById(R.id.gesture_bright_layout); ivGestureBright = (ImageView) findViewById(R.id.gesture_iv_player_bright); tvGestureBrightPerc = (TextView) findViewById(R.id.geture_tv_bright_percentage); gesture_progress_layout = findViewById(R.id.gesture_progress_layout); ivGestureProgress = (ImageView) findViewById(R.id.gesture_iv_progress); tvGestureProgressTime = (TextView) findViewById(R.id.geture_tv_progress_time); audiomanager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); maxVolume = audiomanager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); // 获取系统最大音量 currentVolume = audiomanager.getStreamVolume(AudioManager.STREAM_MUSIC); // 获取当前值 /** 获取视频播放窗口的尺寸 */ ViewTreeObserver viewObserver = playBarView.getViewTreeObserver(); viewObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { playBarView.getViewTreeObserver().removeGlobalOnLayoutListener(this); playerWidth = playBarView.getWidth(); playerHeight = playBarView.getHeight(); } });playBarView.setLongClickable(true); playBarView.setOnTouchListener(this);
gestureDetector = new GestureDetector(PlayActivity.this, this);
gestureDetector.setIsLongpressEnabled(true);然后就是类的方法里写代码了
@Override public boolean onTouch(View v, MotionEvent event) { // 手势里除了singleTapUp,没有其他检测up的方法 if (event.getAction() == MotionEvent.ACTION_UP) { if (mGestureMotion == GESTURE_MOTION_PROGRESS) { mListener.onSeek(mGestureProgress * 1000); } mGestureMotion = 0;// 手指离开屏幕后,重置调节音量或进度的标志 gesture_volume_layout.setVisibility(View.GONE); gesture_bright_layout.setVisibility(View.GONE); gesture_progress_layout.setVisibility(View.GONE); } return gestureDetector.onTouchEvent(event); } @Override public boolean onDown(MotionEvent motionEvent) { Log.i("mylog", "onDown"); ensureGestureMotion = true;// 设定是触摸屏幕后第一次scroll的标志 return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { float mOldX = e1.getX(), mOldY = e1.getY(); int y = (int) e2.getRawY(); if (ensureGestureMotion) {// 以触摸屏幕后第一次滑动为标准,避免在屏幕上操作切换混乱 // 横向的距离变化大则调整进度,纵向的变化大则调整音量 if (Math.abs(distanceX) >= Math.abs(distanceY)) { gesture_progress_layout.setVisibility(View.VISIBLE); gesture_volume_layout.setVisibility(View.GONE); gesture_bright_layout.setVisibility(View.GONE); mGestureMotion = GESTURE_MOTION_PROGRESS; mGestureProgress = (int) mPosition / 1000; } else { if (mOldX > playerWidth * 3.0 / 5) {// 音量 gesture_volume_layout.setVisibility(View.VISIBLE); gesture_bright_layout.setVisibility(View.GONE); gesture_progress_layout.setVisibility(View.GONE); mGestureMotion = GESTURE_MOTION_VOLUME; } else if (mOldX < playerWidth * 2.0 / 5) {// 亮度 gesture_bright_layout.setVisibility(View.VISIBLE); gesture_volume_layout.setVisibility(View.GONE); gesture_progress_layout.setVisibility(View.GONE); mGestureMotion = GESTURE_MOTION_BRIGHT; try { int system_brightness_mode = Settings.System.getInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE); if (system_brightness_mode != Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL) Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); } catch (Settings.SettingNotFoundException e) { e.printStackTrace(); } } } } // 如果每次触摸屏幕后第一次scroll是调节进度,那之后的scroll事件都处理音量进度,直到离开屏幕执行下一次操作 if (mGestureMotion == GESTURE_MOTION_PROGRESS) { // distanceX=lastScrollPositionX-currentScrollPositionX,因此为正时是快进 if (Math.abs(distanceX) > Math.abs(distanceY)) {// 横向移动大于纵向移动 long duration = mDuration; if (distanceX >= 1) {// 快退,用步长控制改变速度,可微调 ivGestureProgress.setImageResource(R.drawable.player_backward); if (mGestureProgress > GESTURE_PROGRESS_STEP) {// 避免为负 mGestureProgress -= GESTURE_PROGRESS_STEP;// scroll方法执行一次快退3秒 } else { mGestureProgress = 0; } } else if (distanceX <= -1) {// 快进 ivGestureProgress.setImageResource(R.drawable.player_forward); if (mGestureProgress < duration / 1000 - GESTURE_PROGRESS_STEP) {// 避免超过总时长 mGestureProgress += GESTURE_PROGRESS_STEP;// scroll执行一次快进3秒 } else { mGestureProgress = (int) (duration / 1000 - 10); } } if (mGestureProgress < 0) { mGestureProgress = 0; } String progress = PlayerTimeFormater.getFormatedTimeFromMillisecond(mGestureProgress * 1000) + "/" + PlayerTimeFormater.getFormatedTimeFromMillisecond(duration); tvGestureProgressTime.setText(progress); } } // 如果每次触摸屏幕后第一次scroll是调节音量,那之后的scroll事件都处理音量调节,直到离开屏幕执行下一次操作 else if (mGestureMotion == GESTURE_MOTION_VOLUME) { currentVolume = audiomanager.getStreamVolume(AudioManager.STREAM_MUSIC); // 获取当前值 if (Math.abs(distanceY) > Math.abs(distanceX)) {// 纵向移动大于横向移动 if (distanceY >= 1) {// 音量调大,注意横屏时的坐标体系,尽管左上角是原点,但横向向上滑动时distanceY为正 if (currentVolume < maxVolume) {// 为避免调节过快,distanceY应大于一个设定值 currentVolume++; } ivGestureVolume.setImageResource(R.drawable.player_volume); } else if (distanceY <= -1) {// 音量调小 if (currentVolume > 0) { currentVolume--; if (currentVolume == 0) {// 静音,设定静音独有的图片 ivGestureVolume.setImageResource(R.drawable.player_silence); } } } int percentage = (currentVolume * 100) / maxVolume; tvGestureVolumePerc.setText(percentage + "%"); audiomanager.setStreamVolume(AudioManager.STREAM_MUSIC,currentVolume, 0); } } // 如果每次触摸屏幕后第一次scroll是调节亮度,那之后的scroll事件都处理亮度调节,直到离开屏幕执行下一次操作 else if (mGestureMotion == GESTURE_MOTION_BRIGHT) { ivGestureBright.setImageResource(R.drawable.player_bright); try { int brightness = Settings.System.getInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS); if (brightness > 100) brightness = 100; if (brightness < 50) GESTURE_BRIGHTNESS_STEP = 5; else if (brightness < 100) GESTURE_BRIGHTNESS_STEP = 5; if (distanceY >= 1) { brightness = brightness + GESTURE_BRIGHTNESS_STEP; } else if (distanceY <= -1) { brightness = brightness - GESTURE_BRIGHTNESS_STEP; } if (brightness < 0) brightness = 0; if (brightness > 99) brightness = 255; Log.i("mylog", "brightness " + brightness); Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightness); int percent = brightness == 255 ? 100 : brightness; tvGestureBrightPerc.setText(percent + "%"); } catch (Settings.SettingNotFoundException e) { e.printStackTrace(); } } ensureGestureMotion = false;// 第一次scroll执行完成,修改标志 return false; } @Override public void onShowPress(MotionEvent motionEvent) { }就这么华丽丽的完成了,还是得多学着点@Override public boolean onSingleTapUp(MotionEvent motionEvent) { Log.i("mylog", "onSingleTapUp"); if (getVisibility()) dismiss(); else show(); return false; } @Override public void onLongPress(MotionEvent motionEvent) { } @Override public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) { return false; }