как настроить индикатор выполнения в android

<p>я работаю над приложением, в котором я хочу показать <code>progressbar</code>, но я хочу заменить android <code>progressbar</code> по умолчанию.</p><p>итак, как я могу настроить <code>progressbar</code>?</p><p>нужна ли для этого графика и анимация?</p><p>я прочитал следующий пост, но не смог заставить его работать:</p><p> <a href="https://stackoverflow.com/questions/11322740/custom-progress-bar-android">пользовательский индикатор выполнения android</a> </p>

<p>настройка <code>progressbar</code> требует определения атрибута или свойств для фона и хода выполнения вашего индикатора выполнения.</p><p>создайте файл xml с именем <code>customprogressbar.xml</code> в папке <code>res->drawable</code>:</p><p><strong> custom\_progressbar.xml </strong></p><pre><code><layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- define the background properties like color etc --> <item android:id="@android:id/background"> <shape> <gradient android:startcolor="#000001" android:centercolor="#0b131e" android:centery="1.0" android:endcolor="#0d1522" android:angle="270" /> </shape> </item> <!-- define the progress properties like start color, end color etc --> <item android:id="@android:id/progress"> <clip> <shape> <gradient android:startcolor="#007a00" android:centercolor="#007a00" android:centery="1.0" android:endcolor="#06101d" android:angle="270" /> </shape> </clip> </item> </layer-list> </code></pre><p>теперь вам нужно установить свойство <code>progressdrawable</code> в <code>customprogressbar.xml</code> (drawable)</p><p>вы можете сделать это в файле xml или в activity (во время выполнения).</p><p>сделайте следующее в своем xml:</p><pre><code><progressbar android:id="@+id/progressbar1" style="?android:attr/progressbarstylehorizontal" android:progressdrawable="@drawable/custom\_progressbar" android:layout\_width="wrap\_content" android:layout\_height="wrap\_content" /> </code></pre><p><strong> во время выполнения сделайте следующее </strong></p><pre><code>// get the drawable custom\_progressbar drawable draw=res.getdrawable(r.drawable.custom\_progressbar); // set the drawable as progress drawable progressbar.setprogressdrawable(draw); </code></pre><p>правка: исправленный макет xml</p>

<p>в вашем xml</p><pre><code><progressbar android:id="@+id/progressbar1" android:layout\_width="fill\_parent" android:layout\_height="wrap\_content" style="@style/customprogressbar" android:layout\_margin="5dip" /> </code></pre><p>и в <code>res/values/styles.xml</code>:</p><pre><code><resources> <style name="customprogressbar" parent="android:widget.progressbar.horizontal"> <item name="android:indeterminateonly">false</item> <item name="android:progressdrawable">@drawable/custom\_progress\_bar\_horizontal</item> <item name="android:minheight">10dip</item> <item name="android:maxheight">20dip</item> </style> <style name="apptheme" parent="android:theme.light" /> </resources> </code></pre><p>и <code>custom\_progress\_bar\_horizontal</code> - это xml, хранящийся в папке drawable, который определяет ваш пользовательский индикатор выполнения. для более подробной информации смотрите этот <a href="http://custom-android-dn.blogspot.com/2013/01/how-to-create-custom-progress-bar-and.html">блог</a> .</p><p>я надеюсь, что это поможет вам.</p>

<p>в случае сложных <code>progressbar</code>, как это,</p><p><img src="https://i.stack.imgur.com/gkval.png" alt="enter image description here"></p><p>используйте <code>clipdrawable</code>. </p><blockquote> <p>примечание: я не использовал <code>progressbar</code> здесь в этом примере. я достиг это с помощью <a href="http://developer.android.com/reference/android/graphics/drawable/clipdrawable.html">clipdrawable</a> путем отсечения изображения с <code>animation</code>.</p> </blockquote><p><code>drawable</code>, которая обрезает другую <code>drawable</code> на основе текущего значения уровня этого <code>drawable</code>. вы можете контролировать, насколько дочерний элемент <code>drawable</code> будет обрезан по ширине и высоте в зависимости от уровня, а также от силы тяжести, чтобы контролировать, где он находится в общем контейнере. <code>most often used to implement things like progress bars</code>, увеличив уровень рисования с помощью <code>setlevel()</code>.</p><blockquote> <p>примечание. drawable полностью обрезается и не отображается, когда уровень равен 0 и полностью раскрывается, когда уровень составляет 10000.</p> </blockquote><p>я использовал эти два изображения, чтобы сделать это <code>customprogressbar</code>.</p><p><em>scall.png</em></p><p><img src="https://i.stack.imgur.com/5o8pi.png" alt="scall.png"></p><p><em>ballon\_progress.png</em></p><p><img src="https://i.stack.imgur.com/uq1x9.png" alt="ballon\_progress.png"></p><p><em>mainactivity.java</em></p><pre><code>public class mainactivity extends actionbaractivity { private edittext etpercent; private clipdrawable mimagedrawable; // a field in your class private int mlevel = 0; private int fromlevel = 0; private int tolevel = 0; public static final int max\_level = 10000; public static final int level\_diff = 100; public static final int delay = 30; private handler muphandler = new handler(); private runnable animateupimage = new runnable() { @override public void run() { dotheupanimation(fromlevel, tolevel); } }; private handler mdownhandler = new handler(); private runnable animatedownimage = new runnable() { @override public void run() { dothedownanimation(fromlevel, tolevel); } }; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity\_main); etpercent = (edittext) findviewbyid(r.id.etpercent); imageview img = (imageview) findviewbyid(r.id.imageview1); mimagedrawable = (clipdrawable) img.getdrawable(); mimagedrawable.setlevel(0); } private void dotheupanimation(int fromlevel, int tolevel) { mlevel += level\_diff; mimagedrawable.setlevel(mlevel); if (mlevel <= tolevel) { muphandler.postdelayed(animateupimage, delay); } else { muphandler.removecallbacks(animateupimage); mainactivity.this.fromlevel = tolevel; } } private void dothedownanimation(int fromlevel, int tolevel) { mlevel -= level\_diff; mimagedrawable.setlevel(mlevel); if (mlevel >= tolevel) { mdownhandler.postdelayed(animatedownimage, delay); } else { mdownhandler.removecallbacks(animatedownimage); mainactivity.this.fromlevel = tolevel; } } public void onclickok(view v) { int temp\_level = ((integer.parseint(etpercent.gettext().tostring())) * max\_level) / 100; if (tolevel == temp\_level || temp\_level > max\_level) { return; } tolevel = (temp\_level <= max\_level) ? temp\_level : tolevel; if (tolevel > fromlevel) { // cancel previous process first mdownhandler.removecallbacks(animatedownimage); mainactivity.this.fromlevel = tolevel; muphandler.post(animateupimage); } else { // cancel previous process first muphandler.removecallbacks(animateupimage); mainactivity.this.fromlevel = tolevel; mdownhandler.post(animatedownimage); } } } </code></pre><p><em>activity\_main.xml</em></p><pre><code><linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout\_width="match\_parent" android:layout\_height="match\_parent" android:paddingleft="16dp" android:paddingright="16dp" android:paddingtop="16dp" android:paddingbottom="16dp" android:orientation="vertical" tools:context=".mainactivity"> <linearlayout android:layout\_width="match\_parent" android:layout\_height="wrap\_content" android:orientation="horizontal"> <edittext android:id="@+id/etpercent" android:layout\_width="0dp" android:layout\_height="wrap\_content" android:layout\_weight="1" android:inputtype="number" android:maxlength="3" /> <button android:layout\_width="wrap\_content" android:layout\_height="wrap\_content" android:text="ok" android:onclick="onclickok" /> </linearlayout> <framelayout android:layout\_width="wrap\_content" android:layout\_height="wrap\_content" android:layout\_gravity="center"> <imageview android:id="@+id/imageview2" android:layout\_width="match\_parent" android:layout\_height="match\_parent" android:src="@drawable/scall" /> <imageview android:id="@+id/imageview1" android:layout\_width="wrap\_content" android:layout\_height="wrap\_content" android:src="@drawable/clip\_source" /> </framelayout> </code></pre><p></p><p><em>clip\_source.xml</em></p><pre><code><?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android.com/apk/res/android" android:cliporientation="vertical" android:drawable="@drawable/ballon\_progress" android:gravity="bottom" /> </code></pre><p>в случае сложной <code>horizontalprogressbar</code> просто измените <code>cliporientation</code> в <em>clip\_source.xml</em> следующим образом:</p><pre><code>android:cliporientation="horizontal" </code></pre><p>вы можете скачать полную демоверсию из <a href="https://github.com/jaydipzala/customprogressbar">здесь</a> .</p>

<p><strong> для настройки цвета индикатора выполнения, а именно в случае типа счетчика, требуется файл xml и коды инициализации в соответствующих файлах java. </strong></p><p>создайте файл xml и назовите его как progressbar.xml</p><pre><code><?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout\_width="wrap\_content" android:layout\_height="wrap\_content" android:gravity="center" tools:context=".radio\_activity" > <linearlayout android:id="@+id/progressbar" android:layout\_width="wrap\_content" android:layout\_height="wrap\_content" > <progressbar android:id="@+id/spinner" android:layout\_width="wrap\_content" android:layout\_height="wrap\_content" > </progressbar> </linearlayout> </linearlayout> </code></pre><p>используйте следующий код, чтобы получить спиннер в разных ожидаемых цветах. здесь мы используем шестнадцатеричный код для отображения блесны в синем цвете.</p><pre><code>progressbar spinner = (progressbar) progrees.findviewbyid(r.id.spinner); spinner.getindeterminatedrawable().setcolorfilter(color.parsecolor("#80daeb"), android.graphics.porterduff.mode.multiply); </code></pre>

<p>существует два типа индикаторов выполнения, называемых индикатором выполнения (фиксированная продолжительность) и индикатором неопределенности (неизвестная продолжительность). </p><p>drawables для обоих типов индикатора выполнения можно настроить, определив drawable как ресурс xml. вы можете найти больше информации о стилях и настройках индикатора выполнения на <a href="http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples">http://www.zoftino.com/android-progressbar-and-custom-progressbar-examples</a> .</p><p><strong>настройка фиксированного или горизонтального индикатора выполнения:</strong></p><p>ниже xml - ресурс для рисования для горизонтальной настройки индикатора выполнения.</p><pre><code> <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background" android:gravity="center\_vertical|fill\_horizontal"> <shape android:shape="rectangle" android:tint="?attr/colorcontrolnormal"> <corners android:radius="8dp"/> <size android:height="20dp" /> <solid android:color="#90caf9" /> </shape> </item> <item android:id="@android:id/progress" android:gravity="center\_vertical|fill\_horizontal"> <scale android:scalewidth="100%"> <shape android:shape="rectangle" android:tint="?attr/colorcontrolactivated"> <corners android:radius="8dp"/> <size android:height="20dp" /> <solid android:color="#b9f6ca" /> </shape> </scale> </item> </layer-list> </code></pre><p><strong>настройка неопределенного индикатора выполнения</strong></p><p>ниже xml - это ресурс для рисования для настройки круговой индикации выполнения. </p><pre><code><?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/progress" android:top="16dp" android:bottom="16dp"> <rotate android:fromdegrees="45" android:pivotx="50%" android:pivoty="50%" android:todegrees="315"> <shape android:shape="rectangle"> <size android:width="80dp" android:height="80dp" /> <stroke android:width="6dp" android:color="#b71c1c" /> </shape> </rotate> </item> </layer-list> </code></pre>

<p>создание пользовательских progressbar, как hotstar.</p><ol> <li>добавьте индикатор выполнения в файл макета и установите indeterminatedrawable с помощью файла рисования.</li> </ol><p>activity\_main.xml</p><pre><code><progressbar style="?android:attr/progressbarstylelarge" android:layout\_width="wrap\_content" android:layout\_height="wrap\_content" android:layout\_centervertical="true" android:layout\_centerhorizontal="true" android:id="@+id/player\_progressbar" android:indeterminatedrawable="@drawable/custom\_progress\_bar" /> </code></pre><ol start="2"> <li>создать новый xml-файл в res\drawable</li> </ol><p>custom\_progress\_bar.xml</p><pre><code><?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:fromdegrees="0" android:pivotx="50%" android:pivoty="50%" android:todegrees="1080" > <shape android:innerradius="35dp" android:shape="ring" android:thickness="3dp" android:uselevel="false" > <size android:height="80dp" android:width="80dp" /> <gradient android:centercolor="#80b7b4b2" android:centery="0.5" android:endcolor="#f4eef0" android:startcolor="#00938c87" android:type="sweep" android:uselevel="false" /> </shape> </rotate> </code></pre>

<p>самый простой способ создать настройку индикатора выполнения в android:</p><ol> <li><p>инициализировать и показать диалог:</p> <pre><code>myprogressdialog progressdialog = new myprogressdialog(getactivity()); progressdialog.show(); </code></pre></li> <li><p>создать метод:</p> <pre><code>public class myprogressdialog extends alertdialog { public myprogressdialog(context context) { super(context); getwindow().setbackgrounddrawable(new colordrawable(android.graphics.color.transparent)); } @override public void show() { super.show(); setcontentview(r.layout.dialog\_progress); } } </code></pre></li> <li><p>создать макет xml:</p> <pre><code><relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout\_width="match\_parent" android:layout\_height="match\_parent" android:background="@android:color/transparent" android:clickable="true"> <relativelayout android:layout\_width="wrap\_content" android:layout\_height="wrap\_content" android:layout\_centerinparent="true"> <progressbar android:id="@+id/progressbarr" android:layout\_width="@dimen/eightfive" android:layout\_height="@dimen/eightfive" android:layout\_centerinparent="true" android:indeterminatedrawable="@drawable/progresscustombg" /> <textview android:layout\_width="wrap\_content" android:layout\_height="wrap\_content" android:layout\_centerhorizontal="true" android:layout\_below="@+id/progressbarr" android:layout\_margintop="@dimen/\_3sdp" android:textcolor="@color/white" android:text="please wait"/> </relativelayout> </relativelayout> </code></pre></li> <li><p>создайте фигуру progresscustombg.xml и поместите res/drawable: </p> <pre><code><?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromdegrees="0" android:pivotx="50%" android:pivoty="50%" android:todegrees="360" > <shape android:innerradiusratio="3" android:shape="ring" android:thicknessratio="20" android:uselevel="false" > <size android:height="@dimen/eightfive" android:width="@dimen/eightfive" /> <gradient android:centery="0.50" android:endcolor="@color/color\_green\_icash" android:startcolor="#ffffff" android:type="sweep" android:uselevel="false" /> </shape> </rotate> </code></pre></li> </ol>

<p>для использования нестандартного рисования:</p><pre><code><?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromdegrees="0" android:todegrees="360" android:drawable="@drawable/my\_drawable" android:pivotx="50%" android:pivoty="50%" /> </code></pre><p>(добавить под res/drawable <code>progress.xml</code>). <code>my\_drawable</code> может быть xml, png</p><p>тогда в вашем макете используйте</p><pre><code><progressbar android:id="@+id/progressbar" android:indeterminatedrawable="@drawable/progress\_circle" ... /> </code></pre>

<p>если вы хотите сделать это в коде, вот пример:</p><pre><code>pd = new progressdialog(mainactivity.this); pd.setprogressstyle(progressdialog.style\_spinner); pd.getwindow().setbackgrounddrawable(new colordrawable(color.transparent)); pd.getwindow().setgravity(gravity.center\_horizontal|gravity.center\_vertical); textview tv = new textview(this); tv.settextcolor(color.white); tv.settextsize(20); tv.settext("waiting..."); pd.setcustomtitle(tv); pd.setindeterminate(true); pd.show(); </code></pre><p>использование textview дает вам возможность изменить цвет, размер и шрифт вашего текста. в противном случае вы можете просто вызвать setmessage (), как обычно.</p>