ProgressBar(プログレスバー)


このセクションの概要:

このセクションでは、Android の基本的な UI コントロールの ProgressBar (プログレス バー) について説明します。ProgressBar には、次のような多くのアプリケーション シナリオがあります。 ユーザーがログインすると、バックグラウンドでリクエストが送信され、サーバーから情報が返されるのを待機します。このとき、または比較を行うときにプログレス バーが使用されます。 時間のかかる操作では長い待ち時間が必要になります。この時点でプロンプトが表示されない場合、ユーザーはプログラム Carsh または電話がクラッシュしたと考える可能性があります。 これによりユーザー エクスペリエンスが大幅に低下するため、時間のかかる操作が必要な場合は、進行状況バーを追加してユーザーに現在のプログラムを知らせます。 実行中は、現在のタスクの実行状況なども直感的に把握できます!プログレスバーを使用するととても便利です。 それでは、このセクションの内容を説明していきましょう〜 ちなみに、ProgressBar の公式 API ドキュメント: ProgressBar


1. 共通属性と基本的な例の説明

公式ドキュメントからは、次のようなクラス関係図が示されています:

1.png

ProgressBar は、 View クラスであり、直接の子です。クラスには、AbsSeekBar と ContentLoadingProgressBar が含まれます。 このうち、AbsSeekBar のサブクラスには SeekBar と RatingBar が含まれます。これら 2 つも ProgressBar に基づいて実装されていることがわかります。

android:
max
    : プログレス バーの最大値。
  • android:progress
  • : プログレスバーが進行状況値を完了しました
  • android:progressDrawable
  • : トラックに対応するDrawableオブジェクトを設定します
  • android:indeterminate
  • : trueに設定すると、プログレスバーは表示されません進行状況を正確に表示します
  • android:indeterminateDrawable
  • : 進行状況を表示する進行状況バーの非Drawableオブジェクトを設定します
  • android:indeterminateDuration
  • : 不正確に表示される進行状況の継続時間を設定します
  • android: SecondaryProgress
  • : 二次的な進行状況バー、ビデオの再生と同様に、1 つは現在の再生の進行状況、もう 1 つはバッファリングの進行状況で、前者は progress 属性によって設定されます。
  • これに対応して、Java では次のメソッドを呼び出すことができます:

getMax
    (): この進行状況バーの範囲の上限を返します
  • getProgress
  • (): 進行状況を返します
  • getSecondaryProgress
  • ( ): マイナーな進行状況を返します
  • incrementProgressBy
  • (int diff): 増分進行状況を指定します
  • isIndeterminate
  • (): 進行状況バーが不確定モードかどうかを示します
  • setIndeterminate
  • (boolean indeterminate) : セットindeterminate In モード
  • 次に、システムが提供するデフォルトのプログレスバーの例を見てみましょう。

システムのデフォルトのプログレスバーの使用例:

レンダリングの実行:

实现布局代码:


<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:layout_height="wrap_content" / >

<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<ProgressBar
style="@android:style/Widget.ProgressBar.Large"
android:layout_width ="wrap_content"
android:layout_height="wrap_content" />

<!--系统提供的水平进度条-->
<ProgressBar
style="@android:style/Widget.ProgressBar.horizo​​ntal" "
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="18" />

<ProgressBar
style="@android:style/ Widget.ProgressBar.horizo​​ntal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:indeterminate="true" />

< ;/LinearLayout>


わかりました、2 番目を除いて、他のものは忘れてください... システムが提供するものは間違いなく私たちのニーズを満たすことができません。 では、実際の開発におけるプログレスバーの扱い方を解説していきます!


2. アニメーションを使用して円形の進行状況バーを置き換えます

最初の解決策は、一連の連続画像を使用して、進行状況画像が必要なときにアニメーションを表示することです。 アニメーションを非表示にするだけです。このアニメーションは通常、AnimationDrawable を使用して実装されます。よし、やってみよう AnimationDrawable ファイルを定義します:

PS: 使用する画像素材: プログレスバー画像素材 package.zip

レンダリングの実行:

3.gif

<p 実装手順:

res ディレクトリに新しいファイルを作成します。 anim ファイルを作成し、リソース ファイル 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"/>  
<アイテム
android:drawable="@drawable/loading_10"
Android:duration = "200"/> able = "@drawable/loading_12"は同じではありません。 最後に MainActivity.java に移動します


public class MainActivity extends AppCompatActivity {

private ImageView img_pgbar;
private AnimeDrawable ad;

@Override
protected void onCreate( Bundle SavedInstanceState) {
super.onCreate(savedInstanceState) ;

.activity_main);

IMG_PGBAR=(ImageView)findViewById(r.id.img_pgbar);
ad.start();
_

ここではアニメーションの開始方法だけを書きます。残りはあなた次第です~ プログレスバーを表示する必要がある場合は、ImageView を表示します。 必要ないときは隠れさせてください!さらに、実際には、Progressbar 自体に indeterminateDrawable があります。 このパラメータは上記のアニメーションリソースに設定できますが、プログレスバーのパターンサイズを直接変更することはできません。Javaコードで記述する必要があります。 変更して、幅と高さを設定し、幅と高さが大きすぎる場合、複数の進行状況バーが表示されます...自分で重さを量ってください~


3. 円形の進行状況バーをカスタマイズします

それを信じてください。パート 2 を見た後、くそー、とても欺瞞的だ、人々を欺くためにアニメーションを使用してください、はは、これは実際の開発の場合です、もちろん上記のことです この状況は、進捗状況を表示する必要がない場合にのみ適用されます。進捗状況を表示する必要がある場合は、役に立ちません。 インターネット上のシンプルなカスタム円形プログレス バー!コードは比較的シンプルで理解しやすいので、興味があれば見てみるか、関連する拡張機能を作成してください~

レンダリングの実行:

4.gif


/**
* 20005/8/5 にジェイによって作成されました。
 */
public class CirclePgBar extends View {


private Paint mBackPaint;
private Paint mFrontPaint;
private Paint mTextPaint;
private float mStrokeWidth = 50;
private float mHalfStrokeWidth = mStrokeWidth / 2;
private float mRadius = 200;
private RectF mRect;
private int mProgress = 0;
//目标值、想修正量修正量
private int mTargetProgress = 90;
private int mMax = 100;
private int mWidth;
private int mHeight;


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

public CirclePgBar(Context context, Attribut eSet attrs) {
super(context, attrs);
init ();
}

public CirclePgBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}


// 相关パラメータ初期化を完了します
private void init () {
mBackPaint = new Paint();
mBackPaint.setColor(Color.WHITE);
mBackPaint.setAntiAlias(true);
mBackPaint.setStyle(Paint.Style.STROKE);
mBackPaint .setStrokeWidth(mStrokeWidth);

mFrontPaint = new Paint();
mFrontPaint.setColor(Color.GREEN);
mFrontPaint.setAntiAlias(true);
mFrontPaint.setStyle(Paint.Style.STROKE);
        mFrontPaint.setStrokeWidth(mStrokeWidth);


mTextPaint = new Paint();
mTextPaint.setColor(Color.GREEN);
mTextPaint.setAntiAlias(true);
mTextPaint.setTextSize(80);
mTextPaint.setTextAlign(Paint. Align.CENTER);
}


// 重写测量大のonMeasureメソッド和绘制View的核心メソッドonDraw()
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(width)スペックの測定、 heightMeasureSpec);
mWidth = getRealSize(widthMeasureSpec);
mHeight = getRealSize(heightMeasureSpec);
setMeasuredDimension(mWidth, mHeight);

}


@Override
protected void onDraw(Canvas canvas) {
initRect();
float angle = mProgress / (float) mMax * 360;
canvas.drawCircle(mWidth / 2, mHeight / 2, mRadius, mBackPaint);
canvas.drawArc(mRect, -90, angle, false, mFrontPaint);
キャンバス。 drawText(mProgress + "%", mWidth / 2 + mHalfStrokeWidth, mHeight / 2 + mHalfStrokeWidth, mTextPaint);
if (mProgress < mTargetProgress) {
mProgress += 1;
invalidate();
}

}

public int getRealSize(int measureSpec) {
int result = 1;
int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec);

        if (mode == MeasureSpec.AT_MOST || mode == MeasureSpec.UNSPECIFIED) {
//自己计算
result = (int) (mRadius * 2 + mStrokeWidth);
} else {
結果 = サイズ;
}

return result;
}

private void initRect() {
if (mRect == null) {
mRect = new RectF();
int viewSize = (int ) (mRadius * 2);
int left = (mWidth - viewSize) / 2;
int top = (mHeight - viewSize) / 2;
int right = left + viewSize;
int bottom = top + viewSize;
mRect. set(左、上、右、下);
}
}


}

实现代:

自定义View类:

然后在布局文件中加上:

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

就是这么简单~


本节小结:

本节给大家介绍了Android における常用制御子:ProgressBar讲解了基本使用法,および实际开発行中 度度ストリップの 2 つの実現方法について、2 番目の自主設定度度ストリップは完全に実行でき、その後実用化されます~! 良いですね、本节はここに到着しました、谢谢~