Android中通過SeekBar手動控制ProgressBar與模擬下載自動更新進度條
阿新 • • 發佈:2020-12-01
場景
進度條的常用場景:
通過SeekBar拖動進而更新ProgressBar進度條,比如調整音量效果等。
模擬下載實現自動更新進度條。
注:
部落格:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程式猿
獲取程式設計相關電子書、教程推送與免費下載。
實現
手動控制進度條
在佈局檔案xml中新增一個SeekBar與ProgressBar
<ProgressBar android:id="@+id/pb_test" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" style="@style/Widget.AppCompat.ProgressBar.Horizontal"/> <SeekBar android:id="@+id/seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp"/>
然後在Activity中宣告這兩個控制元件
private ProgressBar progressBar; private SeekBar seekBar;
然後在onCreate方法中獲取這兩個控制元件
progressBar = findViewById(R.id.pb_test);
seekBar = findViewById(R.id.seekbar);
並設定seeBar的進度改變的監聽器以及重寫其方法
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { progressBar.setProgress(progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } });
onProgressChanged方法就是其進度改變的事件監聽,將進度條的進度設定為seekBar的進度
實現效果
自動進度條實現
在佈局檔案新增一個TextView用來顯示數字顯示的百分比,新增一個Button用來觸發下載操作
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".ProgressBarActivity"> <TextView android:id="@+id/tv_persent" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ProgressBar android:id="@+id/pb_test" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" style="@style/Widget.AppCompat.ProgressBar.Horizontal"/> <SeekBar android:id="@+id/seekbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp"/> <Button android:id="@+id/btn_download" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="下載"/> </LinearLayout>
然後在Activity中,在Button的點選事件中
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Thread thread = new Thread(new Runnable() { @Override public void run() { handler.sendEmptyMessage(1); } }); thread.start(); } });
新開一個程序並啟動,新開的程序與主程序進行通訊使用新建的Handler物件,呼叫其sendEmptyMessage方法
傳送一個空訊息引數為一個int值,這裡為1。
然後在Handler初始化時重寫其handlerMessage方法
使其每延遲200毫秒加一個進度並更新TextView和ProgressBar的進度顯示。
完整的activity的示例程式碼
package com.badao.androidstudy; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; public class ProgressBarActivity extends AppCompatActivity { private ProgressBar progressBar; private SeekBar seekBar; private Button button; private TextView textView; private Handler handler; private int progress = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progress_bar); progressBar = findViewById(R.id.pb_test); seekBar = findViewById(R.id.seekbar); button = findViewById(R.id.btn_download); textView = findViewById(R.id.tv_persent); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { progressBar.setProgress(progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); handler = new Handler(){ @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); switch (msg.what){ case 1: if(progress<100) { progressBar.setProgress(progress); textView.setText(progress+"%"); progress++; handler.sendEmptyMessageDelayed(1,200); }else { Toast.makeText(ProgressBarActivity.this,"下載完成",Toast.LENGTH_LONG).show(); } break; } } }; button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Thread thread = new Thread(new Runnable() { @Override public void run() { handler.sendEmptyMessage(1); } }); thread.start(); } }); } }
示例效果