一个最基础的自定义View 水平横向进度条,只有圆角、下载进度控制;可二次定制度高;
核心代码:
@Overrideprotected void onDraw(@NonNull Canvas canvas) {super.onDraw(canvas);int mW = getMeasuredWidth();int mH = getMeasuredHeight();Log.i(TAG, "onDraw: "+mW +"-" +mH);//先剪切出进度条的形状、主要是圆角Path path = new Path();path.addRoundRect(0,0,mW,mH ,radius,radius, Path.Direction.CCW);canvas.clipPath(path);//画背景色paint.setColor(backgroundColor);Rect rectBg = new Rect(0,0,mW,mH);canvas.drawRect(rectBg,paint);//画进度条颜色double ratio = Math.min(progress / max , 1.00) ;
// canvas.clipRect(0, 0, (int) (mW*ratio), mH);
// canvas.drawColor(loadingColor);paint.setColor(loadingColor);Rect rect = new Rect(0, 0, (int)(mW * ratio), mH);canvas.drawRect(rect,paint);}
全部代码:
package com.cuichen.mytestdemo.view;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.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;import com.cuichen.mytestdemo.R;public class HorizontalProgressView extends View {private final String TAG = HorizontalProgressView.class.getSimpleName();public HorizontalProgressView(Context context) {super(context);}public HorizontalProgressView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);initAttrs(attrs);}public HorizontalProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initAttrs(attrs);}public HorizontalProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);initAttrs(attrs);}private void initAttrs( @Nullable AttributeSet attrs){TypedArray typedArray = getContext().obtainStyledAttributes(attrs , R.styleable.HorizontalProgress);try{backgroundColor = typedArray.getColor(R.styleable.HorizontalProgress_backgroundColor , Color.parseColor("#FF03DAC5"));loadingColor = typedArray.getColor(R.styleable.HorizontalProgress_progressColor ,Color.parseColor("#FF018786"));radius = (int) typedArray.getDimension(R.styleable.HorizontalProgress_radiusDp , 0);max = typedArray.getInt(R.styleable.HorizontalProgress_max , 100);progress = typedArray.getInt(R.styleable.HorizontalProgress_progress , 50);}catch (Exception e){typedArray.recycle();}}private int radius = 18;private float progress = 0f;private float max = 100f;private int backgroundColor;private int loadingColor;final int DEFAULT_HEIGHT_DP = 36;Paint paint;void init(){paint = new Paint();paint.setAntiAlias(true);paint.setStyle(Paint.Style.FILL);}public void setProgress(int progress){this.progress = progress;invalidate();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);Log.i(TAG, "onMeasure: ");int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);int height = 0;switch (heightSpecMode){case MeasureSpec.AT_MOST:height = dp2px(DEFAULT_HEIGHT_DP);break;case MeasureSpec.EXACTLY:case MeasureSpec.UNSPECIFIED:height = heightSpecSize;break;}setMeasuredDimension(widthSpecSize, height);if(paint == null) {init();}}//RectF//left:左边坐标;在绘制中常表示为起点的Y轴坐标//top:上边左边;在绘制中常表示为起点的X轴坐标//right:右边坐标;在绘制中常表示为终点的X轴坐标//bottom:下边坐标;在绘制中常表示为终点的Y轴坐标@Overrideprotected void onDraw(@NonNull Canvas canvas) {super.onDraw(canvas);int mW = getMeasuredWidth();int mH = getMeasuredHeight();Log.i(TAG, "onDraw: "+mW +"-" +mH);//先剪切出进度条的形状、主要是圆角Path path = new Path();path.addRoundRect(0,0,mW,mH ,radius,radius, Path.Direction.CCW);canvas.clipPath(path);//画背景色paint.setColor(backgroundColor);Rect rectBg = new Rect(0,0,mW,mH);canvas.drawRect(rectBg,paint);//画进度条颜色double ratio = Math.min(progress / max , 1.00) ;
// canvas.clipRect(0, 0, (int) (mW*ratio), mH);
// canvas.drawColor(loadingColor);paint.setColor(loadingColor);Rect rect = new Rect(0, 0, (int)(mW * ratio), mH);canvas.drawRect(rect,paint);}private int dp2px(int dp){float density = getContext().getResources().getDisplayMetrics().density;return (int) (dp * density);}
}
<declare-styleable name="HorizontalProgress"><attr name="backgroundColor" format="color"/><attr name="progressColor" format="color"/><attr name="radiusDp" format="dimension"/><attr name="max" format="integer"/><attr name="progress" format="integer"/></declare-styleable>