一.背景
做视频用到了就记录下,从github(https://github.com/curtis2/SuperVideoPlayer 谢谢)上扒了一个项目的手势调亮度和音量(但是有bug!!!就是调节音量感觉会突然消失),本文重点是如何调节音量
二.代码
package com.example.administrator.gesturetext;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.Display;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity {
private FrameLayout mVolumeBrightnessLayout;
private ImageView mOperationBg;
private ImageView mOperationPercent;
private GestureDetector mGestureDetector;
private AudioManager mAudioManager;
private int mMaxVolume;
private int mVolume = -1;
private float mBrightness = -1f;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout rlContentContainer = (RelativeLayout) findViewById(R.id.rl_content_container);
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mVolumeBrightnessLayout = (FrameLayout) findViewById(R.id.operation_volume_brightness);
mOperationBg = (ImageView) findViewById(R.id.operation_bg);
mOperationPercent = (ImageView) findViewById(R.id.operation_percent);
mGestureDetector = new GestureDetector(MainActivity.this, new VolumeBrightnesGestureListener());
rlContentContainer.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (mGestureDetector.onTouchEvent(motionEvent)) {
return true;
}
switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
endGesture();
break;
}
return true;
}
});
}
private Handler mDismissHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
mVolumeBrightnessLayout.setVisibility(View.GONE);
}
}
};
private void endGesture() {
mVolume = -1;
mBrightness = -1f;
// 隐藏
mDismissHandler.removeMessages(0);
mDismissHandler.sendEmptyMessageDelayed(0, 500);
}
private class VolumeBrightnesGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
float mOldX = e1.getX(), mOldY = e1.getY();
int y = (int) e2.getRawY();
Display disp = getWindowManager().getDefaultDisplay();
int windowWidth = disp.getWidth();
int windowHeight = disp.getHeight();
//1440 2392
if (mOldX > windowWidth * 3.0 / 5) {
onVolumeSlide((mOldY - y) / windowHeight);
return true;
} else if (mOldX < windowWidth *2.0/ 5.0) {
onBrightnessSlide((mOldY - y) / windowHeight);
return true;
}
return false;
}
}
/**
* 声音高低
*
* @param percent
*/
private void onVolumeSlide(float percent) {
if (mVolume == -1) {
mVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
if (mVolume < 0)
mVolume = 0;
mOperationBg.setImageResource(R.drawable.video_volumn_bg);
mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
}
int index = (int) (percent * mMaxVolume) + mVolume;
if (index > mMaxVolume)
index = mMaxVolume;
else if (index < 0)
index = 0;
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0);
ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
lp.width = findViewById(R.id.operation_full).getLayoutParams().width * index / mMaxVolume;
mOperationPercent.setLayoutParams(lp);
}
/**
* 处理屏幕亮暗
*
* @param percent
*/
private void onBrightnessSlide(float percent) {
if (mBrightness < 0) {
mBrightness = getWindow().getAttributes().screenBrightness;
if (mBrightness <= 0.00f)
mBrightness = 0.50f;
if (mBrightness < 0.01f)
mBrightness = 0.01f;
mOperationBg.setImageResource(R.drawable.video_brightness_bg);
mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
}
WindowManager.LayoutParams lpa = getWindow().getAttributes();
lpa.screenBrightness = mBrightness + percent;
if (lpa.screenBrightness > 1.0f)
lpa.screenBrightness = 1.0f;
else if (lpa.screenBrightness < 0.01f)
lpa.screenBrightness = 0.01f;
getWindow().setAttributes(lpa);
ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams();
lp.width = (int) (findViewById(R.id.operation_full).getLayoutParams().width * lpa.screenBrightness);
mOperationPercent.setLayoutParams(lp);
}
}
三.代码分析
(1)屏幕亮暗度
WindowManager.LayoutParams lpa = getWindow().getAttributes(); lpa.screenBrightness = mBrightness + percent; if (lpa.screenBrightness > 1.0f) lpa.screenBrightness = 1.0f; else if (lpa.screenBrightness < 0.01f) lpa.screenBrightness = 0.01f; getWindow().setAttributes(lpa);注意!!!: 如果要跟系统同步 需要写WRITTING_SETTING权限, Android6.0及以上需要写个intent手动设置,在清单文件中写没用的(这个太傻比了,估计没人会要这么做)
(2)音量
我们这里只设置了媒体音乐
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE)
mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0);
音量分很多种
public static final int STREAM_ALARM = 4; public static final int STREAM_DTMF = 8; public static final int STREAM_MUSIC = 3; public static final int STREAM_NOTIFICATION = 5; public static final int STREAM_RING = 2; public static final int STREAM_SYSTEM = 1
可以看出有很多种,套路都是一样的
代码链接待添加