android 自定义进度条

1、android 自定义进度条 分三块 每块颜色不同
要实现这个功能,您可以考虑自定义一个 View,然后在 View 中绘制三个矩形,每个矩形对应一个进度块,再根据进度的大小来确定每个矩形的宽度。

下面是一个简单的示例代码,可以根据自己的需求进行修改:

public class CustomProgressBar extends View {

    private Paint mPaint1, mPaint2, mPaint3; // 三个画笔,对应三个进度块的颜色

    private int mWidth, mHeight; // View 的宽度和高度

    private float mProgress1, mProgress2, mProgress3; // 三个进度块的进度值,取值范围为 0-1

    public CustomProgressBar(Context context) {
        super(context);
        init();
    }

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

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

    private void init() {
        // 初始化三个画笔,分别设置对应的颜色
        mPaint1 = new Paint();
        mPaint1.setColor(Color.RED);

        mPaint2 = new Paint();
        mPaint2.setColor(Color.YELLOW);

        mPaint3 = new Paint();
        mPaint3.setColor(Color.GREEN);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        // 获取 View 的宽度和高度
        mWidth = w;
        mHeight = h;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 计算每个进度块的宽度
        float width1 = mWidth / 3 * mProgress1;
        float width2 = mWidth / 3 * mProgress2;
        float width3 = mWidth / 3 * mProgress3;

        // 绘制三个矩形
        canvas.drawRect(0, 0, width1, mHeight, mPaint1);
        canvas.drawRect(width1, 0, width1 + width2, mHeight, mPaint2);
        canvas.drawRect(width1 + width2, 0, mWidth, mHeight, mPaint3);
    }

    // 设置三个进度块的进度值
    public void setProgress(float progress1, float progress2, float progress3) {
        mProgress1 = progress1;
        mProgress2 = progress2;
        mProgress3 = progress3;
        invalidate(); // 刷新 View
    }
}

使用时,可以通过 setProgress() 方法设置进度值,例如:

CustomProgressBar progressBar = findViewById(R.id.progress_bar);
progressBar.setProgress(0.3f, 0.5f, 0.7f);

这将会让进度条的第一个进度块占据整个 View 的三分之一,第二个进度块占据整个 View 的三分之二,第三个进度块占据整个 View 的全部。

这里根据你要的进度已经可以用这个代码,但是呢,哪有那么简单的需求。。。

2、Android 自定义进度条 3个不同颜色的模块 根据音乐的进度
要实现根据音乐进度动态更新自定义进度条的功能,可以在 View 中添加一个公开的 setProgress() 方法,通过这个方法更新进度值并刷新界面。在 onDraw() 方法中,根据当前的进度值来计算每个进度块的宽度,并绘制不同颜色的矩形。

下面是一个示例代码,可以根据自己的需求进行修改

public class MusicProgressBar extends View {

    private Paint mPaint1, mPaint2, mPaint3; // 三个画笔,对应三个进度块的颜色

    private int mWidth, mHeight; // View 的宽度和高度

    private float mProgress1, mProgress2, mProgress3; // 三个进度块的进度值,取值范围为 0-1

    public MusicProgressBar(Context context) {
        super(context);
        init();
    }

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

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

    private void init() {
        // 初始化三个画笔,分别设置对应的颜色
        mPaint1 = new Paint();
        mPaint1.setColor(Color.RED);

        mPaint2 = new Paint();
        mPaint2.setColor(Color.YELLOW);

        mPaint3 = new Paint();
        mPaint3.setColor(Color.GREEN);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        // 获取 View 的宽度和高度
        mWidth = w;
        mHeight = h;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 计算每个进度块的宽度
        float width1 = mWidth / 3 * mProgress1;
        float width2 = mWidth / 3 * mProgress2;
        float width3 = mWidth / 3 * mProgress3;

        // 绘制三个矩形
        canvas.drawRect(0, 0, width1, mHeight, mPaint1);
        canvas.drawRect(width1, 0, width1 + width2, mHeight, mPaint2);
        canvas.drawRect(width1 + width2, 0, mWidth, mHeight, mPaint3);
    }

    // 设置音乐播放进度,根据进度值计算并更新进度条的三个块的长度
    public void setProgress(int progress, int total) {
        float ratio = (float) progress / (float) total; // 计算进度比例
        if (ratio < 0.33f) {
            mProgress1 = ratio / 0.33f;
            mProgress2 = 0;
            mProgress3 = 0;
        } else if (ratio < 0.67f) {
            mProgress1 = 1;
            mProgress2 = (ratio - 0.33f) / 0.34f;
            mProgress3 = 0;
        } else {
            mProgress1 = 1;
            mProgress2 = 1;
            mProgress3 = (ratio - 0.67f) / 0.33f;
    }
    // 刷新界面
    invalidate();
}
}

在 Activity 中,可以使用定时器来定时更新进度条的进度,例如每隔 100 毫秒更新一次:

public class MainActivity extends AppCompatActivity {

    private MusicProgressBar mProgressBar;

    private Timer mTimer;

    private int mProgress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mProgressBar = findViewById(R.id.progress_bar);

        // 启动定时器,每隔 100 毫秒更新进度条的进度
        mTimer = new Timer();
        mTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                mProgressBar.setProgress(mProgress++, 100);
                if (mProgress > 100) {
                    mProgress = 0;
                }
            }
        }, 0, 100);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 取消定时器
        mTimer.cancel();
    }
}

能用吗?不清楚啊,但是明显不是我想要的,起码暂停开始要一致吧,再改吧

3、android 写一个音乐进度条,要求3个模块,每个模块颜色不一样,根据音乐的开始进度条开始,音乐暂停进度条就暂停

首先,我们可以自定义一个 View,例如名为 MusicProgressBar。在这个 View 中,我们可以使用三个矩形来表示进度条的三个模块,然后根据当前进度的比例,来计算每个模块的长度和颜色。

以下是 MusicProgressBar 的简单实现:

public class MusicProgressBar extends View {

    // 进度条的三个模块颜色
    private int mColor1 = Color.parseColor("#66CCFF");
    private int mColor2 = Color.parseColor("#FFBB33");
    private int mColor3 = Color.parseColor("#FF4444");

    // 进度条的三个模块长度
    private float mProgress1 = 0f;
    private float mProgress2 = 0f;
    private float mProgress3 = 0f;

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

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

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

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 获取 View 的宽度和高度
        int width = getWidth();
        int height = getHeight();

        // 绘制进度条的三个模块
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.FILL);

        // 绘制第一个模块
        paint.setColor(mColor1);
        canvas.drawRect(0, 0, mProgress1 * width, height, paint);

        // 绘制第二个模块
        paint.setColor(mColor2);
        canvas.drawRect(mProgress1 * width, 0, (mProgress1 + mProgress2) * width, height, paint);

        // 绘制第三个模块
        paint.setColor(mColor3);
        canvas.drawRect((mProgress1 + mProgress2) * width, 0, width, height, paint);
    }

    /**
     * 设置进度条的进度
     *
     * @param progress 进度,范围为 [0, 100]
     * @param duration 音乐的总时长,单位为毫秒
     */
    public void setProgress(int progress, long duration) {
        // 计算进度的比例
        float ratio = (float) progress / 100f;

        // 计算每个模块的长度和颜色
        if (ratio <= 0.33f) {
            mProgress1 = ratio / 0.33f;
            mProgress2 = 0f;
            mProgress3 = 0f;
        } else if (ratio <= 0.67f) {
            mProgress1 = 1f;
            mProgress2 = (ratio - 0.33f) / 0.34f;
            mProgress3 = 0f;
        } else {
            mProgress1 = 1f;
            mProgress2 = 1f;
            mProgress3 = (ratio - 0.67f) / 0.33f;
        }

        // 刷新界
        postInvalidate();
     }
}

在代码中,我们通过三个变量 mProgress1、mProgress2 和 mProgress3 来记录每个模块的长度,然后在 setProgress 方法中,根据当前进度的比例来计算每个模块的长度和颜色。

比如,当进度为 50% 时,我们可以将第一个模块的长度设置为 1,第二个模块的长度设置为 0.5,第三个模块的长度设置为 0,然后绘制出对应颜色的矩形即可。

如果你想让进度条跟随音乐播放进度更新,可以在 Activity 或 Fragment 中使用 Handler 定时更新进度条的进度,例如每 100 毫秒更新一次。具体实现可以参考以下代码:

private Handler mHandler = new Handler();
private Runnable mUpdateProgressRunnable = new Runnable() {
    @Override
    public void run() {
        // 更新进度条的进度
        int progress = getMusicProgress();
        mMusicProgressBar.setProgress(progress, mMusicDuration);

        // 继续定时更新进度条的进度
        mHandler.postDelayed(this, 100);
    }
};

// 获取音乐的播放进度
private int getMusicProgress() {
    // TODO: 实现获取音乐播放进度的逻辑
    return 0;
}

// 开始更新进度条的进度
private void startUpdateProgress() {
    mHandler.post(mUpdateProgressRunnable);
}

// 停止更新进度条的进度
private void stopUpdateProgress() {
    mHandler.removeCallbacks(mUpdateProgressRunnable);
}

在代码中,我们使用一个名为 mUpdateProgressRunnable 的 Runnable 来定时更新进度条的进度,然后在 getMusicProgress 方法中实现获取音乐播放进度的逻辑。在 Activity 或 Fragment 中,你可以在 onStart 方法中调用 startUpdateProgress 方法开始更新进度条的进度,在 onStop 方法中调用 stopUpdateProgress 方法停止更新进度条的进度。

最后,在布局文件中,我们可以使用自定义的 MusicProgressBar 控件来展示音乐进度条。以下是一个简单的布局文件示例:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 音乐进度条 -->
    <com.example.MusicProgressBar
        android:id="@+id/music_progress_bar"
        android:layout_width="match_parent"
        android:layout_height="10dp"
        android:layout_centerVertical="true"
        android:paddingLeft="10dp"
        android:paddingRight="10dp" />

    <!-- 播放按钮 -->
    <ImageButton
        android:id="@+id/play_button"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@android:color/transparent"
        android:src="@drawable/ic_play" />

</RelativeLayout>

在布局文件中,我们将 MusicProgressBar 控件和播放按钮放置在一个 RelativeLayout 中,并设置了一些简单的布局属性。注意,我们将 MusicProgressBar 的高度设置为 10dp,这是因为我们在自定义 View 中使用了 hard-coded value 来定义了每个模块的高度,所以在布局文件中设置高度不会对每个模块的长度产生影响。

这样,我们就完成了一个简单的 Android 自定义进度条,支持根据音乐进度更新进度条的进度,并且可以自定义每个模块的颜色。当然,这只是一个简单的示例,你可以根据自己的需求进行定制和扩展。

代码跑一下吧

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容