본문 바로가기

안드로이드/코드

[안드로이드] 핸들러, 커스텀 프로그레스바 사용하기 - Handler, ProgressBar

반응형

 

 

 

 

프로그레스1

 

커스텀 프로그레스바를 만들고 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)을 사용하시면 됩니다.

 

 

다음 포스팅에서는 해당 코드에서 몇가지만 추가해서 카운트 다운 타이머를 만들어보도록 하겠습니다.

 

반응형