我正在尝试在android中创建自定义进度条。我已经使用了以下xml文件(progress_bar_horizontal.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>
<corners android:radius="8dip" />
<stroke android:width="2dip" android:color="#FFFF"/>
<solid android:color="#FFFF"/>
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="8dip" />
<stroke android:width="2dip" android:color="#FFFF"/>
<solid android:color="#FF00"/>
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="8dip" />
<stroke android:width="2dip" android:color="#FFFF"/>
<solid android:color="#FF00"/>
</shape>
</clip>
</item>
</layer-list>
除了事实上我希望双方的进度条都取得进展之外,一切都很有效。上述代码使得进度条在左侧被舍入并且简单地在右侧切割(不是圆形)。这可能是因为剪辑标签。你能帮帮我吗?我应该改变什么才能在我的进度条中取得进展?
完整的布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/gradient_progress"
android:padding="10dip"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:id="@+id/progress_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF000000"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold"
android:text="Uploading"
/>
<TextView
android:id="@+id/progress_percent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF000000"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold"
android:text="55%"
android:paddingLeft="10dip"
/>
</LinearLayout>
<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_gravity="center"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:progressDrawable="@drawable/progress_bar_horizontal"
android:maxHeight="12dip"
android:minHeight="12dip"
android:max="100"
/>
</LinearLayout>
</LinearLayout>
以下是我努力的结果:link text
我希望红色的条纹在右侧也有圆角。 非常感谢您的评论。
答案 0 :(得分:26)
以下是时代的更新答案:
Android源代码使用Patch 9文件来实现效果: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/frameworks/base/core/res/res/drawable/progress_horizontal_holo_dark.xml/
从布局xml开始:
<ProgressBar
android:id="@+id/custom_progress_bar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:indeterminateOnly="false"
android:progressDrawable="@drawable/custom_progress_bar_horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:minHeight="13"
android:progress="33"
android:secondaryProgress="66" />
你可以将很多这个移动到一个样式xml,但这不是重点。我们真正关心的是android:progressDrawable="@drawable/custom_progress_bar_horizontal"
- 这将允许我们指定我们自己的自定义进度条:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background"
android:drawable="@android:drawable/custom_progress_bg" />
<item android:id="@android:id/secondaryProgress">
<scale android:scaleWidth="100%"
android:drawable="@android:drawable/custom_progress_secondary" />
</item>
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%"
android:drawable="@android:drawable/custom_progress_primary" />
</item>
</layer-list>
或者您不必使用Patch 9作为背景 - 例如,这里是一个带有1dp边框的简单白色背景:
<item android:id="@android:id/background">
<shape>
<corners android:radius="6.5dp" />
<solid android:color="@android:color/white" />
<stroke
android:width="1dp"
android:color="@android:color/darker_gray" />
</shape>
</item>
Android Asset Studio有一个很棒的工具来帮助您生成Patch 9文件: http://android-ui-utils.googlecode.com/hg/asset-studio/dist/nine-patches.html
在工具之前使用填充的主要xdpi png示例:
在工具之前使用填充的辅助xdpi png示例:
最终输出:
答案 1 :(得分:12)
只需将标签<clip>
更改为<scale>
,如下所示:
<scale android:scaleWidth="100%">
答案 2 :(得分:3)
据我所知,这是不可能的。因为内部ClipDrawable
(即剪辑标记)使用canvas.clipRect()
剪切给定的形状/可绘制。顺便说一句,您可以从here复制ClipDrawable
来源,并根据进度级别剪切特定路径。
答案 3 :(得分:1)
您可以使用材料组件库提供的 LinearProgressIndicator
和 app:trackCornerRadius
属性。
类似的东西:
<com.google.android.material.progressindicator.LinearProgressIndicator
android:indeterminate="true"
app:indicatorSize="xxdp"
app:trackCornerRadius="xdp"/>
注意:它至少需要版本 1.3.0-alpha04
。
答案 4 :(得分:0)
为了解决当进度非常低时结束图形重叠的问题,我已经为ProgressBar类编写了一个扩展,它为进度条添加了一个固定的起始偏移,否则正常运行
只需拨打&#39; setMaxWithPercentOffset()&#39;或者&#39; setMaxWithOffset()&#39;而不是&#39; setMax()&#39;将要添加的值作为起始偏移量传递到进度条。
如果有人在不需要开始偏移的情况下解决了这个问题,请告诉我!
/**
* This progress bar can be used when the progress bar end graphics are styled in some way.
* In this case, the progress bar must always have a small percentage of progress, otherwise
* the styled ends of the progress overlap each other.
*
*/
public class EndStyledProgressBar extends ProgressBar {
private static final int DEFAULT_START_OFFSET_PERCENT = 5;
private int mStartOffset;
private int mRealMax;
public EndStyledProgressBar(Context context) {
super(context);
commonConstructor();
}
public EndStyledProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
commonConstructor();
}
public EndStyledProgressBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
commonConstructor();
}
private void commonConstructor() {
mRealMax = super.getMax();
mStartOffset = 0;
setMaxWithPercentOffset(DEFAULT_START_OFFSET_PERCENT, mRealMax);
super.setProgress(super.getProgress() + mStartOffset);
super.setSecondaryProgress(super.getSecondaryProgress() + mStartOffset);
}
public void setProgress(int progress) {
super.setProgress(progress + mStartOffset);
}
public void setSecondaryProgress(int secondaryProgress) {
super.setSecondaryProgress(secondaryProgress + mStartOffset);
}
public int getProgress() {
int realProgress = super.getProgress();
return isIndeterminate() ? 0 : (realProgress - mStartOffset);
}
public int getSecondaryProgress() {
int realSecondaryProgress = super.getSecondaryProgress();
return isIndeterminate() ? 0 : (realSecondaryProgress - mStartOffset);
}
public int getMax() {
return mRealMax;
}
/**
* Don't call this, instead call setMaxWithPercentOffset() or setStartOffsetInPercent()
*
* @param max
*/
public void setMax(int max) {
super.setMax(max);
}
/**
* Sets a new max with a start offset (in percent) included.
*
* @param startOffsetInPercent start offset for the progress bar to avoid graphic errors.
*/
public void setMaxWithPercentOffset(int startOffsetInPercent, int max) {
mRealMax = max;
int startOffset = (mRealMax * startOffsetInPercent) / 100;
setMaxWithOffset(startOffset, max);
}
/**
* Sets a new max with a start offset included.
*
* @param startOffset start offset for the progress bar to avoid graphic errors.
*/
public void setMaxWithOffset(int startOffset, int max) {
mRealMax = max;
super.setMax(startOffset + max);
setStartOffset(startOffset);
super.setMax(startOffset + max);
}
/**
* Sets a new start offset different from the default of 5%
*
* @param startOffset start offset for the progress bar to avoid graphic errors.
*/
private void setStartOffset(int startOffset) {
int newStartOffset = startOffset;
// Ensure the start offset is not outside the range of the progress bar
if (newStartOffset < 0) newStartOffset = 0;
if (newStartOffset >= super.getMax()) newStartOffset = super.getMax();
// Apply the start offset difference
if (mStartOffset != newStartOffset) {
int diff = newStartOffset - mStartOffset;
super.setMax(super.getMax() + diff);
super.setProgress(super.getProgress() + diff);
super.setSecondaryProgress(super.getSecondaryProgress() + diff);
mStartOffset = newStartOffset;
}
}
}
答案 5 :(得分:0)
最终圆形双方进度条没有9补丁是:
SELECT ',' + NAME
FROM SampleMaster SM
INNER JOIN RequisitionSample RS ON RS.sampleid=SM.sampleId
WHERE
RS.ReqId=236
android:progressDrawable="@drawable/progress_horizontal_green"