- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想制作一个确定的圆形进度条(意思是 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>
屏幕截图(不完全是当前代码):
它工作正常,但我不明白它是如何工作的。
进度条如何知道要在可绘制对象上准确更改什么,以及如何更改?
例如,它如何知道如何只从右边的 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/
我的应用程序中有一个 ProgressBar 小部件,无论我做什么,它总是显示为粗橙色(2.x 样式)而不是细蓝色(4.x 样式) . 项目构建目标设置为 Google API 4.0.3(API 级
private static ProgressDialog pDialog; pDialog = new ProgressDialog(activity); pDialog.setIndetermin
我试图让 TalkBack 阅读进度条上的进度,但运气不佳。关于如何获取该信息以便 TalkBack 可以说出来的任何想法。 谢谢 公共(public)类 MainActivity 扩展 Activi
进度条总是返回null public void calcola(View view) { final Dialog myDialog = new Dialog(this);
我正在尝试用选取框样式测试进度条,但没有成功 private void Form1_Load(object sender, EventArgs e) { Applica
我使用以下 Ruby 片段下载 a 8.9MB file . require 'open-uri' require 'net/http' require 'uri' def http_download
我为操作栏按钮尝试了两种不同的进度条样式,通过 refreshMenuItem.setActionView(R.layout.actionbar_indeterminate_progress); ac
每当我输入 fragment 时,我都会看到几秒钟的空白,然后 WebView 中的网页就会出现。 ProgressBar 好像没有显示。 这是我的 XML 文件,用于 WebView 和 Progr
我的包依赖于一个名为 progressbar 的包。有一个bug in progressbar 2.3导致Python>3.3安装失败,因此我安装了latest git repo from this
任何默认的 ProgressBar 都有一个 ClipDrawable 级别,例如,一个绿色的 Drawable 在我的设备上填充灰色背景,在其他设备上填充黄色。 我的问题:当进度小于最大值时,是否可
这是随意的原型(prototype)代码,因此我尝试了我认为应该有效的方法,如果没有,则在谷歌上搜索,然后在仔细阅读类似问题后在这里提问。 我的 Shell 中有以下标记看法:
要在执行查询时显示 ProgressBar,我使用以下代码: if not Query1.Prepared then Query1.Prepare; Query1.Open; ProgressBa
我有三个类,例如 View 、逻辑、 Controller 。 class View{ Progressbutton pb; void start animation(){
我正在用 C#/WPF(.Net 框架 4.0)编写一个应用程序。我遇到的一件事是如何在应用程序非常繁忙时更新控件(如果可能)。我想我只是在努力尝试我在网上找到的东西来让它工作(而且在极少数情况下它会
要在执行查询时显示 ProgressBar,我使用以下代码: if not Query1.Prepared then Query1.Prepare; Query1.Open; ProgressBa
已关闭。此问题不符合 Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 已关闭 3 年前。 奥 git _a
我创建了一个 ping 程序来 ping 5 服务器。如何在进度运行时让进度条运行。当 ping 完成时,进度条将为 100% private void btnGetstatusActionPer
我想在流程完成后在 PrimeFaces 上隐藏一个进度条。我认为没有必要在不工作时显示进度条。 html代码:
我想添加JProgressBar,它将在下载文件的程序中填充。 第三个问题是如何使进度条在 setValue 中添加正确的金额(例如:当它下载最后一个文件时,JPB 将完成)。 请注意,要下载的文件数
给定一个变量 N,反射(reflect)秒数,我想要一个 jQueryUI Progressbar顺利地从空更新到反射(reflect)该时间段内的完成。 换句话说,我想要一个显示进度条的functi
我是一名优秀的程序员,十分优秀!