自定义滑动音量

37 篇文章 0 订阅

最近由于项目需求,自己写了个音量滑动View。其实滑动可以应用的范围还有很多,故此做以笔记,以便以后翻阅。

  1. 首先建立一个自定义View slip继承View 
  2. 在构造方法里完成了对图片的获取以及一些初始化。
  3. 重写onDraw()方法具体可看源码。
  4. 重写onMeasure()这个方法比较重要!在源码里解释。
  5. 重写onTouchEvent();//在这个方法里完成滑动功能 
  6. 写监听滑动接口代码如下
  7. 
    //监听slip滑动事件。
    public interface OnslipListener {
        public void Onslip( );
    }
    

     

     8.在活动里写滑动事件

 slip=(slip)findViewById(R.id.slip_volume);
        slip.setOnslipListener(new OnslipListener() {
            @Override
            public void Onslip() {
                AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
                //最大音量
                int maxVolume = mAudioManager.getStreamMaxVolume( STREAM_SYSTEM);
                //当前音量
                int currentVolume = mAudioManager.getStreamVolume( STREAM_SYSTEM);

                mAudioManager.setStreamVolume(STREAM_MUSIC,(int)(maxVolume*(slip.getProgress())),FLAG_SHOW_UI );
            }
        });

其中用到一些方法都在slip里可以查看

public class slip extends View{
    OnslipListener onslipListener;//滑动监听接口
    Bitmap v1;//音量喇叭
    Bitmap v2;//浮球
    Bitmap v3;//滑动条
    float maxWidth;//滑动最大坐标
    float sum;//V3坐标
    float lastCur;//上次坐标
    public int range;//滑动条长度
    public float  getProgress(){
        return (sum-(v1.getWidth()+5))/range;
    }

    public void setOnslipListener(OnslipListener onslipListener){
        this.onslipListener=onslipListener;
    }

    public slip(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        v1= BitmapFactory.decodeResource(getResources(), R.drawable.music_volume);
        v2=BitmapFactory.decodeResource(getResources(), R.drawable.music_range);
        v3=BitmapFactory.decodeResource(getResources(),R.drawable.volume_float);
        range=v2.getWidth();
        maxWidth=v1.getWidth()+5+v2.getWidth()-v3.getWidth();
        sum=v1.getWidth()+5;
    }
    @Override
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);
        Paint paint=new Paint();//画笔
        paint.setColor(Color.BLUE);//设置画笔颜色
        canvas.drawBitmap(v1,0,0,paint);//画图片中间两个参数是坐标以屏幕左上角为原点
        canvas.drawBitmap(v2,v1.getWidth()+5,0,paint);
        Log.d("sum",sum+"");
        canvas.drawBitmap(v3,sum,0,paint);
        Log.d("wer","2313123");
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        //MeasureSpec.getMode可以获取宽或高的布局模式
        //MeasureSpec.getSize可以获取宽或高的布局中指定的尺寸。
        int wSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int wSpecSize = MeasureSpec.getSize(widthMeasureSpec);

        int hSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        int hSpecSize = MeasureSpec.getSize(heightMeasureSpec);

        //MeasureSpec.EXACTLY 表示布局的模式是具体尺寸,相当于在布局中指定了具体的dp值或者match_parent
        //MeasureSpec.AT_MOST 表示布局模式是wrap_content,这时候需要你自己来指定控件的宽和高,否则就
        //填充父母了。
        if(wSpecMode == MeasureSpec.AT_MOST) {
            wSpecSize = v1.getWidth()+5+v2.getWidth();
            //设置view宽和高
            setMeasuredDimension(wSpecSize,hSpecSize);
        }
        if(hSpecMode == MeasureSpec.AT_MOST) {
            hSpecSize = v1.getHeight();
            //设置view宽和高
            setMeasuredDimension(wSpecSize,hSpecSize);
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN:
                lastCur=event.getX();
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d("23123123213","123123123123213");
                float curX=event.getX();//获取此时坐标
                float curChange=curX-lastCur;//计算移动大小
                sum+=curChange;//累加
                lastCur=curX;//存储
                if(sum>maxWidth){//超出判断,如果超出则等于端点值
                    sum=maxWidth;
                }else if(sum<v1.getWidth()+5){
                    sum=v3.getWidth();
                }
                onslipListener.Onslip();
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        invalidate();//刷新界面
        return true;
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过自定义的 `SeekBar` 上下滑动控制真机的屏幕亮度和音量大小,你可以使用以下代码: 1. 布局文件 在布局文件中添加一个 `SeekBar`,并设置 `android:max` 属性为 `255`(屏幕亮度的最大值),或者 `15`(音量的最大值),并设置 `android:progress` 属性为当前的屏幕亮度或音量大小。 ```xml <!-- 控制屏幕亮度 --> <SeekBar android:id="@+id/brightness_seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="255" android:progress="100" /> <!-- 控制音量大小 --> <SeekBar android:id="@+id/volume_seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="15" android:progress="10" /> ``` 2. Java 代码 在 Java 代码中,你需要为 `SeekBar` 添加一个 `OnSeekBarChangeListener`,并在 `onProgressChanged()` 方法中获取当前的进度值,然后根据进度值设置屏幕亮度或音量大小。 ```java private SeekBar brightnessSeekBar; private SeekBar volumeSeekBar; private WindowManager.LayoutParams layoutParams; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); brightnessSeekBar = findViewById(R.id.brightness_seekbar); volumeSeekBar = findViewById(R.id.volume_seekbar); layoutParams = getWindow().getAttributes(); // 设置屏幕亮度 brightnessSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 设置屏幕亮度值(0-255) layoutParams.screenBrightness = progress / 255f; getWindow().setAttributes(layoutParams); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); // 设置音量大小 volumeSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 获取音量管理器 AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); // 设置媒体音量值(0-15) audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } ``` 这样,当你在 `SeekBar` 上下滑动时,就可以控制真机的屏幕亮度或音量大小了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值