手势控制音量、亮度

本文介绍了一个基于手势控制的应用开发案例,通过实现触摸屏上的不同手势来调整设备的屏幕亮度和音量。文章详细展示了如何使用Android平台提供的API来监听和响应用户的触摸事件,并通过手势识别实现了对设备功能的直观控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



/**
 * Created by hghl on 2017/8/23.
 */

public class GestureActivity extends Activity implements OnTouchListener {
    private Button mButton = null;
    private int systemBrightness;
    private AudioManager audioManager = null;
    GestureDetector mGesture = null;

    private boolean moveLight = false;
    private float lightChange = 0f;

    private boolean moveVoice = false;
    private float voiceChange = 0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        audioManager =(AudioManager) getSystemService(Service.AUDIO_SERVICE);

        mButton = (Button)findViewById(R.id.button1);
        mButton.setOnTouchListener(this);
        try {
            systemBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
            lightChange = systemBrightness;
        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        if (mGesture == null) {
            mGesture = new GestureDetector(this, new GestureListener());
        }
        if (event.getAction() == MotionEvent.ACTION_UP) {
            voiceChange = 0;
        }
        return mGesture.onTouchEvent(event);
    }

//    private int verticalMinDistance = 20;
//    private int minVelocity = 0;
    class GestureListener extends SimpleOnGestureListener {

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            // TODO Auto-generated method stub
            Log.i("TEST===========", "onDoubleTap");
            return super.onDoubleTap(e);
        }

        @Override
        public boolean onDown(MotionEvent e) {
            int viewWidth4 =  Math.round(mButton.getWidth() / 3.0f);
            moveLight = false;
            moveVoice = false;
            if (viewWidth4 > e.getX()) {        //调节亮度
                moveLight = true;
            } else if ((viewWidth4 * 2) < e.getX()) {       //调节音量
                moveVoice = true;
            }
            // TODO Auto-generated method stub
            Log.i("TEST===========", "onDown");
            return super.onDown(e);
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            // TODO Auto-generated method stub
//            if (e1.getX() - e2.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) {
//                Toast.makeText(GestureActivity.this, "向左手势", Toast.LENGTH_SHORT).show();
//            } else if (e2.getX() - e1.getX() > verticalMinDistance && Math.abs(velocityX) > minVelocity) {
//                Toast.makeText(GestureActivity.this, "向右手势", Toast.LENGTH_SHORT).show();
//            }
            return super.onFling(e1, e2, velocityX, velocityY);
        }

        @Override
        public void onLongPress(MotionEvent e) {
            // TODO Auto-generated method stub
            Log.i("TEST===========", "onLongPress");
            super.onLongPress(e);
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                float distanceX, float distanceY) {
            // TODO Auto-generated method stub
            Log.i("TEST===========", "onScroll:distanceX = " + distanceX + " distanceY = " + distanceY);

            if(moveLight) {
                changeLight(distanceY);
            }
            if (moveVoice) {
                changeVoice((Math.round(distanceY)));
            }

            return super.onScroll(e1, e2, distanceX, distanceY);
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            // TODO Auto-generated method stub
            Log.i("TEST===========", "onSingleTapUp");
            return super.onSingleTapUp(e);
        }

        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.i("TEST===========", "onDoubleTapEvent");
            return super.onDoubleTapEvent(e);
        }
    }

    private void changeVoice(int distanceY){
        voiceChange = voiceChange + distanceY;
        float baseNumber = mButton.getHeight() / 24.0f;
        if (voiceChange >= baseNumber) {
            voiceChange = 0;
            audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_SHOW_UI);
        } else if ((0 - voiceChange) >= baseNumber) {
            voiceChange = 0;
            audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_SHOW_UI);
        }
    }

    private void changeLight(float distanceY){
        int height = mButton.getHeight();
        lightChange = lightChange +  distanceY / height * 255f;
        if (lightChange > 255) {
            lightChange = 255f;
        } else if (lightChange < 0) {
            lightChange = 0;
        }
        if(moveLight) {
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.screenBrightness = Float.valueOf(lightChange) * (1f / 255f);
            getWindow().setAttributes(lp);
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值