垂直形式的ProgresBar,和兩頭圓角類型設置

這兩天,項目中用到設置系統聲音和樣式展示,也不是很難,但是,在這裏做個記錄進行保存,以後,可能還用的上,大家都知道正常的Progressbar怎麼使用,這裏,我就不多說了,我先將項目中用的的垂直方向的音量柱做個記錄,

1、首先我發先獲取系統音量的最大值,和我想要設置的最大值不一樣,這裏,你們可以自己想辦法,看看是爲什麼,我自己的解決方式是自己設定的一個最大值,通過,音量鍵加減進行更改音量,首先將垂直的progressbar寫出來


import android.content.Context;
import android.graphics.Canvas;
import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ProgressBar;

import androidx.annotation.RequiresApi;

public class VerticalProgressBar extends ProgressBar {

    private int currentProgress = 0;

    public VerticalProgressBar(Context context) {
        super(context);
    }

    public VerticalProgressBar(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public VerticalProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public VerticalProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(h, w, oldh, oldw);
    }

    @Override
    protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    /*
     * 重點在這裏
     */
    @Override
    protected synchronized void onDraw(Canvas canvas) {
        canvas.rotate(-90);
        canvas.translate(-getHeight(), 0);
        super.onDraw(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (!isEnabled()) {
            return false;
        }

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                setProgress(getMax() - (int) (getMax() * event.getY() / getHeight()));
                currentProgress = getMax() - (int) (getMax() * event.getY() / getHeight());
                onSizeChanged(getWidth(), getHeight(), 0, 0);
                break;
            case MotionEvent.ACTION_CANCEL:
                break;
        }
        return true;
    }

    /**
     * 獲取當前progress進度
     * @return
     */
    public int getCurrentProgress() {
        return currentProgress;
    }
}

2、然後就再佈局中引用了,當然,肯定想問,我想要好看的progressbar啊,是的,我也不想一步步來了,直接就上結果樣子把

看到了把,是不是你想要的樣子,是不是,就說是不是把,是的話,點贊,啊哈哈哈,我知道,你看到這裏,肯定說,哇哈哈,終於找到自己想要的資源了,嗯,不錯,就是這樣的,那怎麼實現呢 ,且聽下回分解,哦不,請聽我下面解說,嘿嘿,首先,寫一個style,知道怎麼寫嗎 ?不錯,,就是再你的values下的style文件裏面,添加如下代碼

 <style name="ProgressBar_Scale" parent="@android:style/Widget.ProgressBar.Horizontal">
        <item
name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
        <item name="android:progressDrawable">@drawable/seekbar_style</item>
    </style>

3、是不是發現,自己沒有seekbar_style.xml文件,是的,上面裏面的這個文件,就是要給progressbar設置樣式的,所以呢,代碼如下,就是了,再你的drawable文件夾下創建資源文件seekbar_style.xml,當然,名字,你自己隨意,這是我自己定義的名字

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="15dip" />
            <gradient
                android:angle="270"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:startColor="#ff9d9e9d" />
        </shape>
    </item>

    <item android:id="@android:id/secondaryProgress">
        <scale android:scaleWidth="100%">
            <shape>
                <corners android:radius="15dip" />
                <gradient
                    android:angle="270"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:startColor="#80ffd300" />
            </shape>
        </scale>
    </item>
    <item android:id="@android:id/progress">
        <scale android:scaleWidth="100%">
            <shape>
                <corners android:radius="15dip" />
                <gradient
                    android:angle="270"
                    android:centerColor="#ff3399CC"
                    android:centerY="0.75"
                    android:endColor="#ff6699CC"
                    android:startColor="#ff0099CC" />
            </shape>
        </scale>
    </item>
</layer-list>

4、是不是很簡單,裏面幾乎沒有什麼要改正的對吧,想要改,我就不備註了,你自己運行後看效果就行了,想改什麼自己多試幾次,這樣,能加深你印象,下面就是再progressbar裏面配置了把,是的,在你的activity佈局文件中,配置你的pragressbar控件


        <com.example.vehicleconsole.wedgt.VerticalProgressBar
            android:id="@+id/seek"
            style="@style/ProgressBar_Scale"
            android:layout_width="25dp"
            android:layout_height="280dp"
            android:progressDrawable="@drawable/seekbar_style" />

5、這樣,你的progressbar就是一個豎向的,而且是兩頭半圓角的一個控件了,是不是很開心,還需什麼嗎 ?嗯我想想,當然,在activity裏面,肯定要先設置最大值,progressbar.setMax(20);具體,你想設置多少,你自己定啦;然後,設置想要設置的當前進度,就是想將progressbar設置到想要的位置 progressbar.setProgress(10);裏面的值也是你自己定的,有人肯定問了,我想要滑動他怎麼辦 ?是啊,怎麼辦 ? 因爲,控件裏面我加了獲取當前進度的地方,所以,下面代碼,你在監聽裏面監聽一下就好了

    progressbar.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int currentProgress = seek.getCurrentProgress();
                mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentProgress, AudioManager.FLAG_SHOW_UI);
                SpUtil.putInt("phoneMusic", currentProgress);
                currentMusic = currentProgress;
                return false;
            }
        });

6、看到沒 ?這裏的mAudioManager是系統manager,不知道的看下面,裏面是當我滑動到哪裏,就將系統聲音設置到哪裏,然後進行sp保存,具體怎麼存,你們自己定哈,不用管我怎麼存,我是方便下次記錄,

   mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

7、具體逐步增加和減少系統音量的方法是下面樣子

//*****************************這是減音量的地方別拷貝錯了*********************
  mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                            AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_SHOW_UI);
                    if (currentMusic - 1 >= MINMUSIC) {
                        seek.setProgress(currentMusic - 1);
                        SpUtil.putInt("phoneMusic", currentMusic - 1);
                        currentMusic = currentMusic - 1;
                    }




//*****************************下面是增加音量的地方別拷貝錯了*********************

//*****************************下面是增加音量的地方別拷貝錯了*********************

//*****************************下面是增加音量的地方別拷貝錯了*********************
 mAudioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                            AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND | AudioManager.FLAG_SHOW_UI);
                    if (currentMusic + 1 <= MAXMUSIC) {
                        seek.setProgress(currentMusic + 1);
                        SpUtil.putInt("phoneMusic", currentMusic + 1);
                        currentMusic = currentMusic + 1;
                    }

8、裏面的if判斷,是我自己的邏輯哈,你們可以不用管,只需要拷貝if判斷之外的就行了,那就已經可以做到增減聲音了 ,我是把增減都放到了上面代碼中,請大家分別拷貝,不要無腦拷貝,!~!~!具體的功能基本上都已經實現了,代碼呢還是需要自己整理的,具體怎麼弄,你們自己看着辦嘍,有朋友肯定想說,我想橫向的怎麼辦,橫向的你就自己定義一個類去繼承Prggressbar,然後,將我最上面的那個裏面onTouch的方法,重寫一下,然後,其他都一樣,也能實現哦,好了,基本都已經完畢了,有對你幫助的話,就請給個贊支持下我,主要是對筆者的一點小小的鼓勵,也是我們共同進步的動力,謝謝!~!~!~

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章