不够完整,今在此把完整的贴出来以备后用
直接上代码,先是布局文件
<?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;
}
就这么华丽丽的完成了,还是得多学着点