GithubHelp home page GithubHelp logo

smallutils's People

Contributors

xiaoshubin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

smallutils's Issues

优化DownloadCircleView类

1.新增builder模式,使DownloadCircleView可在布局引用或者使用代码创建

2.在DownloadCircleView创建测量时,加上卫星球的直径

DownloadCircleView类:

public class DownloadCircleView extends View {

Paint mCircleTrackBgPaint;//圆形轨迹画笔
Paint mCircleTrackStepPaint;//圆形轨迹进度条画笔
Paint mSatellitePaint;//进度条上的卫星画笔
Paint mSatelliteTxtPaint;//进度条上的卫星里面的文字画笔
int mCircleTrackRadius = UIUtils.dp2px(100);//圆形轨迹半径
int mCircleTrackWidth =UIUtils.dp2px(2);//圆形轨迹宽度
float mSatelliteTxtSize  = UIUtils.dp2px(12);//卫星球文字大小
float mSatelliteRadius  = UIUtils.dp2px(12) * 1.3f;//卫星球半径

float maxProgress=100f;//最大进度值
float progress  =0f;//当前进度值

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

public DownloadCircleView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    //从布局文件引入创建,调用该方法
    init(context,null);
}

public DownloadCircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

/**
 * 从代码创建时,调用该方法
 * @param context
 * @param builder
 */
private DownloadCircleView(Context context, @Nullable Builder builder) {
    super(context);
    init(context, builder);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width;
    int height;
    int size = MeasureSpec.getSize(widthMeasureSpec);
    int mode = MeasureSpec.getMode(widthMeasureSpec);

    if (mode == MeasureSpec.EXACTLY) {
        width = size;
    } else {
        width = (int) ((2 * mCircleTrackRadius) + mCircleTrackWidth + (2 *mSatelliteRadius));
    }
    size = MeasureSpec.getSize(heightMeasureSpec);
    mode = MeasureSpec.getMode(heightMeasureSpec);
    if (mode == MeasureSpec.EXACTLY) {
        height = size;
    } else {
        height = (int) ((2 * mCircleTrackRadius) + mCircleTrackWidth + (2 *mSatelliteRadius));
    }
    setMeasuredDimension(width, height);
}

/**
 * 设置参数
 */
private void init(Context context,Builder builder) {
    if (builder == null) {
        builder = new Builder(context);
        LogUtils.d("从布局文件引入创建");
    }
    LogUtils.d("从代码直接创建");
    //builder配置信息
    this.mCircleTrackRadius = builder.mCircleTrackRadius;
    this.mCircleTrackWidth = builder.mCircleTrackWidth;
    this.mSatelliteTxtSize = builder.mSatelliteTxtSize;
    this.mSatelliteRadius = builder.mSatelliteRadius;
    //圆形轨迹背景
    mCircleTrackBgPaint = new Paint();
    mCircleTrackBgPaint.setStrokeWidth(mCircleTrackWidth);
    mCircleTrackBgPaint.setColor(getResources().getColor(builder.mCircleTrackBgColor));
    mCircleTrackBgPaint.setAntiAlias(true);
    mCircleTrackBgPaint.setStyle(Paint.Style.STROKE); //绘制空心圆
    //圆形轨迹进度条
    mCircleTrackStepPaint = new Paint();
    mCircleTrackStepPaint.setStrokeWidth(mCircleTrackWidth);
    mCircleTrackStepPaint.setColor(getResources().getColor(builder.mCircleTrackStepColor));
    this.mCircleTrackStepPaint.setAntiAlias(true);
    this.mCircleTrackStepPaint.setStyle(Paint.Style.STROKE); //绘制空心圆
    //进度卫星球
    mSatellitePaint = new Paint();
    mSatellitePaint.setColor(getResources().getColor(builder.mSatelliteBgColor));
    this.mSatellitePaint.setAntiAlias(true);
    this.mSatellitePaint.setStyle(Paint.Style.FILL); //绘制实心圆
    //进度卫星球文字
    mSatelliteTxtPaint = new Paint();
    mSatelliteTxtPaint.setTextSize(mSatelliteTxtSize);
    mSatelliteTxtPaint.setColor(getResources().getColor(builder.mSatelliteTxtColor));
    this.mSatelliteTxtPaint.setAntiAlias(true);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    //绘制圆形轨迹
    int circlePoint = getWidth() / 2;
    canvas.drawCircle(circlePoint, circlePoint, mCircleTrackRadius, mCircleTrackBgPaint);
    //绘制圆形轨迹进度条
    RectF oval = new RectF();
    oval.left=circlePoint - mCircleTrackRadius;
    oval.top=circlePoint - mCircleTrackRadius;
    oval.right=circlePoint + mCircleTrackRadius;
    oval.bottom=circlePoint + mCircleTrackRadius;
    float range = 360 * (progress / maxProgress);
    canvas.drawArc(oval, -90,  range, false, mCircleTrackStepPaint);
    //绘制圆形轨迹上的卫星球和文字
    double x1 = circlePoint + mCircleTrackRadius * Math.cos((range-90) * 3.14 / 180);
    double y1 = circlePoint + mCircleTrackRadius * Math.sin((range-90) * 3.14 / 180);
    canvas.drawCircle((float) x1, (float) y1, mSatelliteRadius, mSatellitePaint);
    String txt = (int) progress + "%";
    float strwid  = mSatelliteTxtPaint.measureText(txt);//直接返回参数字符串所占用的宽度
    canvas.drawText(txt,(float) x1-strwid/2, (float) y1+mSatelliteTxtSize/2-mCircleTrackWidth/2,mSatelliteTxtPaint);
}

/**
 * 设置进度值
 */
public void setProgress(float progress) {
    this.progress = progress;
    postInvalidate();
}

/**
 * DownloadCircleView Builder
 */
public static class Builder {

    int mCircleTrackRadius = UIUtils.dp2px(100);//圆形轨迹半径,默认是100dp
    int mCircleTrackWidth = UIUtils.dp2px(2);//圆形轨迹大小,默认是2dp
    int mCircleTrackBgColor  = R.color.gray;//圆形轨迹背景颜色,默认灰色
    int mCircleTrackStepColor = R.color.default_circle_color_FF5836;//圆形轨迹进度颜色,默认FF5836

    int mSatelliteBgColor = R.color.default_circle_color_FF5836;//卫星球背景颜色,默认FF5836
    float mSatelliteRadius = UIUtils.dp2px(12) * 1.3f;//卫星球大小,默认时字体大小的1.3倍
    int mSatelliteTxtColor = R.color.white;//卫星球文字颜色,默认白色
    float mSatelliteTxtSize= UIUtils.dp2px(12);//卫星球文字大小

    Context mContext;

    public Builder(Context context){
        this.mContext = context;
    }

    /**
     * 设置圆形轨迹背景颜色
     */
    public Builder setCircleTrackBgColor(int circleTrackBgColor){
        this.mCircleTrackBgColor = circleTrackBgColor;
        return this;
    }

    /**
     * 设置圆形轨迹进度颜色
     */
    public Builder setCircleTrackStepColor(int circleTrackStepColor){
        this.mCircleTrackStepColor = circleTrackStepColor;
        return this;
    }

    /**
     * 设置圆形轨迹宽度
     */
    public Builder setCircleTrackWidth(int circleTrackWidth){
        this.mCircleTrackWidth = UIUtils.dp2px(circleTrackWidth);
        return this;
    }

    /**
     * 设置圆形轨迹半径
     */
    public Builder setCircleTrackRadius (int circleTrackRadius){
        this.mCircleTrackRadius = UIUtils.dp2px(circleTrackRadius);
        return this;
    }

    /**
     * 设置进度卫星球背景颜色
     */
    public Builder setSatelliteBgColor(int satelliteBgColor){
        this.mSatelliteBgColor = satelliteBgColor;
        return this;
    }

    /**
     * 设置卫星球半径
     */
    public Builder setSatelliteRadius(int satelliteRadius){
        this.mSatelliteRadius = UIUtils.dp2px(satelliteRadius);
        return this;
    }

    /**
     * 设置卫星球进度文字颜色
     */
    public Builder setSatelliteTxtColor(int satelliteTxtColor){
        this.mSatelliteTxtColor = satelliteTxtColor;
        return this;
    }

    /**
     * 设置卫星球进度文字大小
     */
    public Builder setSatelliteTxtSize(int satelliteTxtSize){
        this.mSatelliteTxtSize = UIUtils.dp2px(satelliteTxtSize);
        return this;
    }

    /**
     * 创建DownloadCircleView
     * @return DownloadCircleView
     */
    public DownloadCircleView build() {
        if (mSatelliteRadius < mSatelliteTxtSize * 1.3f){
            this.mSatelliteRadius = mSatelliteTxtSize * 1.3f;
        }
        return new DownloadCircleView(mContext,this);
    }
}

}
布局文件:

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<com.seatel.mpay.view.DownloadCircleView
    android:id="@+id/circle_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<!--<RelativeLayout
    android:id="@+id/rl_circle_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />-->

<ImageView
    android:id="@+id/iv_logo"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:layout_centerInParent="true"
    android:src="@mipmap/logo"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/tv_msg"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/iv_logo"
    android:layout_centerHorizontal="true"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:text="正在下载..."
    android:textSize="12sp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/iv_logo" />

</androidx.constraintlayout.widget.ConstraintLayout>
使用方式:
View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_download_circle,null);
DownloadCircleView circleView = view.findViewById(R.id.circle_view);

// View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_download_circle,null);
// RelativeLayout relativeLayout = view.findViewById(R.id.rl_circle_view);
// DownloadCircleView circleView = new DownloadCircleView.Builder(getActivity())
// .setCircleTrackBgColor(R.color.gray)
// .setCircleTrackStepColor(R.color.fail_color)
// .setCircleTrackRadius(80)
// .setCircleTrackWidth(5)
// .setSatelliteRadius(10)
// .setSatelliteBgColor(R.color.pink_color)
// .setSatelliteTxtColor(R.color.black)
// .setSatelliteTxtSize(14)
// .build();
//
// relativeLayout.addView(circleView);

    AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
            .setView(view)
            .setCancelable(true)
            .create();
    alertDialog.show();

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.