Android中的自定义进度条
android应用程序中的自定义进度条使其具有个人风格。
在本教程中,我们将通过在应用程序中实现旋转徽标图标来创建自定义进度列。
大多数情况下,在加载数据时,我们最终使用ProgressBar作为加载图标。
按照当前的趋势,Reddit,UBER,Foodpanda和Twitter等应用已将其常用的进度列替换为应用程序的图标作为加载图标。
这为他们的应用程序和徽标品牌提供了一种触感,使它们与众不同。
Android中的自定义进度条
让我们看看在应用程序的活动中显示加载图标的经典方式。
上面布局的代码应如下所示:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:app="https://schemas.android.com/apk/res-auto" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.theitroad.spinninglogo.MainActivity"> <ProgressBar android:id="@+id/progressBarLarge" style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" <ProgressBar android:id="@+id/progressBarSmall" style="?android:attr/progressBarStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/progressBarLarge" <ProgressBar android:id="@+id/progressBarMedium" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dp" app:layout_constraintBottom_toTopOf="@+id/progressBarLarge" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" </android.support.constraint.ConstraintLayout>
我们设置了三个圆形的ProgressBar,它们在上述布局中不断旋转。
现在,让我们尝试添加一个可无限旋转图标的ProgressBar。
Android自定义进度条
ProgressBar类包含一个属性" indeterminateDrawable",该属性将默认指示符替换为指定的drawable。
让我们看看在进度列中放置一个图标会发生什么。
activity_main.xml的代码如下所示:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:app="https://schemas.android.com/apk/res-auto" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.theitroad.spinninglogo.MainActivity"> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminateDrawable="@mipmap/ic_launcher" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" </android.support.constraint.ConstraintLayout>
上面的布局在我们的应用程序中反映的输出如下。
糟糕! ProgressBar有什么问题?为什么不旋转?
好吧,我们需要将RotateDrawable设置为属性的值。
通过封装当前可绘制对象并为其分配旋转角度和角度,在xml中定义了" RotateDrawable"。
标记<rotate>用于在xml中这样做,如下所示。
下面给出了progress_icon.xml RotateDrawable的代码。
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="https://schemas.android.com/apk/res/android" > <item> <rotate android:drawable="@mipmap/ic_launcher" android:fillAfter="true" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:toDegrees="360" </item> </layer-list>
" android:fillAfter"属性指示动画结束后应用转换。
可以增加或者减少android:toDegrees值来更改旋转速度。
通常,建议将其设置为360的倍数。
让我们在activity_main.xml中的ProgressBar中设置上述可绘制对象。
<ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminateDrawable="@drawable/progress_icon" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"
应用程序中反映的输出如下所示。
让我们创建一个基本的应用程序,该应用程序在延迟后在ArrayList的TextView中显示一个字符串。
xml布局文件" activity_main.xml"的代码如下。
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:app="https://schemas.android.com/apk/res-auto" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.theitroad.spinninglogo.MainActivity"> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminateDrawable="@drawable/progress_icon" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="32dp" android:text="TAP ME TO GET A RANDOM QUOTE" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="A Greeting Message Awaits You" android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" </android.support.constraint.ConstraintLayout>
请注意上面代码中ConstraintLayout的有效使用。
MainActivity.java的代码如下。
package com.theitroad.spinninglogo; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { TextView textView; List<String> quotesList; ProgressBar progressBar; int i = 0; Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); quotesList = new ArrayList<>(); quotesList.add("Hi"); quotesList.add("Happy New Year"); quotesList.add("Hope you have a good day"); quotesList.add("Merry Christmas"); Button btnTap = findViewById(R.id.button); textView = findViewById(R.id.textView); progressBar = findViewById(R.id.progressBar); btnTap.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { progressBar.setVisibility(View.VISIBLE); textView.setVisibility(View.GONE); handler.postDelayed(new Runnable() { @Override public void run() { if (i == quotesList.size()) i = 0; textView.setVisibility(View.VISIBLE); textView.setText(quotesList.get(i++)); progressBar.setVisibility(View.GONE); } }, 3000); } }); } }