커스텀 프로그레스바를 만들고 Handler를 사용해서 시작 버튼을 누르면 프로그레스바에 변화를 주는 예제를 만들어보겠습니다.
1. progress.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<solid
android:color="@android:color/white"/>
</shape>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="#12288A" />
</shape>
</clip>
</item>
</layer-list>
<item android:id="@android:id/background">
-프로그레스바 백그라운드를 의미합니다.
내부에 <solid android:color="@android:color/white"/> 부분을 수정해서 백그라운드 색상을 변경할 수 있습니다.
<item android:id="@android:id/progress">
- 프로그레스바가 작동할때 프로그레스가 그려지는 부분입니다.
백그라운드와 동일하게 색상을 변경해서 사용할 수 있습니다.
2. activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ProgressBar
android:id="@+id/pb"
android:progressDrawable="@drawable/progress"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="200dp"/>
<Button
android:id="@+id/bt"
android:textColor="@android:color/black"
android:textSize="20sp"
android:text="시작"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
가로로 그려지도록 프레그레스바의 스타일을 지정했습니다.
프로그레스바를 동그랗게 만드실거라면 '@style/Widget.AppCompat.ProgressBar' 를 입력하시면 되는데
프로그레스바의 기본값은 '@style/Widget.AppCompat.ProgressBar' 입니다.
android:progressDrawable="@drawable/progress"
해당 부분이 본인이 커스텀한 프로그레스바의 모양으로 띄워주도록 지정해주는 부분입니다.
1번에서 만든 xml파일의 경로를 지정해주시면 됩니다.
3. MainActivity.java
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;
public class MainActivity extends AppCompatActivity {
ProgressBar pb;
Button bt;
Handler handler;
int cnt = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(cnt<100){
cnt++;
pb.setProgress(cnt);
MainActivity.this.sendMessage();
}else{
handler.removeCallbacksAndMessages(null);
}
}
};
pb = findViewById(R.id.pb);
pb.setMax(100);
bt = findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage();
}
});
}
public void sendMessage(){
Message message = new Message();
//0.01초에 한번씩 Handler로 메세지를 전송
handler.sendMessageDelayed(message,10);
}
}
pb.setMax(100) - 100이 아닌 다른 숫자를 넣어주셔도 됩니다. int형으로 지정해주셔야 합니다.
pb.setProgress() - 프로그레스바의 프로그레스 값을 지정해줍니다. 변화를 줄 수 있도록 0.01초에 한번씩 증가한 값을 세팅해줬습니다.
handler.sendMessageDelayed(message, 10); - 0.01초에 한번씩 Handler에 메세지를 전송합니다.
2번째 인자에 원하시는 시간만큼 딜레이를 줘서 사용하실 수 있습니다.
딜레이 없이 사용하시려면 sendMessage(Message message) 또는 sendEmtyMessage(int what)을 사용하시면 됩니다.
다음 포스팅에서는 해당 코드에서 몇가지만 추가해서 카운트 다운 타이머를 만들어보도록 하겠습니다.