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

原创 2016年08月31日 13:34:23

这里写图片描述

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


版权声明:版权所有,请勿侵权 举报

相关文章推荐

Android-视频播放实例之手势控制音乐、亮度

Android-视频播放实例之手势控制音乐、亮度手势控制视频播放是现在视频播放软件的主要控制手段之一,本文主要讲解下如何实现在android平台下如何实现通过手势控制。 一、GestureDetect...

H5视频播放,左右滑手势控制播放进度。

水平有限,这篇文章中对H5视频播放做了简单的搭建。因产品经理要求,加入了手势控制,左滑后退播放10秒,右滑快进10秒。因为上下滑动可能会影响页面的滑动,如果用到iscroll或者batterscorl...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

【基于QMediaPlayer的简易视频播放器】— 3、结合QSlider实现播放进度控制和音量控制

对于播放器来说,其进度条应该有两种控制方式,一是拖动,二是点击。 其中我们需要用到sliderMoved()和sliderReleased()两种信号来实现拖动功能, 对于点击,QSlider的mo...

Android之视频播放以及亮度音量变换

程序实现功能: 播放视频,右侧上下滑动改变亮度,左侧上下滑动改变音量。 现在我们来记住几句重要的属性 清单文件,强制横屏 android:screenOrientation=”lan...

[IOS]对视频、音频播放器添加缓冲进度条

[IOS]对视频、音频播放器添加缓冲进度条

[IOS]对视频、音频播放器添加缓冲进度条

[IOS]对视频、音频播放器添加缓冲进度条 Demo地址:http://download.csdn.net/detail/u012881779/8854967 思路说起来很简单: 先拖一个Pro...

mciWnd播放视频音频的操作。

MCIWndCreate函数在什么时候用呢?比如说我们远程视频开发中 接收到对方传来的压缩(compressor)后的  视频数据 我们解压缩(decompressor)之后可以使用 这个函数来创建...

使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放

前言   本章继续完善播放相关播放器的核心功能,为后续扩展打好基础。   声明   欢迎转载,但请保留文章原始出处:)      博客园:http://www.cnblogs.com   ...

使用Vitamio打造自己的Android万能播放器—— 手势控制亮度、音量、缩放

一、实现目标  1.1 亮度控制 模仿VPlayer界面: 1.2 声音控制  模仿VPlayer界面:     1.3 画面缩放  根据下面API提供画面的拉伸、剪切、100%、全屏   ...

视频播放器进度条的制作

视频播放器进度条的制作----使用duilib
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)