xiaoshubin / smallutils Goto Github PK
View Code? Open in Web Editor NEW收录一些小的工具类
收录一些小的工具类
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();
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.