上下滑动屏幕实现屏幕亮度和系统声音的调节,通过手势实现这一功能,需求做成组合控件,其他人只需在xml中引用即可
package com.inlee.demo.view;
import com.inlee.demo.R;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.Display;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
public class VolumeBright extends RelativeLayout {
private Context mContext;
private WindowManager mWindowManager;
private Window mWindow;
private Activity mActivity;
private WindowManager.LayoutParams lp ;
private TextView mTxTv ;
private ImageView mImgBtn;
private LayoutInflater mLayoutInflater;
private View mView ;
private GestureDetector mGestureDetector;
private AudioManager mAudioManager;
private VerticalSeekBar mSeekBar;
// private Animation mAlphaAnimation ,mScaleAnimation;
// private AnimationSet animationSet;
private int mBrightChanged , mVolumeChanged , mDisplayWidth;
private boolean misVolume = true;
private static final int MAX_VALUE = 255;
private static final int PRECENT = 100;
private static final int CHANGE_RATE = 4;
private static final int BOUNDARY_VALUE = 10;
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
//hideAnimation();
mView.setVisibility(View.GONE);
}
};
public VolumeBright(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public VolumeBright(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public VolumeBright(Context context) {
super(context);
init(context);
}
@SuppressWarnings("deprecation")
public void init(Context context){
mContext = context;
mLayoutInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = mLayoutInflater.inflate(R.layout.volumelight, this);
mSeekBar = (VerticalSeekBar)findViewById(R.id.volumebright);
mSeekBar.setMax(100);
mSeekBar.setClickable(false);
mSeekBar.setFocusable(false);
mImgBtn = (ImageView)mView.findViewById(R.id.vl_img);
mTxTv = (TextView)mView.findViewById(R.id.vl_text);
mGestureDetector = new GestureDetector(new DefaultGestureDetector());
mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
//设置动画时间 alphaAnimation.setDuration(3000);
mVolumeChanged = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC)*17;
mBrightChanged = 80 ;
//mSeekBar.setProgress(mVolumeChanged);
}
// private class seekBarChangeListener implements OnSeekBarChangeListener{
//
// @Override
// public void onProgressChanged(SeekBar seekBar, int progress,
// boolean fromUser) {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// public void onStartTrackingTouch(SeekBar seekBar) {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// public void onStopTrackingTouch(SeekBar seekBar) {
// // TODO Auto-generated method stub
//
// }
//
// }
// private void hideAnimation(){
//
// mAlphaAnimation=new AlphaAnimation(1.0f,0.5f);
//
// mAlphaAnimation.setDuration(800);//设置时间持续时间为 1000毫秒
// animationSet=new AnimationSet(true);
// animationSet.addAnimation(mAlphaAnimation);//透明度
//
//
// mView.startAnimation(animationSet);//开始播放
//
// }
/**
* isVolume 为真对音量进行调节,否则调节屏幕亮度
*
**/
public class DefaultGestureDetector extends SimpleOnGestureListener{
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
if(e1 == null || e2 == null){
return false ;
}
float last_y = e1.getY(), current_y = e2.getY();
if(misVolume){
if (last_y - current_y > BOUNDARY_VALUE) {
mVolumeChanged += CHANGE_RATE;
if(mVolumeChanged >= MAX_VALUE){
mVolumeChanged = MAX_VALUE;
}
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mVolumeChanged/17, AudioManager.FLAG_PLAY_SOUND);
mHandler.post(run);
return true;
} else if (last_y - current_y < -BOUNDARY_VALUE) {
mVolumeChanged -= CHANGE_RATE;
if(mVolumeChanged <= 0){
mVolumeChanged = 0;
}
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mVolumeChanged/17, AudioManager.FLAG_PLAY_SOUND);
mHandler.post(run);
return true;
}
}else{
if (last_y - current_y > BOUNDARY_VALUE) {
mBrightChanged += CHANGE_RATE;
if(mBrightChanged>=MAX_VALUE){
mBrightChanged = MAX_VALUE;
}
mHandler.post(run);
return true;
} else if (last_y - current_y < -BOUNDARY_VALUE) {
mBrightChanged -= CHANGE_RATE;
if(mBrightChanged<=0){
mBrightChanged = 0;
}
mHandler.post(run);
return true;
}
}
return false;
}
}
public GestureDetector getGestureDetector(){
return mGestureDetector;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return mGestureDetector.onTouchEvent(event);
}
private Runnable run = new Runnable() {
@Override
public void run() {
if(misVolume){
mTxTv.setText(mVolumeChanged*PRECENT/MAX_VALUE + " %");
mSeekBar.setProgress(mVolumeChanged*PRECENT/MAX_VALUE);
}else{
setBrightness(mBrightChanged);
}
}
};
/**
* 设置当前窗口亮度
*
**/
private void setBrightness(int value)
{
try {
lp.screenBrightness = (float)(value<=0?1:value) /MAX_VALUE;
mWindow.setAttributes(lp);
mTxTv.setText(mBrightChanged*PRECENT/MAX_VALUE + " %");
mSeekBar.setProgress(mBrightChanged*PRECENT/MAX_VALUE);
} catch (Exception e) {
Toast.makeText(mActivity,"无法改变亮度",Toast.LENGTH_SHORT).show();
}
}
private void isTheVolume(boolean isVolume){
this.misVolume = isVolume ;
if(misVolume){
mTxTv.setText(mVolumeChanged*PRECENT/MAX_VALUE + " %");
mSeekBar.setProgress(mVolumeChanged*PRECENT/MAX_VALUE);
mImgBtn.setImageResource(R.drawable.player_pop_volume);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mVolumeChanged/17, AudioManager.FLAG_PLAY_SOUND);
}else{
mTxTv.setText(mBrightChanged*PRECENT/MAX_VALUE + " %");
mSeekBar.setProgress(mBrightChanged*PRECENT/MAX_VALUE);
mImgBtn.setImageResource(R.drawable.player_pop_bright);
setBrightness(mBrightChanged);
}
}
/**
* 外部接口,首先初始化音量和亮度调节需要的系统控制对象
* 调节完成后设置提示UI的可见性
* **/
@SuppressWarnings("deprecation")
public void initVolumeAndBright(Activity act){
this.mActivity = act;
this.mWindowManager = mActivity.getWindowManager();
this.mWindow = mActivity.getWindow();
lp = mWindow.getAttributes();
Display display=mWindowManager.getDefaultDisplay();
mDisplayWidth = display.getWidth()/2;
}
public void setViewVisiable(int posx){
if(posx<mDisplayWidth){
isTheVolume(true);
}else{
isTheVolume(false);
}
mView.setVisibility(View.VISIBLE);
}
public void setViewGone(){
mHandler.sendEmptyMessageDelayed(0, 2000);
}
}
volumelight.xml
<?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"
android:background="@drawable/sdbt_mm"
android:orientation="horizontal" >
<com.inlee.demo.view.VerticalSeekBar
android:layout_width="wrap_content"
android:layout_height="200dp"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:id="@+id/volumebright"
android:thumb="@null"
android:padding="10dp"
android:background="@drawable/seekbar_bkg"
android:progressDrawable="@drawable/seekbar_styles"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="#242424"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp" >
<ImageView
android:id="@+id/vl_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/player_pop_volume" />
<TextView
android:id="@+id/vl_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="15%"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
</RelativeLayout>