视频播放器手势操作控制进度、音量、亮度

这里写图片描述

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;
}
就这么华丽丽的完成了,还是得多学着点


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值