본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 44일차 (애니메이션, 페이지 슬라이딩, 앱 화면에 웹 브라우저, 시크바, 키패드, 쓰레드, 핸들러)

오늘 너무 피곤하기도 하고..

내일 친형 결혼식도 있어서, 예시하고 뒷부분 내용은 일요일에 올리겠습니다.

[애니메이션과 다앙햔 위젯 사용하기]

[애니메이션 사용하기]

1. 첫 번째 단계로 애니메이션이 어떻게 동작하는지를 XML로 정의하고, 두 번째 단계로 XML을 로딩하며 애니메이션 객체로 만듭니다. 그런 다음 세 번째 단계로 뷰에 애니메이션을 적용하여 동작시킵니다.

구분

이름

설명

대상

View는 위젯이나 레이아웃을 모두 포함합니다.

예를 들어, 텍스트뷰나 리니어 레이아웃에 애니메이션을 적용할 수 있습니다.

그리기 객체

다양한 드로어블(Drawable)애니메이션에 적용할 수 있습니다.

ShapeDrawable은 캔버스에 그릴 도형을 지정할 수 있으며, BitmapDrawable은 비트맵 이미지를 지정할 수 있습니다.

효과

위치 이동

Translate로 정의한 액션은 대상의 위치를 이동시키는 데 사용되는 효과입니다.

확대/축소

Scale로 정의한 액션은 대상의 크기를 키우거나 줄이는 데 사용되는 효과입니다.

회전

Rotate로 정의한 액션은 대상을 회전시키는 데 사용되는 효과입니다.

투명도

Alpha로 정의한 액션은 대상의 투명도를 조절하는 데 사용되는 효과입니다.

 

[스케일 애니메이션]

 

☞ startOffset 은 시작시간입니다.

☞ duration 은 지속시간입니다

☞ 크기를 변경하려는 축의 정보는 X축과 Y축에 대해 각각 pivotX와 pivotY로 지정합니다.

☞ fromXScale과 fromYScale은 시작할 때의 확대/축소 비율입니다.

☞ toXScale과 toYScale은 끝날 때의 확대/축소 비율입니다.

 

[스케일 애니메이션 버튼 원상태로 되돌리기]

 

☞ 버튼을 원상태로 자연스럽게 돌아가도록 만드는 가장 간단한 방법은 애니메이션이 끝난 후 똑같은 애니메이션을 거꾸로 적용하는 것입니다. 즉, 두 개의 애니메이션이 연속으로 수행되도록 하나로 묶어두는 방법입니다.

 

[트윈 애니메이션으로 위치 이동 액션 효과 주기]

 

☞ fromXDelta 속성이 0%이므로 시작 위치의 X좌표는 원래 위치의 X좌표가 됩니다.

☞ repeatCount 속성이 -1이므로 무한 반복됩니다.

☞ 애니메이션이 끝난 후에 대상이 원래의 위치로 돌아오는 것을 막기 위해서는 fillAfter 속성을 true로 설정하면 됩니다.

 

[트윈 애니메이션으로 위치 회전 액션 효과 주기]

 

☞ 회전은 한 점을 중심으로 대상을 회전시키는 효과를 만드는 액션으로 시작 각도와 종료 각도를 지정할 수 있습니다.

☞ 예를 들어, 한 바퀴를 회전시키려고 한다면 fromDegrees 속성 값을 0으로 하고 toDegress 속성 값을 360으로 하면 됩니다. 시계 반대방향으로 회전시키고 싶을 경우에는 toDegress 속성 값을 -360으로 설정합니다. 회전의 중심이 되는 점은 디폴트 값이 (0,0)이므로 대상의 왼쪽 상단 끝 지점이 됩니다.

☞ 만약 대상의 중앙 부분을 회전의 중심으로 만들고 싶다면 pivotX 와 pivotY 속성의 값을 지정하면 됩니다.

 

[트윈 애니메이션으로 투명도 액션 효과 주기]

 

☞ 알파(투명도) 값의 범위는 0.0부터 1.0까지이며 0.0 은 알파 값이 0일 때와 마찬가지이므로 완전히 투명한 상태이며 1.0은 알파 값이 1일 때와 마찬가지이므로 완전히 보이는 상태입니다.

 

[트윈 애니메이션으로 속도 조절하기]

1. 애니메이션 효과가 지속되는 동안 빠르거나 느리게 효과가 진행되도록 만드는 방법은 인터폴레이터(Interpolator)를 사용하면 됩니다.

속성

설명

accelerate_interpolator

애니메이션 효과를 점점 빠르게 나타나도록 만듭니다.

decelerate_interpolator

애니메이션 효과를 점점 느리게 나타나도록 만듭니다.

accelerate_decelerate_interpolator

애니메이션 효과를 점점 빠르다가 느리게 나타나도록 만듭니다.

anticipate_interpolator

애니메이션 효과를 시작 위치에서 조금 뒤로 당겼다가 시작하도록 만듭니다.

overshoot_interpolator

애니메이션 효과를 종료 위치에서 조금 지나쳤다가 종료되도록 만듭니다.

anticipate_overshoot_interpolator

애니메이션 효과를 시작 위치에서 조금 뒤로 당겼다가 시작한 후 종료 위치에서 족므 지나쳤다가 종료되도록 만듭니다.

bounce_interpolator

애니메이션 효과를 종료 위치에서 튀도록 만듭니다.

2. 애니메이션이 언제 시작했는지 또는 끝났는지에 대한 정보는 AnimationListener 객체를 설정하면 알 수 있습니다.

메서드

설명

public void onAnimationStart

(Animation animation)

애니메이션이 시작되기 전에 호출됩니다.

public void onAnimationEnd

(Animation animation)

애니메이션이 끝났을 때 호출됩니다.

public void onAnimationRepeat

(Animation animation)

애니메이션이 반복될 때 호출됩니다.

 

[페이지 슬라이딩 사용하기]

1. 페이지 슬라이딩은 버튼을 눌렀을 때 보이지 않던 뷰가 슬라이딩 방식으로 나타나는 기능입니다.

※ 페이지 슬라이딩 예시

 

☞ FrameLayout으로 뷰(레이아웃)들을 중첩합니다.

☞ 두 번째 레이아웃은 사용자가 원하는 시점에 보여야 하므로 처음에는 visibility 속성을 "gone"으로 설정하여 보이지 않도록 합니다.

☞ 서브 화면은 XML 레이아웃에서 visibility 속성이 ‘gone'으로 설정되어 있어 화면에서 보이지 않았으므로 좌측으로 슬라이딩되어 나올 때는 ’visible'로 만들어 화면에 보이게 합니다. 그리고 우측으로 슬라이딩 될 때는 ‘invisible'이나 'gone'으로 만들어 화면에서 보이지 않도록 합니다. 서브 화면이 보이지 않게 되는 시점은 애니메이션이 끝나는 시점이어야 합니다.

☞ 그렇다면 애니메이션이 끝나는 시점을 알아야 할 텐데, 애니메이션이 끝나는 시점은 AnimationListener 인터페이스를 구현한 객체를 Animation 객체의 setonAnimationEnd() 메서드로 설정하면 알 수 있습니다.

☞ onAnimationEnd() 메서드가 애니메이션이 끝날 때 자동으로 호출됩니다.

 

[앱 화면에 웹 브라우저 넣기]

1. 사용자는 단말에서 보고 있는 컨텐츠가 웹페이지인지 아니면 앱에서 구성한 것인지에 큰 관심이 없지만 앱을 구성하는 화면의 일부로 웹페이지가 들어 있을 때 훨씬 더 일관성 있는 화면으로 인식합니다.

2. 웹브라우저를 앱 안에 넣을 때는 웹뷰(WebView)를 사용하면 됩니다.

※ 앱 화면에 웹 브라우저 넣기 예시

 

☞ WebView 객체의 setJavaScriptEnabled() 코드가 있으므로 그 값이 true로 설정되면 자바스크립트가 동작할 수 있는 환경이 됩니다.

☞ 웹페이지를 로딩하여 화면에 보여주기 위해서는 loadUrl() 메서드를 사용합니다.

 

[시크바 사용하기]

1. 시크바는 프로그레스바를 확장하여 만든 것인데, 프로그레스바의 속성을 갖고 있으면서 사용자가 값을 조정할 수 있게 합니다. (동영상 볼륨조절, 재생 위치 조절 등)

2. OnSeekBarChangeListener라는 리스너를 설정하여 이벤트를 처리할 수 있습니다.

3. 시크바는 AVD 에서는 동작이 잘 안되므로 실제 기기에서 해야합니다.

※ 시크바 사용하기 예시

 

[키패드 제어하기]

[스레드와 핸들러 이해하기]

[핸들러 이해하기]

1. 스레드(Thread)는 동시 수행이 가능한 작업단위이며, 현재 수행 중인 작업 이외의 기능을 동시에 처리할 때 새로운 스레드를 만들어 처리합니다. (멀티 스레드 방식)

2. 멀티 스레드 방식은 같은 프로세스 안에 들어 있으면서 메모리 리소스를 공유하므로 효율적인 처리가 가능하지만, 데드락(DeadLock)이 발생하여 시스템이 비정상적으로 동작할 수 있습니다.

3. 데드락이란 동시에 두 곳 이상에서 요청이 생겼을 때 어ᄄᅠᆫ 것을 먼저 처리할지 판단할 수 없어 발생하는 시스템 상의 문제입니다.

4. 지연시간이 길어질 수 있는 앱이라면 오랜 시간 작업을 수행하는 코드를 별도로 분리한 다음 UI에 응답을 보내는 방식을 사용합니다. 이를 위해 안드롱디가 제공하는 두 가지 시나리오를 정리하면 다음과 같습니다.

구분

시나리오

서비스 사용하기

백그라운드 작업은 서비스로 실행하고 사용자에게는 알림 서비스로 알려줍니다. 만약 메인 액티비티로 결과 값을 전달하고 이를 이용해서 다른 작업을 수행하고자 한다면 브로드캐스팅으로 결과 값을 전달할 수 있습니다.

스레드 사용하기

스레드는 같은 프로세스 안에 있기 때문에 작업 수행의 결과를 바로 처리할 수 있습니다. 그러나 UI 객체는 직접 접근할 수 없으므로 핸들러(Handler) 객체를 사용합니다.

5. 안드로이드에서 UI 처리할 때 사용되는 기본 스레드를 ‘메인 스레드’라고 부릅니다. 메인 스레드에서 이미 UI 에 접근하고 있으므로 새로 생성한 다른 스레드에서는 핸들러(Handler)객체를 사용해서 메시지를 전달함으로써 메인 스레드에서 처리하도록 만들 수 있습니다.

 

[스레드 사용하기]

1. 안드로이드에서는 표준 자바의 스레드를 그대로 사용할 수 있습니다.

2. 스레드는 new 연산자로 객체를 생성한 후 start() 메서드를 호출하면 시작할 수 있습니다.

3. Thread 클래스에 정의된 생성자는 크게 파라미터가 없는 경우와 Runnable 객체를 파라미터로 갖는 두 가지로 구분할 수 있습니다. 일반적으로 Thread 클래스를 상속한 새로운 클래스를 정의한 후 객체를 만들어서 시작하는 방법을 사용합니다.

※ 스레드 사용하기 예시

 

[핸들러로 메시지 전송하기]

1. 앱을 실행할 때 프로세스가 만들어지면 그 안에 메인 스레드가 함께 만들어집니다. 그리고 최상위에서 관리되는 앱 구성 요소인 액티비티, 브로드캐스트 수신자 등과 새로 만들어지는 윈도우를 관리하기 위한 메시지 큐(Message Queue)를 실행합니다.

2. 메시지 큐를 사용하면 순차적으로 코드를 수행할 수 있는데, 이렇게 메시지 큐로 메인 스레드에서 처리할 메시지를 전달하는 역할을 핸들러 클래스가 담당합니다.

3. 핸들로러 메시지 전송하는 과정

① 새로 만든 스레드가 핸들러가 관리하는 메시지 큐에서 처리할 수 있는 메시지 객체 하나를 참조합니다. (obtainMessage() 메서드를 이용하여 메시지 객체 반환받음)

② 메시지 객체에 필요한 정보를 넣은 후 sendMessage() 메서드를 이용해 메시지 큐에 넣을 수 있습니다.

③ 메시지 큐에 들어간 메시지는 순서대로 핸들러가 처리하게 되며 이때 handleMessage() 메서드에 정의된 기능이 수행됩니다. 이때 handleMessage()에 들어 있는 코드가 수행되는 위치는 새로 만든 스레드가 아닌 메인 스레드가 됩니다.

 

[Runnable 객체 실행하기]

1. 핸들러 클래스는 메시지 전송 방법 이외에 Runnable 객체를 실행시킬 수 있는 방법을 제공합니다.

2. 새로 만든 Runnable 객체를 핸들러의 post() 메서드로 전달해주면 이 객체에 정의된 run() 메서드 안의 코드들은 메인 스레드에서 실행됩니다.

※ Runnable 객체 실행하기 예시