오늘이라도

[Android] 15. ProgressBar, ProgressDialog, SeekBar, 화면 방향 돌리기, 애니메이션 효과 본문

취업성공패키지 SW 개발자 교육/Android

[Android] 15. ProgressBar, ProgressDialog, SeekBar, 화면 방향 돌리기, 애니메이션 효과

upcake_ 2020. 5. 26. 09:44
반응형

 - ProgressBar, ProgressDialog, SeekBar -

▲ProgressBar 작동 화면

 

▲ProgressDialog 작동 화면

 

▲SeekBar 작동 화면

 

▼activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progressBar"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="96dp"
        android:layout_marginEnd="33dp"
        android:layout_marginRight="33dp"
        android:text="입력"
        android:textSize="24sp" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_marginStart="81dp"
        android:layout_marginLeft="81dp"
        android:layout_marginTop="298dp"
        android:layout_marginEnd="80dp"
        android:layout_marginRight="80dp"
        android:layout_toEndOf="@+id/button2"
        android:layout_toRightOf="@+id/button2"
        android:text="닫기"
        android:textSize="24sp" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginStart="50dp"
        android:layout_marginLeft="50dp"
        android:layout_marginTop="94dp"
        android:text="보여주기"
        android:textSize="24sp" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progressBar"
        android:layout_marginTop="96dp"
        android:layout_marginEnd="55dp"
        android:layout_marginRight="55dp"
        android:layout_toStartOf="@+id/button1"
        android:layout_toLeftOf="@+id/button1"
        android:ems="10"
        android:hint="0 ~ 100 숫자 입력"
        android:inputType="number" />

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="46dp" />

    <SeekBar
        android:id="@+id/seekBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button3"
        android:layout_marginTop="43dp" />

</RelativeLayout>

 

▼MainActivity.java

package com.example.my16_progress;

import androidx.appcompat.app.AppCompatActivity;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    //객체 선언
    ProgressBar progressBar;
    EditText editText;
    Button button1, button2, button3;
    ProgressDialog dialog;
    SeekBar seekBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //객체 초기화
        progressBar = findViewById(R.id.progressBar);
        editText = findViewById(R.id.editText);
        button1 = findViewById(R.id.button1);
        button2 = findViewById(R.id.button2);
        button3 = findViewById(R.id.button3);
        seekBar = findViewById(R.id.seekBar);

        //progressBar 설정
        progressBar = findViewById(R.id.progressBar);
        progressBar.setIndeterminate(false);
        progressBar.setMax(100);
        progressBar.setProgress(20);

        //버튼에 기능 추가
        //버튼 1: 진행도 바
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            if(editText.getText().toString().length() != 0) {
                int value = Integer.parseInt(editText.getText().toString());
                if(value > 100) {
                    value = 100;
                }
                progressBar.setProgress(value);
            } else {
                Toast.makeText(MainActivity.this, "숫자를 입력해주세요.", Toast.LENGTH_SHORT);
            }
            }
        });

        //버튼 2 : 진행도 다이얼로그
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog = new ProgressDialog(MainActivity.this);
                dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); // 빙글빙글 돌아가게끔 설정
                dialog.setMessage("데이터를 확인하는 중입니다...");
                dialog.setCanceledOnTouchOutside(false);    // 화면 터치시 취소되는 기능을 설정하는 메서드
                dialog.show();
            }
        });

        //버튼 3 : 다이얼로그 멈추기
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(dialog != null) {
                    dialog.dismiss();
                }
            }
        });

        //시크바 기능 추가
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            //시크바의 진행도가 변경되면 작동하는 메서드
            //progress : 진행도
            //fromUser : 유저가 직접 변경하면 true, 시스템이 변경했으면 false
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                //editText에는 String 타입만 들어가야 하므로 int 타입인 progress를 String 타입으로 캐스팅한다.
                //방법 ① : "" + int타입
                //editText.setText("" + progress);

                //방법 ② : String.valueOf()
                editText.setText(String.valueOf(progress));
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            //값을 변경시키고 손을 뗌
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }

    //화면이 이미 생성되어 있는 경우에 새 화면을 띄우면 작동
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
    }
}

 

 

 - 화면 방향 돌리기 ① : 가로 화면을 따로 구성 - 

▲화면 방향 돌리기 ① 작동 화면

 

▼activity_main.xml : 세로 화면

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginStart="63dp"
        android:layout_marginLeft="63dp"
        android:layout_marginTop="91dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:textSize="24sp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="60dp"
        android:text="확인"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button1"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_centerInParent="true"
        android:layout_marginStart="58dp"
        android:layout_marginLeft="58dp"
        android:layout_marginTop="95dp"
        android:text="세로 방향(Portrait)"
        android:textSize="36sp" />
</RelativeLayout>

 

▲새 경로 만들기

 - res 우클릭 → New → Android Resource File

 

 

 

 - 만들어진 폴더를 확인하는 법

  ① 프로젝트 도구 창의 좌측 상단 Android를 Project로 변경

  ② app → src → main → res에서 확인 가능하다.

 

▼activity_main.xml : 가로 화면

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginStart="225dp"
        android:layout_marginLeft="225dp"
        android:layout_marginTop="70dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:textSize="24sp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="60dp"
        android:text="확인"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button1"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_centerHorizontal="true"
        android:layout_marginStart="193dp"
        android:layout_marginLeft="193dp"
        android:layout_marginTop="70dp"
        android:text="가로 방향(Landscape)"
        android:textSize="36sp" />
</RelativeLayout>

 

▼MainActivity.java

package com.example.my17_orientation;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    //객체 선언
    String name;
    EditText editText;
    Button button1;

    //onCreate는 저장된 instanceState를 불러다가 화면을 만든다.
    //Bundle : 데이터가 저장된 곳
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showToast("onCreate() 호출됨");

        //객체 초기화
        editText = findViewById(R.id.editText);
        button1 = findViewById(R.id.button1);

        //버튼 기능 추가
        //누르면 name에 editText의 내용을 가져온다.
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                name = editText.getText().toString();
                showToast("입력된 값을 변수에 저장하였습니다.");
            }
        });
        if(savedInstanceState != null) {
            name = savedInstanceState.getString("name");
            showToast("값을 복원하였습니다 : " + name);
        }
    }

    //넘겨 받은 문자열을 Toast로 보여주는 메서드
    private void showToast(String str) {
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    }

    //InstanceState를 저장하는 메서드
    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("name", name);
    }

    @Override
    protected void onStart() {
        super.onStart();
        showToast("onStart() 호출됨");
    }

    @Override
    protected void onStop() {
        super.onStop();
        showToast("onStop() 호출됨");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        showToast("onDestroy() 호출됨");
    }
}

 

 

 - 화면 방향 돌리기 ② : onConfigurationChanged로 가로 화면 구현 -

▲화면 방향 돌리기 ②

 

▼activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginStart="63dp"
        android:layout_marginLeft="63dp"
        android:layout_marginTop="91dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:textSize="24sp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/editText"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="24dp"
        android:text="확인"
        android:textSize="24sp" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button1"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_centerHorizontal="true"
        android:layout_marginStart="61dp"
        android:layout_marginLeft="61dp"
        android:layout_marginTop="22dp"
        android:text="세로 방향(Portrait)"
        android:textSize="36sp" />
</RelativeLayout>

 

▼AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.my18_orientation2">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:configChanges="orientation|screenSize|keyboardHidden">
            <!--화면이 바뀌었는지, 화면 크기가 바뀌었는지, 키보드가 사라지게 되었는지 확인-->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

▼MainActivity.java

package com.example.my18_orientation2;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    //객체 선언
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //객체 초기화
        textView = findViewById(R.id.textView);
    }

    //manifest에서 설정한 config중에 무언가가 바뀌면 작동하는 메서드
    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        //방향이 가로 방항으로 바뀌었으면 토스트를 띄우고 가로 방향으로 메세지를 바꿈
        if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            showToast("방향 : Landscape");
            textView.setText("가로 방향(Landscape)");
        //또는 방향이 세로 방향으로 바뀌었으면 토스트를 띄움
        } else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            showToast("방향 : Portrait");
            textView.setText("세로 방향(Portrait)");
        }
    }

    //넘겨 받은 문자열을 Toast로 보여주는 메서드
    private void showToast(String str) {
        Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    }
}

 

 

 - 애니메이션 효과 -

▲애니메이션 효과 작동 화면

 

▼activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#3F51B5"
        android:gravity="center_vertical"
        android:text="안녕하세요!"
        android:textColor="#FFFFFF"
        android:textSize="24sp" />

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="애니메이션 시작"
        android:textSize="24sp" />
</LinearLayout>

 

▼MainActivity.java

package com.example.my19_animation;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    //객체 선언
    TextView textView;
    Button button;
    Animation flowAnim;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //객체 초기화
        textView = findViewById(R.id.textView);
        button = findViewById(R.id.button);

        //Animation 설정
        flowAnim = AnimationUtils.loadAnimation(this, R.anim.flow);
        //Context 설정할때
        //onCreate 내부에서는 this가 가능하고
        //외부에서는 ~~.this나 getApplicationContext()를 사용한다.

        //버튼 기능추가
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.startAnimation(flowAnim);
            }
        });
    }
}

 

▲새 Resource Directory 만들기

 - res 우클릭 → New →  Android Resource Directory

 

▲새 Animation Resource File

 - anim 우클릭 → Animation Resource File

 

▼flow.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="100%"
        android:toXDelta="0%"
        android:duration="1500"
        android:repeatCount="1" />
</set>

 

 

 

반응형