uso studio progressbar progreso poner mostrar iniciar barra android progress-bar

studio - uso de progressbar en android



¿Cómo crear una barra de progreso circular en Android que gira sobre ella? (10)

@Pedram, su solución anterior también funciona bien en lollipop (y mejor que la nueva, ya que se puede usar en cualquier lugar, incluso en vistas remotas) simplemente cambie su código circular_progress_bar.xml a este:

<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="270" android:toDegrees="270"> <shape android:innerRadiusRatio="2.5" android:shape="ring" android:thickness="1dp" android:useLevel="true"> <!-- Just add this line --> <gradient android:angle="0" android:endColor="#007DD6" android:startColor="#007DD6" android:type="sweep" android:useLevel="false" /> </shape> </rotate>

Estoy tratando de crear una barra de progreso redondeada. Esto es lo que quiero lograr

Hay un anillo de fondo de color gris. Encima de él, aparece una barra de progreso de color azul que se mueve en una trayectoria circular de 0 a 360 en 60 o cualquier cantidad de segundos.

Aquí está mi código de ejemplo.

<ProgressBar android:id="@+id/ProgressBar" android:layout_width="match_parent" android:layout_height="match_parent" style="?android:attr/progressBarStyleLarge" android:indeterminateDrawable="@drawable/progressBarBG" android:progress="50" />

Para hacer esto, en el dibujable "progressBarBG", estoy creando una lista de capas y dentro de esa lista de capas estoy dando dos elementos como se muestra.

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background"> <shape android:shape="ring" android:innerRadius="64dp" android:thickness="8dp" android:useLevel="false"> <solid android:color="@color/grey" /> </shape> </item> <item android:id="@android:id/progress"> <clip> <shape android:shape="ring" android:innerRadius="64dp" android:thickness="8dp" android:useLevel="false"> <solid android:color="@color/blue" /> </shape> </clip> </item>

Ahora, el primer anillo gris se genera bien. Sin embargo, el anillo azul comienza desde la izquierda del dibujable y va hacia la derecha al igual que funciona una barra de progreso lineal. Así es como se muestra al 50% de progreso con la flecha de color rojo que muestra la dirección.

Quiero mover la barra de progreso azul en una ruta circular como se esperaba.


Aquí está mi dos solución.

Respuesta corta:

En lugar de crear una layer-list , la separé en dos archivos. Uno para ProgressBar y otro para su fondo.

Este es el archivo ProgressDrawable (carpeta @drawable): circular_progress_bar.xml

<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="270" android:toDegrees="270"> <shape android:innerRadiusRatio="2.5" android:shape="ring" android:thickness="1dp" android:useLevel="true"><!-- this line fixes the issue for lollipop api 21 --> <gradient android:angle="0" android:endColor="#007DD6" android:startColor="#007DD6" android:type="sweep" android:useLevel="false" /> </shape> </rotate>

Y esto es por su background (carpeta @drawable): circle_shape.xml

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="ring" android:innerRadiusRatio="2.5" android:thickness="1dp" android:useLevel="false"> <solid android:color="#CCC" /> </shape>

Y al final, dentro del diseño que estás trabajando:

<ProgressBar android:id="@+id/progressBar" android:layout_width="200dp" android:layout_height="200dp" android:indeterminate="false" android:progressDrawable="@drawable/circular_progress_bar" android:background="@drawable/circle_shape" style="?android:attr/progressBarStyleHorizontal" android:max="100" android:progress="65" />

Este es el resultado:

Respuesta larga:

Una subclase de la clase View, una vista personalizada

Aquí está el proyecto completo en github


Cambio

android:useLevel="false"

a

android:useLevel="true"

para el segundo juego con id="@android:id/progress

espero que funcione


He escrito un ejemplo detallado sobre la barra de progreso circular en Android aquí en mi blog demonuts.com . También puede utilizar el código fuente completo y la explicación allí.

Así es como hice la barra de progreso circular con porcentaje dentro del círculo en código puro sin ninguna biblioteca.

primero crea un archivo dibujable llamado circular.xml

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/secondaryProgress"> <shape android:innerRadiusRatio="6" android:shape="ring" android:thicknessRatio="20.0" android:useLevel="true"> <gradient android:centerColor="#999999" android:endColor="#999999" android:startColor="#999999" android:type="sweep" /> </shape> </item> <item android:id="@android:id/progress"> <rotate android:fromDegrees="270" android:pivotX="50%" android:pivotY="50%" android:toDegrees="270"> <shape android:innerRadiusRatio="6" android:shape="ring" android:thicknessRatio="20.0" android:useLevel="true"> <rotate android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="360" /> <gradient android:centerColor="#00FF00" android:endColor="#00FF00" android:startColor="#00FF00" android:type="sweep" /> </shape> </rotate> </item> </layer-list>

Ahora en su activity_main.xml agregue lo siguiente:

<?xml version="1.0" encoding="utf-8"?> <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="@color/dialog" tools:context="com.example.parsaniahardik.progressanimation.MainActivity"> <ProgressBar android:id="@+id/circularProgressbar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="250dp" android:layout_height="250dp" android:indeterminate="false" android:max="100" android:progress="50" android:layout_centerInParent="true" android:progressDrawable="@drawable/circular" android:secondaryProgress="100" /> <ImageView android:layout_width="90dp" android:layout_height="90dp" android:background="@drawable/whitecircle" android:layout_centerInParent="true"/> <TextView android:id="@+id/tv" android:layout_width="250dp" android:layout_height="250dp" android:gravity="center" android:text="25%" android:layout_centerInParent="true" android:textColor="@color/colorPrimaryDark" android:textSize="20sp" /> </RelativeLayout>

En activity_main.xml , he usado una imagen circular con fondo blanco para mostrar el fondo blanco en torno al porcentaje. Aquí está la imagen:

Puede cambiar el color de esta imagen para establecer el color personalizado alrededor del texto porcentual.

Ahora, finalmente, agregue el siguiente código a MainActivity.java :

import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.animation.DecelerateInterpolator; import android.widget.ProgressBar; import android.widget.TextView; public class MainActivity extends AppCompatActivity { int pStatus = 0; private Handler handler = new Handler(); TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Resources res = getResources(); Drawable drawable = res.getDrawable(R.drawable.circular); final ProgressBar mProgress = (ProgressBar) findViewById(R.id.circularProgressbar); mProgress.setProgress(0); // Main Progress mProgress.setSecondaryProgress(100); // Secondary Progress mProgress.setMax(100); // Maximum Progress mProgress.setProgressDrawable(drawable); /* ObjectAnimator animation = ObjectAnimator.ofInt(mProgress, "progress", 0, 100); animation.setDuration(50000); animation.setInterpolator(new DecelerateInterpolator()); animation.start();*/ tv = (TextView) findViewById(R.id.tv); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (pStatus < 100) { pStatus += 1; handler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub mProgress.setProgress(pStatus); tv.setText(pStatus + "%"); } }); try { // Sleep for 200 milliseconds. // Just to display the progress slowly Thread.sleep(8); //thread will take approx 1.5 seconds to finish } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }

Si quiere hacer una barra de progreso horizontal, siga este enlace, tiene muchos ejemplos valiosos con el código fuente:
http://www.skholingua.com/android-basic/user-interface/form-widgets/progressbar


Lo he hecho de manera fácil:

Por favor, compruebe la captura de pantalla para el mismo.

CustomProgressBarActivity.java :

public class CustomProgressBarActivity extends AppCompatActivity { private TextView txtProgress; private ProgressBar progressBar; private int pStatus = 0; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_progressbar); txtProgress = (TextView) findViewById(R.id.txtProgress); progressBar = (ProgressBar) findViewById(R.id.progressBar); new Thread(new Runnable() { @Override public void run() { while (pStatus <= 100) { handler.post(new Runnable() { @Override public void run() { progressBar.setProgress(pStatus); txtProgress.setText(pStatus + " %"); } }); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } pStatus++; } } }).start(); } }

activity_custom_progressbar.xml :

<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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.skholingua.android.custom_progressbar_circular.MainActivity" > <RelativeLayout android:layout_width="wrap_content" android:layout_centerInParent="true" android:layout_height="wrap_content"> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="250dp" android:layout_height="250dp" android:layout_centerInParent="true" android:indeterminate="false" android:max="100" android:progress="0" android:progressDrawable="@drawable/custom_progressbar_drawable" android:secondaryProgress="0" /> <TextView android:id="@+id/txtProgress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/progressBar" android:layout_centerInParent="true" android:textAppearance="?android:attr/textAppearanceSmall" /> </RelativeLayout> </RelativeLayout>

custom_progressbar_drawable.xml :

<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="-90" android:pivotX="50%" android:pivotY="50%" android:toDegrees="270" > <shape android:shape="ring" android:useLevel="false" > <gradient android:centerY="0.5" android:endColor="#FA5858" android:startColor="#0099CC" android:type="sweep" android:useLevel="false" /> </shape> </rotate>

Espero que esto te ayudará.


Realicé una biblioteca de código abierto en GitHub CircularProgressBar que hace exactamente lo que quiere de la manera más simple posible:

USO

Para crear una ProgressBar circular, agregue CircularProgressBar en su diseño XML y agregue la biblioteca CircularProgressBar en su proyector o también puede obtenerla a través de Gradle:

compile ''com.mikhaellopez:circularprogressbar:1.0.0''

XML

<com.mikhaellopez.circularprogressbar.CircularProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" app:background_progressbar_color="#FFCDD2" app:background_progressbar_width="5dp" app:progressbar_color="#F44336" app:progressbar_width="10dp" />

Debe usar las siguientes propiedades en su XML para cambiar su CircularProgressBar.

Propiedades:

  • app:progress (entero) >> predeterminado 0
  • app:progressbar_color (color) >> predeterminado NEGRO
  • app:background_progressbar_color (color) >> predeterminado GREY
  • app:progressbar_width (dimension) >> predeterminado 7dp
  • app:background_progressbar_width (dimension) >> predeterminado 3dp

JAVA

CircularProgressBar circularProgressBar = (CircularProgressBar)findViewById(R.id.yourCircularProgressbar); circularProgressBar.setColor(ContextCompat.getColor(this, R.color.progressBarColor)); circularProgressBar.setBackgroundColor(ContextCompat.getColor(this, R.color.backgroundProgressBarColor)); circularProgressBar.setProgressBarWidth(getResources().getDimension(R.dimen.progressBarWidth)); circularProgressBar.setBackgroundProgressBarWidth(getResources().getDimension(R.dimen.backgroundProgressBarWidth)); int animationDuration = 2500; // 2500ms = 2,5s circularProgressBar.setProgressWithAnimation(65, animationDuration); // Default duration = 1500ms

Bifurque o descargue esta biblioteca aquí >> CircularProgressBar


Soy nuevo, así que no puedo comentar, pero pensé en compartir la corrección perezosa. También uso el enfoque original de Pedram y me encontré con el mismo problema de Lollipop. Pero alanv en otra publicación tenía una solución de una línea. Es una especie de error o descuido en API21. Literalmente solo agrega android:useLevel="true" para tu círculo de progreso xml. El nuevo enfoque de Pedram sigue siendo la solución adecuada, pero pensé que también compartiría la corrección perezosa.


pruebe este método para crear un mapa de bits y configurarlo para la vista de imagen.

private void circularImageBar(ImageView iv2, int i) { Bitmap b = Bitmap.createBitmap(300, 300,Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(b); Paint paint = new Paint(); paint.setColor(Color.parseColor("#c4c4c4")); paint.setStrokeWidth(10); paint.setStyle(Paint.Style.STROKE); canvas.drawCircle(150, 150, 140, paint); paint.setColor(Color.parseColor("#FFDB4C")); paint.setStrokeWidth(10); paint.setStyle(Paint.Style.FILL); final RectF oval = new RectF(); paint.setStyle(Paint.Style.STROKE); oval.set(10,10,290,290); canvas.drawArc(oval, 270, ((i*360)/100), false, paint); paint.setStrokeWidth(0); paint.setTextAlign(Align.CENTER); paint.setColor(Color.parseColor("#8E8E93")); paint.setTextSize(140); canvas.drawText(""+i, 150, 150+(paint.getTextSize()/3), paint); iv2.setImageBitmap(b); }


https://github.com/passsy/android-HoloCircularProgressBar es un ejemplo de una biblioteca que hace esto. Como declaró Tenfour04, tendrá que ser algo personalizado, ya que no se admite directamente desde el primer momento. Si esta biblioteca no se comporta como lo desea, puede bifurcarla y modificar los detalles para que funcione a su gusto. Si implementa algo que otros puedan volver a usar, ¡incluso podría enviar una solicitud de extracción para volver a fusionarla!


package com.example.ankitrajpoot.myapplication; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ProgressBar; public class MainActivity extends Activity { private ProgressBar spinner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); spinner=(ProgressBar)findViewById(R.id.progressBar); spinner.setVisibility(View.VISIBLE); } }

xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/loadingPanel" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <ProgressBar android:id="@+id/progressBar" android:layout_width="48dp" style="?android:attr/progressBarStyleLarge" android:layout_height="48dp" android:indeterminateDrawable="@drawable/circular_progress_bar" android:indeterminate="true" /> </RelativeLayout> <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" android:toDegrees="1080"> <shape android:shape="ring" android:innerRadiusRatio="3" android:thicknessRatio="8" android:useLevel="false"> <size android:width="56dip" android:height="56dip" /> <gradient android:type="sweep" android:useLevel="false" android:startColor="@android:color/transparent" android:endColor="#1e9dff" android:angle="0" /> </shape> </rotate>