我正在尝试在我们正在处理的应用中创建自定义进度条,我需要的最后一块是进度指示器本身。相反,我想让那个条形圆形就像进度条本身的左边和右边一样,就像在第二个图像中一样(当然减去红色圆圈)。
这里是进度条的布局定义(为简洁起见省略了布局文件的其余部分):
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="fill_parent"
android:layout_height="60dp"
android:padding="3dp"
android:max="100"
android:progressDrawable="@drawable/progress_bar_states"
android:layout_marginTop="10dp"
style="?android:attr/progressBarStyleHorizontal"
android:indeterminateOnly="false"
android:layout_below="@id/textview2"
android:layout_alignLeft="@id/textview2"
/>
这里是progress_bar_states.xml文件:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<solid android:color="#20ffff00"/>
<corners android:radius="60dp"/>
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="#20ffffff"/>
<corners android:radius="60dp"/>
</shape>
</clip>
</item>
</layer-list>
我该怎么做?我没有看到任何选项允许我根本定义进度指示器。我应该以不同的方式做这件事吗?我在Android上仍然很新,所以任何指导都会受到赞赏。
@Ando - 您的解决方案非常接近我的需要。指标移动的开始是现在的问题,我猜测它是因为它不是像原始的那样的剪辑。当指示器开始,并且在开始时达到某一点时,它看起来像是&#34;挤压&#34;
直到它到达适当的点然后它看起来很好:
我们如何完成剪辑&#39;在这个解决方案的开始?
对于@bladefury - 正如您所看到的,与上图中的前沿相比,它确实看起来很平坦。
编辑:在我看了很长时间之后,我在https://github.com/akexorcist/Android-RoundCornerProgressBar/issues查看了一个新组件,它与此处的建议存在相同的问题。
答案 0 :(得分:27)
只需更改您的progress_bar_states.xml文件:如下例
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/background">
<shape>
<solid android:color="#20ffff00" />
<corners android:radius="20dp" />
</shape>
</item>
<item android:id="@android:id/progress">
<!-- <clip> -->
<!-- <shape> -->
<!-- <solid android:color="@android:color/black" /> -->
<!-- <corners -->
<!-- android:bottomRightRadius="30dp" -->
<!-- android:radius="60dp" -->
<!-- android:topRightRadius="30dp" /> -->
<!-- </shape> -->
<!-- </clip> -->
<scale
android:drawable="@drawable/custom_progress_primary"
android:scaleWidth="98%" /><!-- change here -->
</item>
这里是custom_progress_primary.xml文件:如下所示
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<corners
android:radius="20dp"
android:topLeftRadius="20dp"
android:topRightRadius="20dp" />
<solid android:color="@android:color/white" />
<stroke
android:width="1dp"
android:color="@android:color/darker_gray" />
</shape>
答案 1 :(得分:4)
一个可能更实用的选项是实现自定义进度条视图。
public class CustomProgressBar extends View
{
// % value of the progressbar.
int progressBarValue = 0;
public CustomProgressBar(Context context)
{
super(context);
}
public CustomProgressBar(Context context, AttributeSet attrs)
{
super(context, attrs);
progressBarValue = attrs.getAttributeIntValue(null, "progressBarValue", 0);
}
public void setValue(int value)
{
progressBarValue = value;
invalidate();
}
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
float cornerRadius = 30.0f;
// Draw the background of the bar.
Paint backgroundPaint = new Paint();
backgroundPaint.setColor(Color.LTGRAY);
backgroundPaint.setStyle(Paint.Style.FILL);
backgroundPaint.setAntiAlias(true);
RectF backgroundRect = new RectF(0, 0, canvas.getWidth(), canvas.getHeight());
canvas.drawRoundRect(backgroundRect, cornerRadius, cornerRadius, backgroundPaint);
// Draw the progress bar.
Paint barPaint = new Paint();
barPaint.setColor(Color.GREEN);
barPaint.setStyle(Paint.Style.FILL);
barPaint.setAntiAlias(true);
float progress = (backgroundRect.width() / 100) * progressBarValue;
RectF barRect = new RectF(0, 0, progress, canvas.getClipBounds().bottom);
canvas.drawRoundRect(barRect, cornerRadius, cornerRadius, barPaint);
// Draw progress text in the middle.
Paint textPaint = new Paint();
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(34);
String text = progressBarValue + "%";
Rect textBounds = new Rect();
textPaint.getTextBounds(text, 0, text.length(), textBounds);
canvas.drawText(text,
backgroundRect.centerX() - (textBounds.width() / 2),
backgroundRect.centerY() + (textBounds.height() / 2),
textPaint);
}
}
然后在你的布局中:
<view.CustomProgressBar
android:layout_height="30dp"
android:layout_width="match_parent"
progressBarValue="66"/>
产生结果:
答案 2 :(得分:0)
ProgressBar
使用ClipDrawable
,其中的剪辑可用矩形绘制。所以,你可以设置一个drawable,它将圆角矩形剪辑到进度条,这里的方法如下:
首先,删除进度条drawable中的<clip>
标记:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<solid android:color="#20ffff00"/>
<corners android:radius="60dp"/>
</shape>
</item>
<item android:id="@android:id/progress">
<shape>
<solid android:color="#20ffffff"/>
<corners android:radius="60dp"/>
</shape>
</item>
然后,像这样扩展进度条:
public class RoundIndicatorProgressBar extends ProgressBar {
private static final float CORNER_RADIUS_DP = 60.0f;
public RoundIndicatorProgressBar(Context context) {
this(context, null);
}
public RoundIndicatorProgressBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RoundIndicatorProgressBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void setProgressDrawable(Drawable d) {
super.setProgressDrawable(tileify(d, false));
}
private Drawable tileify(Drawable drawable, boolean clip) {
if (drawable instanceof LayerDrawable) {
LayerDrawable background = (LayerDrawable) drawable;
final int N = background.getNumberOfLayers();
Drawable[] outDrawables = new Drawable[N];
for (int i = 0; i < N; i++) {
int id = background.getId(i);
outDrawables[i] = tileify(background.getDrawable(i),
(id == android.R.id.progress || id == android.R.id.secondaryProgress));
}
LayerDrawable newBg = new LayerDrawable(outDrawables);
for (int i = 0; i < N; i++) {
newBg.setId(i, background.getId(i));
}
return newBg;
} else {
if (clip) {
return new RoundClipDrawable(drawable, dp2px(getContext(), CORNER_RADIUS_DP));
}
}
return drawable;
}
public static float dp2px(Context context, float dp) {
final float scale = context.getResources().getDisplayMetrics().density;
return dp * scale;
}
}
,此处为RoundClipDrawable
,已从ClipDrawable
修改:
答案 3 :(得分:0)
你也可以使用搜索栏
点击这里的帖子: https://stackoverflow.com/a/41206481/6033946
试试这个,你可以通过修改拇指的颜色,宽度和高度以及xml中的搜索条来做你想做的事。
答案 4 :(得分:0)
您可以将此库用于圆角进度条
<com.akexorcist.roundcornerprogressbar.RoundCornerProgressBar
android:layout_width="dimension"
android:layout_height="dimension"
app:rcProgress="float"
app:rcSecondaryProgress="float"
app:rcMax="float"
app:rcRadius="dimension"
app:rcBackgroundPadding="dimension"
app:rcReverse="boolean"
app:rcProgressColor="color"
app:rcSecondaryProgressColor="color"
app:rcBackgroundColor="color" />
摇篮
compile 'com.akexorcist:RoundCornerProgressBar:2.0.3'
https://github.com/akexorcist/Android-RoundCornerProgressBar
答案 5 :(得分:-1)
我们如何完成剪辑&#39;在这个解决方案的开始?
您需要的是限制最小进度值,例如:
final int minProgress = pb.getMax() * {20dp} / pb.getWidth();
progress = Math.max(minProgress, progress);
pb.setProgress(progress);
使用上面的代码来处理您的进度值是否正常。它不是一个可绘制的bug,而是一个正确的拉伸效果。