gpt4 book ai didi

android - ProgressBar 可绘制对象如何工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:17 27 4
gpt4 key购买 nike

背景

我想制作一个确定的圆形进度条(意思是 android:indeterminate="false"),所以我在网上搜索并找到了 Romain Guy 的简短回答,here .

所以我抓取代码并在示例项目中使用它:

(部分)布局文件:

<ProgressBar
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@color/backColor"
android:indeterminate="false"
android:indeterminateOnly="false"
android:max="100"
android:progress="33"
android:progressDrawable="@drawable/progress" />

drawable/progress.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

<!-- <item android:drawable="@drawable/progress_circular_background"/> -->
<item>
<shape
android:innerRadiusRatio="3.4"
android:shape="ring"
android:thicknessRatio="6.0" >
<gradient
android:endColor="#ffffffff"
android:startColor="#ff000000"
android:type="sweep"
android:useLevel="true" />

</shape>
</item>

<item>
<rotate
android:drawable="@drawable/progress_particle"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
</item>

</layer-list>

屏幕截图(不完全是当前代码):

enter image description here

问题

它工作正常,但我不明白它是如何工作的。

进度条如何知道要在可绘制对象上准确更改什么,以及如何更改?

例如,它如何知道如何只从右边的 0 度取环形,而不从其他地方取?

是否可以自定义其工作方式?

最佳答案

ProgressBar 的工作原理是改变相关绘图的级别。在 doRefreshProgress() 中:

final int level = (int) (scale * MAX_LEVEL);
(progressDrawable != null ? progressDrawable : d).setLevel(level);

A Drawable's level基本上是一个整数,对于不同类型的 Drawable 子类可能具有不同的含义。

This allows a drawable to vary its imagery based on a continuous controller, for example to show progress or volume level.

Returns true if this change in level has caused the appearance of the Drawable to change (hence requiring an invalidate), otherwise returns false.

特别是,GradientDrawable(使用 useLevel="true",例如这个)使用级别值来了解应绘制可绘制对象的哪一部分。例如,对于从左到右的线性渐变,矩形计算如下:

final float level = st.mUseLevel ? (float) getLevel() / 10000.0f : 1.0f;    
x0 = r.left; y0 = r.top;
x1 = level * r.right; y1 = y0;

在像这样的渐变的情况下,级别决定了应绘制总 360 度角的哪一部分:

float sweep = st.mUseLevelForShape ? (360.0f * getLevel() / 10000.0f) : 360f;

简而言之,随着 setProgress() 方法的调用,此值会发生变化,环会逐渐填充。

至于 RotateDrawable,它使用完全相同的机制来围绕其旋转 progress_particle 位图(它只是一个带有白点的透明正方形,呈 90 度角)中心:

mState.mCurrentDegrees = mState.mFromDegrees +
(mState.mToDegrees - mState.mFromDegrees) * ((float) level / MAX_LEVEL);

最后,关于“它如何知道如何只从右边的 0 度取环形” 部分,这只是约定俗成的问题。环形 GradientDrawables 从右边开始。环形路径计算中的第一行是:

// inner top
ringPath.moveTo(x + radius, y);
// outer top
ringPath.lineTo(x + radius + thickness, y);

关于android - ProgressBar 可绘制对象如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23915561/

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