ProgressBar(bar kemajuan)


Pengenalan kepada bahagian ini:

Bahagian ini membawakan anda ProgressBar (bar kemajuan) dalam kawalan UI asas Android ProgressBar mempunyai banyak senario aplikasi, seperti Apabila pengguna log masuk, latar belakang menghantar permintaan dan menunggu pelayan untuk mengembalikan maklumat Pada masa ini, bar kemajuan akan digunakan atau semasa membuat beberapa perbandingan Operasi yang memakan masa memerlukan menunggu lama Jika tiada gesaan pada masa ini, pengguna mungkin berfikir bahawa program Carsh atau telefon telah ranap. , ini akan sangat mengurangkan pengalaman pengguna, jadi apabila operasi yang memakan masa diperlukan, tambahkan bar kemajuan untuk memberitahu pengguna tentang program semasa Semasa pelaksanaan, anda juga boleh memberitahu pengguna secara intuitif kemajuan pelaksanaan tugas semasa, dsb.! Menggunakan bar kemajuan boleh memberi saya kemudahan sedemikian! Baiklah, mari mulakan menerangkan kandungan bahagian ini~ By the way, dokumen API rasmi ProgressBar: ProgressBar


1 Penjelasan atribut biasa dan contoh asas

Daripada dokumen rasmi, kami melihat kelas sedemikian. rajah perhubungan :

1.png

ProgressBar mewarisi daripada kelas View, dan subkelas langsungnya termasuk AbsSeekBar dan ContentLoadingProgressBar. Subkelas AbsSeekBar termasuk SeekBar dan RatingBar dapat dilihat bahawa kedua-dua ini juga dilaksanakan berdasarkan ProgressBar

Penjelasan terperinci tentang atribut biasa:

    .
  • android:maks: Nilai maksimum bar kemajuan
  • android:kemajuan: Bar kemajuan telah melengkapkan nilai kemajuan
  • android:progressDrawable: Tetapkan objek Drawable sepadan dengan trek
  • android:tak tentu: Jika ditetapkan kepada benar, bar kemajuan tidak akan memaparkan kemajuan dengan tepat
  • android:indeterminateDrawable: Tetapkan objek Drawable bar kemajuan yang tidak memaparkan kemajuan
  • android:indeterminateDuration: Tetapkan tempoh bar kemajuan yang tidak memaparkan kemajuan dengan tepat
  • android:Kemajuan kedua: Bar kemajuan kedua adalah serupa dengan main balik video Satu ialah kemajuan main balik semasa dan satu lagi ialah kemajuan penimbalan melalui atribut kemajuan!

Sejajar dengan itu, kita boleh memanggil kaedah berikut dalam Java:

  • getMax(): Kembalikan bar kemajuan ini had atas julat
  • getProgress(): Kembalikan kemajuan
  • getSecondaryProgress(): Kembalikan kemajuan sekunder
  • incrementProgressBy(int diff): Tentukan kemajuan incremental
  • is Indeterminate(): Tunjukkan sama ada bar kemajuan berada dalam mod tak tentu
  • setIndeterminate(boolean tak tentu): Tetapkan mod tak tentu

Mari kita lihat contoh bar kemajuan lalai yang disediakan oleh sistem!

Contoh penggunaan bar kemajuan lalai sistem:

Menjalankan pemaparan:

2.gif

实现布局代码:


<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: orientation="vertical"
    tools:context=".MainActivity">

    <!-- 系统提供的圆形进度条,依次-丯尜><🎜; >    <ProgressBar
        style="@android:style/Widget.ProgressBar.Small"
        android:layout_width="wrap_content"
   ="                     android                         android & lt; ProgressBar
android: Layout_Width = "wrap_content"
android: Layout_height = "wrap_content"/& gt; Large"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <!--系供換来🎜>    < ;ProgressBar
        style="@android:style/Widget.ProgressBar.Horizontal"
                                                                                                                                                                                                                                                     max 🎜>        android:progress="18" />

    <ProgressBar
        style="@android:style/Widget.ProgressBar.Horizontal"<🎜 >         style="@android:style/Widget.ProgressBar.Horizontal"<🎜 >      id > Android: Layout_height = "wrap_content"
android: Layout_MargIntop = "10dp"
Android: tidak lama = "benar"/& gt;


Nah, kecuali yang kedua, lupakan yang lain... Apa yang sistem sediakan pasti tidak memenuhi keperluan kita! Sekarang mari jelaskan cara kami mengendalikan bar kemajuan dalam pembangunan sebenar!


2. Gunakan animasi untuk menggantikan bar kemajuan bulat

Pilihan pertama ialah menggunakan set gambar berterusan untuk membentuk animasi bingkai Apabila carta kemajuan diperlukan, biarkan Animasi kelihatan, tidak diperlukan Hanya buat animasi tidak kelihatan! Animasi ini biasanya dilaksanakan menggunakan AnimationDrawable! OK, mari buat Tentukan fail AnimationDrawable:

PS: Bahan gambar yang digunakan: Pakej bahan gambar bar kemajuan.zip

Rendering berjalan:

3.gif

<pLangkah pelaksanaan:

Buat fail :anim baharu dalam direktori res, dan kemudian buat fail sumber amin_pgbar.xml:

<?xml version="1.0" encoding="utf-8"?>  
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
    android:oneshot="false" >  
 
    <item  
        android:drawable="@drawable/loading_01"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_02"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_03"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_04"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_05"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_06"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_07"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_08"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_09"  
        android:duration="200"/>  
    <item  
        android:drawable="@drawable/loading_10"  
android:duration="200"/> > android:drawable="@drawable/loading_12"
android:duration="200"/>

</animation-list>


Kemudian tulis Fail reka letak, hanya terdapat satu ImageView di dalamnya, digunakan untuk memaparkan bar kemajuan, cuma tetapkan src kepada sumber boleh lukis di atas! Akhir sekali pergi ke MainActivity.java

kelas awam MainActivity meluaskan AppCompatActivity {

Private ImageView img_pgbar;

private AnimationDrawable ad;
@Override>< 🎜 void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img_pgbar = (ImageView) findViewById(R.id.img_pg bar>);<🎜 ad = (AnimationDrawable) img_pgbar.getDrawable();
img_pgbar.postDelayed(new Runnable() {
@Override
public void run() {
         ad.start( );      >        >
}, 100);
}

}

Di sini saya hanya menulis bagaimana untuk memulakan animasi, selebihnya terpulang kepada anda~ Apabila anda perlu memaparkan bar kemajuan, jadikan ImageView kelihatan; Biarkan dia bersembunyi apabila dia tidak diperlukan! Di samping itu, sebenarnya, Progressbar sendiri mempunyai IndeterminateDrawable, letak sahaja Parameter ini boleh ditetapkan kepada sumber animasi di atas, tetapi saiz corak bar kemajuan tidak boleh diubah suai secara langsung. Ia perlu ditulis dalam kod Java. Ubah suai, jika anda menetapkan lebar dan tinggi, dan lebar dan tinggi terlalu besar, anda akan melihat berbilang bar kemajuan...Timbang sendiri~


3 Sesuaikan bar Kemajuan bulatan

Saya percaya anda akan merungut selepas menonton 2, sial sangat menipu, gunakan animasi untuk menipu orang, haha, ini kes dalam perkembangan sebenar, sudah tentu perkara di atas. Situasi ini hanya terpakai kepada situasi di mana kemajuan tidak perlu dipaparkan Jika perlu untuk memaparkan kemajuan, ia adalah sia-sia, mari kita lihat seterusnya. Bar kemajuan pekeliling tersuai yang mudah di Internet! Kod ini agak ringkas dan mudah difahami Jika anda berminat, anda boleh melihat atau membuat sambungan yang berkaitan~

Rendering berjalan:

4.gif


/**
 * Dibuat oleh Jay pada 2015/8/5 0005.
 */
kelas awam CirclePgBar melanjutkan Paparan {


    pribadi Paint mBackPaint;
    private Paint mF Paint mF ; tCat;
    pribadi float mStrokeWidth = 50;
    pribadi float mHalfStrokeWidth = mStrokeWidth / 2;
    pribadi float mF ;<  =  20; 🎜>    private int mProgress = 0;
    //目标值,想改多少就改多少
    pribadi int mTargetProgress = 90;
    pr ivate int mMax = 100;       sendirian;<     sendiri int mHeight;


public CirclePgBar(Context context) {
        super(context);
        init();
    }

    public CirclePgBar(Context context,                                                                                                                                                                                                             ... konteks, attr ); init (); ;
    }


    //完成相关参数初始化
    private void init() {
  =          m );   mBackPaint.setColor(Color.WHITE) ;
        mBackPaint.setAntiAlias(true);
        mBackPaint.setStyle(Paint.Style.STROKE);
        mBackPaint.setStroke Width(mF Stroke Width(mF Stroke Width );🎜 rontPaint = new Paint();
         mFrontPaint.setColor(Color.HIJAU);
        mFrontPaint.setAntiAlias(true);
        mFrontPaint.setStyle(Paint.Style.STROKE>);<🎜        mFrontPaint.setStrokeWidth (mstrokeWidth);


mtextPaint = cat baru (); setTextSize(80)心方法onDraw()
    @Override
    dilindungi void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, pec height );<🎜  height MeasureSpec) {
        super.onMeasure(widthMeasureSpec, pec ketinggian );<🎜 ketinggian alSize(widthMeasureSpec);
        mHeight = getRealSize(heightMeasureSpec) ;
setMeAsuredDimension (mWidth, mheight);

}


@Override
dilindungi void ondraw (kanvas kanvas) {
initRect (); sudut terapung = mprogress/(float) mmax*360;
canvas.drawcircle (mwidth/2, mheight/2, mradius, mbackpaint); ;
         canvas.drawText(mProgress + "%", mWidth / 2 + mHalfStrokeWidth, mHeight / 2 + mHalfStrokeWidth, mTextPaint);
        ; mTargetProgress) {
            mProgress += 1;
            tidak sah();
         }

                                                                                                                                     < ) {
         int hasil = 1 ;
         int mode = MeasureSpec.getMode(measureSpec);
        int size = MeasureSpec.getSize(measureSpec);

        jika (mod == MeasureSpec.AT_MOST || mod == MeasureSpec.UNSPECIFIED) {
             //自己计算
                                         keputusan                                                                                                                               🎜>        } lain {
hasil = saiz;
        }

        hasil pemulangan;
    }

    private void initRect() {
  =      ct =      ct =      ct =      ct       mRect = baharu RectF();
            int saiz pandangan = (int) (mRadius * 2);
                                                                        atas  / 2;
int kanan = kiri + Saiz paparan;
             int bawah = atas + Saiz paparan;
            mRect.set(kiri, atas, kanan, bawah);<🎜 >   >
   ><🎜 🎜> }



实现代码:


自定义Lihat类:

然后在布市

 <com.jay.progressbardemo.CirclePgBar        android:layout_width="match_parent"       android:layout_height="match_parent"/>

就是这么简单~

本节小结:

本节给大家介绍了Android中的常用控s箣,以及实际开发中 对于进度条的两种实现方法,第二个自定义进度条可以自行完善,然后用刑式! 好的,本节就到这里,谢谢~