类似网易云播放进度条按钮简单实现

Posted gali

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类似网易云播放进度条按钮简单实现相关的知识,希望对你有一定的参考价值。

1:先看效果图

  就是画了个外层的底色(一个圆),进度层颜色绘制(画了一个圆弧),中心的部分(这个就是个三角形或矩形)。

 

2:view的属性

 /*** view 环形的底色*/
 private int bgColor;
 /**** view 进度颜色 */
 private int progressColor;
 /*** view 的宽高,(宽高应当相等)*/
 private float viewHeight, viewWidth;
 /*** view 圆环的宽度*/
 private float viewRoundWidth;
 /*** view 的进度值,初始为0*/
 private int progressValue=0;
 /*** view 的进度最大值,默认为100 */
 private int progressMax=100;
 /**** 画笔*/
 private Paint paint;
 /**** 标识播放状态: 1是暂停  ; 2是播放*/
 private  int pauseOrPlay=1;

3:自定义的view属性   values\\attrs.xml

 <declare-styleable name="ProgressButton">
        <attr name="bgColor" format="color"/>
        <attr name="progressColor" format="color"/>
        <attr name="viewWidth" format="dimension"/>
        <attr name="viewHeight" format="dimension"/>
        <attr name="viewRoundWidth" format="dimension"/>
</declare-styleable>

4:直接贴代码吧

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

/**
 * Created by guoxw on 2017/11/9.
 */

public class ProgressButton extends View {


    private static final String TAG = "ProgressButton";
    /*** view 环形的底色*/
    private int bgColor;
    /**** view 进度颜色 */
    private int progressColor;
    /*** view 的宽高,(宽高应当相等)*/
    private float viewHeight, viewWidth;
    /*** view 圆环的宽度*/
    private float viewRoundWidth;

    /*** view 的进度值,初始为0*/
    private int progressValue=0;
    /*** view 的进度最大值,默认为100 */
    private int progressMax=100;

    /**** 画笔*/
    private Paint paint;

    /**** 标识播放状态: 1是暂停  ; 2是播放*/
    private  int pauseOrPlay=1;

    public ProgressButton(Context context) {
        this(context, null);
    }

    public ProgressButton(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
       
    }

    public ProgressButton(Context context, @Nullable AttributeSet attrs, int deStyleAttr) {
        super(context, attrs, deStyleAttr);
        paint = new Paint();
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ProgressButton);
        bgColor = array.getColor(R.styleable.ProgressButton_bgColor, Color.GRAY);
        progressColor = array.getColor(R.styleable.ProgressButton_progressColor, Color.RED);
        viewHeight = array.getDimension(R.styleable.ProgressButton_viewHeight, 20);
        viewWidth = array.getDimension(R.styleable.ProgressButton_viewWidth, 20);
        viewRoundWidth = array.getDimension(R.styleable.ProgressButton_viewRoundWidth, 2);
        array.recycle();
    }


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

        /*** 画外层的圆环*/
        canvas.save();
        int centre = getWidth() / 2;
        Log.d(TAG, "onDraw: ----输出;center--"+centre);
        int radius = (int) (centre - viewRoundWidth/2);
        Log.d(TAG, "onDraw: ----输出;radius--"+radius);
        paint.setColor(bgColor); //设置圆环的颜色
        paint.setStyle(Paint.Style.STROKE); //设置空心
        paint.setStrokeWidth(viewRoundWidth); //设置圆环的宽度
        paint.setAntiAlias(true);  //消除锯齿
        canvas.drawCircle(centre, centre, radius, paint); //画出圆环
        canvas.save();
        /***画进度层颜色*/
        paint.setColor(progressColor);
        paint.setStrokeWidth(viewRoundWidth);
        RectF oval = new RectF(centre - radius, centre - radius, centre
                + radius, centre + radius);
        canvas.drawArc(oval, -90, 360 * progressValue / progressMax, false, paint);

        /*****绘制中心的暂停,播放标识*/
        int x=centre*2;
        if(pauseOrPlay==1){
            Path path = new Path();
            path.moveTo(3*x/8,3*x/8);
            path.lineTo(3*x/8,5*x/8);
            path.lineTo(5*x/8,4*x/8);
            paint.setColor(Color.RED);
            paint.setStyle(Paint.Style.FILL);
            paint.setStrokeWidth(1);
            canvas.drawPath(path,paint);
        }else if(pauseOrPlay==2){
            RectF rectF=new RectF(3*x/8,3*x/8,5*x/8,5*x/8);
            paint.setColor(Color.RED);
            paint.setStyle(Paint.Style.FILL);
            paint.setStrokeWidth(1);
            canvas.drawRect(rectF,paint);
        }

    }



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

    public int getProgressValue() {
        return progressValue;
    }

    public void setProgressValue(int progressValue) {
        if(progressValue<0){
            throw new IllegalArgumentException("progress not less than 0");
        }else if(progressValue>progressMax){
            this.progressValue=progressMax;
        }else{
            this.progressValue=progressValue;
        }

        postInvalidate();
    }

    public int getProgressMax() {
        return progressMax;
    }

    public void setProgressMax(int progressMax) {
        this.progressMax = progressMax;
    }

    public int getPauseOrPlay() {
        return pauseOrPlay;
    }

    public void setPauseOrPlay(int pauseOrPlay) {
        this.pauseOrPlay = pauseOrPlay;
        postInvalidate();
    }

xml使用

<com.example.playprogressbar.ProgressButton
        android:id="@+id/image"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="20dp"
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:viewHeight="100dp"
        app:viewWidth="100dp"
        app:bgColor="@color/colorAccent"
        app:progressColor="@color/colorPrimary"
        app:viewRoundWidth="10dp"
        />

  

 

5:加上示例代码 playprogressbar

 

链接: https://pan.baidu.com/s/1b1Rm3s 

6:顺便学习下怎么传到GitHub做成library

 

https://github.com/galibujianbusana/progressBtn1

  

以上是关于类似网易云播放进度条按钮简单实现的主要内容,如果未能解决你的问题,请参考以下文章

Android开发---MediaPlayer简单音乐播放器

微信小程序学习网易云音乐歌曲详情页代码实现

js 代码实现视频进度条点到哪个位置就播放那个位置的视频。进度条是用css样式另做的。

网页插入SWF视频,如何带有播放控制按钮、进度条等!

3.Android高仿网易云音乐-首页复杂发现界面布局和功能

3.Android高仿网易云音乐-首页复杂发现界面布局和功能