进度条在Android的两侧圆angular

我想在android中创build一个自定义的进度条。 我已经使用下面的XML文件(progress_bar_horizo​​ntal.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> 

这是我努力的结果: 链接文本

我想红色的酒吧也有右边的圆边。 非常感谢您的评论。

Solutions Collecting From Web of "进度条在Android的两侧圆angular"

这是一个更新的时间答案:

Android源代码使用补丁9文件来达到这个效果: http : //grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/frameworks/base/core/ RES / RES /抽拉/ progress_horizo​​ntal_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> 

或者,您不必为背景使用补丁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有一个很棒的工具来帮助您生成补丁9文件: http : //android-ui-utils.googlecode.com/hg/asset-studio/dist/nine-patches.html

示例在工具之前使用填充的primary xdpi png: 主要进度条
在工具之前使用填充的辅助xdpi png示例: 次要进度栏

最后的输出: 自定义进度条

只需将标签<clip>更改为<scale>

 <scale android:scaleWidth="100%"> 

据我所知,这是不可能的。 因为内部ClipDrawable (即剪辑标记)使用ClipDrawable ()剪切给定的形状/绘制。 顺便说一句,你可以从这里复制ClipDrawable源,并根据进度级别剪辑特定的path。

为了解决当进度非常低时端点graphics重叠的问题,我写了一个ProgressBar类的扩展,它为进度条添加了一个固定的起始偏移量,而其他function正常。

只需调用“setMaxWithPercentOffset()”或“setMaxWithOffset()”,而不是将“setMax()”作为起始偏移量添加到进度条中。

如果有人已经解决了这个问题,而不需要开始抵消让我知道!

 /** * 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; } } } 

最后舍入无补丁进度条9-patch是: android:progressDrawable="@drawable/progress_horizontal_green"

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/progress"> <scale android:scaleWidth="100%"> <shape> <corners android:radius="5dip"/> <solid android:color="#33FF33"/> </shape> </scale> </item>