오늘 너무 피곤하기도 하고..
내일 친형 결혼식도 있어서, 예시하고 뒷부분 내용은 일요일에 올리겠습니다.
[애니메이션과 다앙햔 위젯 사용하기]
[애니메이션 사용하기]
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 객체 실행하기 예시