gpt4 book ai didi

环形进度条上的 Android 圆形边缘

转载 作者:IT老高 更新时间:2023-10-28 22:17:51 25 4
gpt4 key购买 nike

我正在尝试在 android 上制作一个圆形进度条,这似乎是一项非常简单的任务,但我正在努力解决进度和次要进度的边缘。

有没有办法在不制作自定义 View 的情况下做到这一点?使用拐角半径?还是九个可绘制的补丁?

对于这个 View (见附件),我使用的是一个简单的 xml 文件

<item android:id="@android:id/progress">


<shape
android:useLevel="true"
android:innerRadius="@dimen/sixty_dp"
android:shape="ring"
android:thickness="@dimen/seven_dp">

<solid android:color="#477C5B"/>

<stroke android:width="1dip"
android:color="#FFFF"/>
</shape>






</item>

enter image description here

最佳答案

只需在您的包中创建名为 MyProgress 的类.. 并粘贴以下代码..

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;

public class MyProgress extends View {

private Paint mPrimaryPaint;
private Paint mSecondaryPaint;
private RectF mRectF;
private TextPaint mTextPaint;
private Paint mBackgroundPaint;

private boolean mDrawText = false;

private int mSecondaryProgressColor;
private int mPrimaryProgressColor;
private int mBackgroundColor;

private int mStrokeWidth;

private int mProgress;
private int mSecodaryProgress;

private int mTextColor;

private int mPrimaryCapSize;
private int mSecondaryCapSize;
private boolean mIsPrimaryCapVisible;
private boolean mIsSecondaryCapVisible;

private int x;
private int y;
private int mWidth = 0, mHeight = 0;


public MyProgress(Context context) {
super(context);
init(context, null);
}

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

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

void init(Context context, AttributeSet attrs) {
TypedArray a;
if (attrs != null) {
a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.MyProgress,
0, 0);
} else {
throw new IllegalArgumentException("Must have to pass the attributes");
}

try {
mDrawText = a.getBoolean(R.styleable.MyProgress_showProgressText, false);

mBackgroundColor = a.getColor(R.styleable.MyProgress_backgroundColor, android.R.color.darker_gray);
mPrimaryProgressColor = a.getColor(R.styleable.MyProgress_progressColor, android.R.color.darker_gray);
mSecondaryProgressColor = a.getColor(R.styleable.MyProgress_secondaryProgressColor, android.R.color.black);

mProgress = a.getInt(R.styleable.MyProgress_progress, 0);
mSecodaryProgress = a.getInt(R.styleable.MyProgress_secondaryProgress, 0);

mStrokeWidth = a.getDimensionPixelSize(R.styleable.MyProgress_strokeWidth, 20);
mTextColor = a.getColor(R.styleable.MyProgress_textColor, android.R.color.black);

mPrimaryCapSize = a.getInt(R.styleable.MyProgress_primaryCapSize, 20);
mSecondaryCapSize = a.getInt(R.styleable.MyProgress_secodaryCapSize, 20);

mIsPrimaryCapVisible = a.getBoolean(R.styleable.MyProgress_primaryCapVisibility, true);
mIsSecondaryCapVisible = a.getBoolean(R.styleable.MyProgress_secodaryCapVisibility, true);
} finally {
a.recycle();
}

mBackgroundPaint = new Paint();
mBackgroundPaint.setAntiAlias(true);
mBackgroundPaint.setStyle(Paint.Style.STROKE);
mBackgroundPaint.setStrokeWidth(mStrokeWidth);
mBackgroundPaint.setColor(mBackgroundColor);

mPrimaryPaint = new Paint();
mPrimaryPaint.setAntiAlias(true);
mPrimaryPaint.setStyle(Paint.Style.STROKE);
mPrimaryPaint.setStrokeWidth(mStrokeWidth);
mPrimaryPaint.setColor(mPrimaryProgressColor);

mSecondaryPaint = new Paint();
mSecondaryPaint.setAntiAlias(true);
mSecondaryPaint.setStyle(Paint.Style.STROKE);
mSecondaryPaint.setStrokeWidth(mStrokeWidth - 2);
mSecondaryPaint.setColor(mSecondaryProgressColor);

mTextPaint = new TextPaint();
mTextPaint.setColor(mTextColor);

mRectF = new RectF();
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mRectF.set(getPaddingLeft(), getPaddingTop(), w - getPaddingRight(), h - getPaddingBottom());
mTextPaint.setTextSize(w / 5);
x = (w / 2) - ((int) (mTextPaint.measureText(mProgress + "%") / 2));
y = (int) ((h / 2) - ((mTextPaint.descent() + mTextPaint.ascent()) / 2));
mWidth = w;
mHeight = h;
invalidate();
}

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

mPrimaryPaint.setStyle(Paint.Style.STROKE);
mSecondaryPaint.setStyle(Paint.Style.STROKE);

// for drawing a full progress .. The background circle
canvas.drawArc(mRectF, 0, 360, false, mBackgroundPaint);

// for drawing a secondary progress circle
int secondarySwipeangle = (mSecodaryProgress * 360) / 100;
canvas.drawArc(mRectF, 270, secondarySwipeangle, false, mSecondaryPaint);

// for drawing a main progress circle
int primarySwipeangle = (mProgress * 360) / 100;
canvas.drawArc(mRectF, 270, primarySwipeangle, false, mPrimaryPaint);

// for cap of secondary progress
int r = (getHeight() - getPaddingLeft() * 2) / 2; // Calculated from canvas width
double trad = (secondarySwipeangle - 90) * (Math.PI / 180d); // = 5.1051
int x = (int) (r * Math.cos(trad));
int y = (int) (r * Math.sin(trad));
mSecondaryPaint.setStyle(Paint.Style.FILL);
if (mIsSecondaryCapVisible)
canvas.drawCircle(x + (mWidth / 2), y + (mHeight / 2), mSecondaryCapSize, mSecondaryPaint);

// for cap of primary progress
trad = (primarySwipeangle - 90) * (Math.PI / 180d); // = 5.1051
x = (int) (r * Math.cos(trad));
y = (int) (r * Math.sin(trad));
mPrimaryPaint.setStyle(Paint.Style.FILL);
if (mIsPrimaryCapVisible)
canvas.drawCircle(x + (mWidth / 2), y + (mHeight / 2), mPrimaryCapSize, mPrimaryPaint);


if (mDrawText)
canvas.drawText(mProgress + "%", x, y, mTextPaint);
}

public void setDrawText(boolean mDrawText) {
this.mDrawText = mDrawText;
invalidate();
}

public void setBackgroundColor(int mBackgroundColor) {
this.mBackgroundColor = mBackgroundColor;
invalidate();
}

public void setSecondaryProgressColor(int mSecondaryProgressColor) {
this.mSecondaryProgressColor = mSecondaryProgressColor;
invalidate();
}

public void setPrimaryProgressColor(int mPrimaryProgressColor) {
this.mPrimaryProgressColor = mPrimaryProgressColor;
invalidate();
}

public void setStrokeWidth(int mStrokeWidth) {
this.mStrokeWidth = mStrokeWidth;
invalidate();
}

public void setProgress(int mProgress) {
this.mProgress = mProgress;
invalidate();
}

public void setSecondaryProgress(int mSecondaryProgress) {
this.mSecodaryProgress = mSecondaryProgress;
invalidate();
}

public void setTextColor(int mTextColor) {
this.mTextColor = mTextColor;
invalidate();
}

public void setPrimaryCapSize(int mPrimaryCapSize) {
this.mPrimaryCapSize = mPrimaryCapSize;
invalidate();
}

public void setSecondaryCapSize(int mSecondaryCapSize) {
this.mSecondaryCapSize = mSecondaryCapSize;
invalidate();
}

public boolean isPrimaryCapVisible() {
return mIsPrimaryCapVisible;
}

public void setIsPrimaryCapVisible(boolean mIsPrimaryCapVisible) {
this.mIsPrimaryCapVisible = mIsPrimaryCapVisible;
}

public boolean isSecondaryCapVisible() {
return mIsSecondaryCapVisible;
}

public void setIsSecondaryCapVisible(boolean mIsSecondaryCapVisible) {
this.mIsSecondaryCapVisible = mIsSecondaryCapVisible;
}


public int getSecondaryProgressColor() {
return mSecondaryProgressColor;
}

public int getPrimaryProgressColor() {
return mPrimaryProgressColor;
}

public int getProgress() {
return mProgress;
}

public int getBackgroundColor() {
return mBackgroundColor;
}

public int getSecodaryProgress() {
return mSecodaryProgress;
}

public int getPrimaryCapSize() {
return mPrimaryCapSize;
}

public int getSecondaryCapSize() {
return mSecondaryCapSize;
}
}

并在标签下的res->values->attr.xml中添加以下行并构建它

<declare-styleable name="MyProgress">
<attr name="showProgressText" format="boolean" />
<attr name="progress" format="integer" />
<attr name="secondaryProgress" format="integer" />
<attr name="progressColor" format="color" />
<attr name="secondaryProgressColor" format="color" />
<attr name="backgroundColor" format="color" />
<attr name="primaryCapSize" format="integer" />
<attr name="secodaryCapSize" format="integer" />
<attr name="primaryCapVisibility" format="boolean" />
<attr name="secodaryCapVisibility" format="boolean" />
<attr name="strokeWidth" format="dimension" />
<attr name="textColor" format="color" />
</declare-styleable>

就是这样......并在您的布局中使用..

<Your_Package_Name.MyProgress
android:padding="20dp"
android:id="@+id/timer1"
app:strokeWidth="10dp"
app:progress="30"
app:secondaryProgress="50"
app:backgroundColor="@android:color/black"
app:progressColor="@android:color/holo_blue_bright"
app:secondaryProgressColor="@android:color/holo_blue_dark"
app:primaryCapSize="30"
app:secodaryCapSize="40"
app:primaryCapVisibility="true"
app:secodaryCapVisibility="true"
android:layout_width="200dp"
android:layout_height="200dp" />

您还可以使用 setMethods() 以编程方式更改所有属性... enter image description here

随便问什么..祝你好运

[2016 年 1 月 23 日更新]

最后我在 github 上上传了代码。你可以从这里引用 https://github.com/msquare097/MProgressBar

现在您可以通过在您的应用程序 build.gradle 文件中编写以下行来使用此 ProgressBar。 您不必复制以上代码。

compile 'com.msquare.widget.mprogressbar:mprogressbar:1.0.0'

关于环形进度条上的 Android 圆形边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31219455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com