Android 如何设计具有圆角和倾斜进度的自定义进度条?

Android 如何设计具有圆角和倾斜进度的自定义进度条?,android,android-view,android-custom-view,android-progressbar,rounded-corners,Android,Android View,Android Custom View,Android Progressbar,Rounded Corners,这就是我希望实现的目标: 容器颜色、进度颜色、进度背景颜色和圆角半径以及厚度都应可编辑和修改 如何使用轻量级自定义UI元素实现这一点?经过几天的研究,我能够通过清晰清晰的UI以及所有上述要求和灵活性实现预期目标。可以实现上述用户界面,也可以实现以下参数: 1.进度色 2.进度背景色 3.容器颜色(容器的颜色由您设置,您可以设置圆形边缘的颜色以匹配容器颜色) 4.进度条的高度和宽度适合您的需要 以下是实现此功能的代码和步骤: I.将此代码放在values文件夹下的attrs.xml文件中 <

这就是我希望实现的目标:

容器颜色、进度颜色、进度背景颜色和圆角半径以及厚度都应可编辑和修改


如何使用轻量级自定义UI元素实现这一点?

经过几天的研究,我能够通过清晰清晰的UI以及所有上述要求和灵活性实现预期目标。可以实现上述用户界面,也可以实现以下参数: 1.进度色 2.进度背景色 3.容器颜色(容器的颜色由您设置,您可以设置圆形边缘的颜色以匹配容器颜色) 4.进度条的高度和宽度适合您的需要

以下是实现此功能的代码和步骤:

I.将此代码放在values文件夹下的attrs.xml文件中

<declare-styleable name="SlantingProgressBar">
    <attr name="slantingProgress" format="integer"/>
    <attr name="borderRadius" format="integer"/>
    <attr name="borderColor" format="integer"/>
    <attr name="slantingProgressColor" format="string"/>
    <attr name="progressBackgroundColor" format="string"/>
    <attr name="slantingProgressFullColor" format="string"/>

</declare-styleable>
三、 要在xml文件中使用布局,请执行以下操作:

<com.whatever.package.SlantingProgressbar
        android:id="@+id/progressbar_detail"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dimension1"
        android:layout_alignParentLeft="true"
        slanting_progress:borderColor="@color/darkgray"
        android:layout_below="@id/alphacon_detail"
        android:layout_marginBottom="@dimen/budget_list_item_paddingBottom"
        android:progress="50" />

我会在一段时间后分享这段代码,所以我可能遗漏了一两件事,我很确定你能解决这个问题,请随时纠正我

说明: 我们使用java中的'draw'方法来实现此功能。优点是,绘制UI元素为我们提供了一个清晰的UI,无论它有多大或多小。 可能有一些硬编码的值,所以在实现之前一定要编辑这些值


祝你好运,如果这篇文章对你有帮助,别忘了投票。谢谢!:)

我将在这里发布一个答案,展示您代码的一些改进

  • 应避免在
    绘制期间创建新对象
多次调用
draw
以重新绘制自定义元素,所有对
new Paint()
的调用都在创建需要新内存分配的新对象,它使垃圾收集器疯狂,使您的视图资源更加密集,可能会导致滚动元素(如
RecyclerView
)的延迟

或者,您应该将它们声明为
private Paint border
,然后声明为
private Paint triangle
,等等。然后,您应该使用单独的方法初始化所有绘制的值,并且仅当参数更改时。示例代码:

private boolean initPaint = false;
private void initPaintsIfNecessary(){
   if(!initPaint) return;
   initPaint = false;

   triangle = new Paint();
   triangle.set.... etc

   border = new Paint();
   border.set.... etc
}
然后在所有方法上调用
setRoundedBorderColor
setProgressColor
,等等
并在
draw
的开头调用
initpaintsifrequired()。这将避免所有额外的垃圾收集器工作,并允许应用程序的UI运行得更加顺畅

这还包括所有
Paint
内部
drawBorders
方法

  • 使用
    format=“color”而不是
    string`
调用
Color.parse(String)
是一个非常慢的调用,而且非常容易出错。或者,您应该选择正确的
颜色
元素,如下所示:

<attr name="slantingProgressColor" format="color"/>

这不仅是正确的方法,而且可以在编辑器上为您提供颜色预览,可以根据应用程序样式参数编制索引,避免对
parse

当然,你应该适当地调整你的方法。例如: setProgressColor(array.getColor(R.styleable.slangingProgressBar\u slangingProgressColor))

getColor
将返回一个整数,该整数可直接用于
paint.setColor(int)


我希望这些技巧能够帮助您(以及社区中的其他人)创建更好、更高效的
视图
元素。快乐编码

我知道这个老问题需要回答,但这个答案可能会有帮助。。 您可以使用drawArc方法来实现这一点

RectF oval = new RectF();
oval.set(left, top ,right, bottom);
canvas.drawArc(oval, 270, 360, false, paint);

我添加了一个新的答案,对代码的性能进行了一些改进。希望有帮助。你好,布狄乌斯,谢谢你的评论。我不知道Draw方法被调用了好几次。我们将很快进一步调查此事。我完全同意颜色资源字符串,在发布解决方案时有点懒得声明颜色资源字符串:P
RectF oval = new RectF();
oval.set(left, top ,right, bottom);
canvas.drawArc(oval, 270, 360, false, paint);