안드로이드&IOS 앱 개발자 양성

안드로이드&IOS 앱 개발자 양성(72일차)

HRuler 2020. 7. 17. 11:40
더보기

** Overriding

** Hierachy Event Model

** Delegation Model
1. 리스너
2. 이벤트 처리 방법
3. 리스너 객체 생성 방법
4. View.OnClickListener

** 이벤트 라우팅

** 주기적인 화면 갱싱
1. 실행 가능한 Activity를 1개 추가
2. 화면 디자인
3. 버튼을 누르면 1초마다 0 - 9까지를  TextView에 출력하는 코드 작성

** Timer

** 타이머를 이용해서 이미지 변경하기
1. 필요한 이미지를 drawable 디렉토리에 복사
2. layout 파일에 ImageView를 추가
3. onClick 메소드에 CountDownTimer를 위한 코드 추가

** 안드로이드의 리소스
1. drawable
2. layout
3. values
4. menu
5. xml
6. anim
7. mipmap
8. raw

** Animation
1. Twin Animation
2. AnimationListener
3. 기타 리소스

** 스마트 폰 호환성

** 회전 처리

** 회전이 발생하면 토스트를 출력
1. androidmanifest.xml 파일을 수정
2. AnimationActivity.java 파일에 회전이 발생하면 호출되는 메소드를 재정의

** Overriding

- 상위 클래스에 존재하는 메소드를 하위 클래스에서 재정의 하는 것

- 목적은 기능 확장

- 추상 메소드를 재정의하는 것은 오버라이딩이 아니고 구현

- 프레임워크가 제공하는 메소드를 오버라이딩할 때는 상위 클래스의 메소드를 호출해야 한다.

- 파괴하는 메소드를 제외하고는 상위 클래스의 메소드를 호출하고 필요한 기능을 추가한다.

 

** Hierachy Event Model

- 제공되는 메소드를 재정의하는 방식

- 터치와 키보드 이벤트

- View나 Activity를 상속받아서 사용

- View 클래스를 상속받아서 사용자 정의 뷰를 만들고 터치 이벤트를 처리

 

** Delegation Model

- 이벤트 처리를 다른 객체에게 위임하는 방식

- 상속을 받아서 메소드를 재정의하는 방식은 자주 사용하는 이벤트의 경우 효율적이지만 자주 사용하지 않는 이벤트의 경우 미리 만들어서 제공하는 것이 자원의 낭비이다.

- Delegation Model의 이벤트 처리 메소드는 첫번째 매개변수를 이용해서 이벤트가 발생한 객체를 확인할 수 있다.

1. 리스너

  onTouchListener

  onClickListener

  onKeyListener

  onLongClickListener

  onFocusChangeListener

- 리스너들은 뷰의 내부 인터페이스로 만들어져 있다.

- 대부분 메소드들 1개만 소유하고 있어서 람다로 작성이 가능하다.

2. 이벤트 처리 방법

- 이벤트를 처리할 객체에서 .set리스너(리스터 객체)를 호출해서 이벤트 처리를 위임한다.

3. 리스너 객체 생성 방법

1) 외부에 인터페이스를 구현한 클래스를 생성하는 방법

- 이벤트 처리를 위한 클래스를 외부에 별도로 생성하는 것이 권장되지만 데이터 교환이 어렵다.

2) 내부에 인터페이스를 구현한 클래스를 생성하는 방법

- 내부에 클래스를 만들기 때문에 데이터 교환이 쉽다.

- 별도의 클래스를 만드는 것이기 때문에 anonymous나 람다보다 프로그램이 무거워질 가능성이 높다.

3) anonymous나 람다를 이용해서 생성하는 방법

- 코드를 간결하게 만들 수는 있지만 이벤트 처리를 많이하게 되면 가독성이 떨어진다.

4. View.OnClickListener

- 클릭했을 때 이벤트 처리를 위한 리스너 인터페이스

- 처리해야 할 메소드는 public void onClick(View view)

1) 실행 가능한 Activity를 추가

2) 레이아웃 파일에 화면 디자인

- 2개의 버튼을 배치 

3) Acticity.java 파일에서 클릭 이벤트 처리

 

** 이벤트 라우팅

- 2개 이상의 객체로부터 발생한 이벤트를 하나의 이벤트 핸들러를 이용해서 처리하는 것을 말한다.

- 이벤트 라우팅을 하려면 이벤트가 발생한 객체를 구분할 수 있어야 한다.

  안드로이드의 이벤트 처리 메소드들은 첫 번째 매개변수가 이벤트가 발생한 객체이다.

  이 매개변수를 이용해서 구분하면 된다.

 

** 주기적인 화면 갱신

- GUI 시스템에서는 화면 갱신이 Main Thread에서만 가능하다.

- 화면을 갱신하는 작업은 모아서 한꺼번에 처리하고 가장 나중에 수행한다.

- 주기적인 화면 갱신은 Handler를 이용하거나 Timer를 이용해야 한다.

1. 실행 가능한 Activity를 1개 추가

2. 화면 디자인

- 텍스트를 출력할 수 있는 TextView 1개와 Button 1개를 세로 방향으로 배치

3. 버튼을 누르면 1초마다 0 - 9까지를 TextView에 출력하는 코드 작성

- 코드는 아무런 문제가 없고 정상적으로 수행되는데 화면 갱신만 안됨

  GUI 시스템에서 주기적인 화면 갱신을 일반 코드로는 할 수 없다.

  화면 출력은 모아서 한꺼번에 가장 나중에 수행하기 때문이다.

 

** Timer

- 일정한 주기를 가지고 작업을 수행하는 클래스 - 스레드로 - 구현된다.

- 클래스는 CountDownTimer

- onTick이라는 메소드에 주기적으로 수행할 내용을 작성한다.

- 인스턴스를 생성할 때는 2개의 매개변수를 대입해서 생성하는데 첫 번째 매개변수는 전체 수행할 시간이고 두 번째 매개변수는 주기이다.

- 타이머 시작은 start()를 호출하면 되고 중지는 cancel()을 호출하면 된다.

 

** 타이머를 이용해서 이미지 변경하기

1. 필요한 이미지를 drawable 디렉토리에 복사

2. layout 파일에 ImageView를 추가

3. onClick 메소드에 CountDowmTimer를 위한 코드 추가

 

** 안드로이드의 리소스

- 안드로이드는 자원을 res 디렉토리에 저장

- 실행을 할 때 자원을 전부 메모리에 로드해서 사용

- raw 디렉토리에 저장된 데이터는 로드하지 않고 사용할 때 로드

- 리소스 중에서도 크기가 큰 리소스는 res 디렉토리에 저장하지 않고 assets 디렉토리에서 관리

1. drawable : 이미지, 이미지와 관련된 XML, 그림을 표현한 XML

2. layout : 화면 UI를 정의한 레이아웃 XML

3. values : 문자열, 색상, 크기, 배열 및 스타일 등의 XML

4. menu : 메뉴

5. xml

6. anim : 애니메이션 XML

7. mipmap : 앱의 아이콘

8. raw : 이진 파일 - html이나 사운드 파일 등

- 안드로이드는 리소스를 res 디렉토리에 저장을 하면 R.java 파일에 static final int 형태로 확장자를 제외하고 정수로 생성한다.

  종류가 다르더라도 이름이 같으면 문제가 발생할 소지가 있다.

  자원별로 별도의 클래스를 이용해서 저장하기 때문에 자원의 종류가 다르면 상관이 없지만 raw 같은 경우는 하나의 클래스를 사용하기 때문에 image.html, image.css 형태로 존재하면 에러가 발생하거나 처음 만든 것을 사용하지 못할 수 있다.

- 리소스의 이름은 소문자와 숫자만으로 생성하는 것을 권장한다.

 

** Animation

1. Twin Animation

- 시작값과 종료값을 가지고 상태를 지정해서 수학적 계산에 의해서 애니메이션을 만들어내는 것

- TranslateAnimation, ScaleAnimation, RotateAnimation, AlphaAnimation, AnimationSet을 이용해서 작성한다.

- 애니메이션 작성은 xml을 이용하는 경우가 많다.

- xml을 애니메이션으로 만들기

  Animation 변수명 = AnimationUtils.loadAnimation(Context context, int resId);

  뷰객체.startAnimation(변수명);

- 애니메이션 관련 속성

  duration

  fillAfter(애니메이션 종료 후 마지막 상태 유지 여부 - 기본은 false)

  fillBefore(애니메이션 시작할 때 상태 - 기본은 true)

  repeatCount(0은 반복하지 않고 1은 2번, INFINITE이면 무한대)

  repeatMode(반복할 때의 동작으로 REVERSE를 설정하면 반대되는 애니메이션 재생)

  startOffset(시작 전에 대기 시간)

  interpolator(애니메이션 진행 속도 변환)

  detachWallpaper : 배경은 애니메이션되지 않도록 할 때 설정

  zAdjustment : 뷰가 겹쳤을 때 Z - index

1) 출력할 이미지를 drawable 디렉토리에 복사

2) res 디렉토리에 애니메이션을 위한 anim 디렉토리를 생성

3) anim 디렉토리에 rotate.xml 파일을 생성하고 회전 애니메이션 작성

4) 실행 가능한 Activity 생성(AnimationActivity)

5) 레이아웃을 수정

- 버튼 1개와 이미지 뷰 1개 배치

6) Activity.java 파일의 onCreate에 작성

2. AnimationListener

- Animation도 화면을 변경하는 작업이라서 애니메이션 종료 후에 어떤 동작을 수행시키려면 리스너의 콜백 메소드를 이용해야 한다.

- 애니메이션 시작 전, 종료 후, 반복될 때 호출되는 메소드를 소유한다.

- 애니메이션객체.setAnimationListener(AnimationListener listener);
3. 기타 리소스

- values 디렉토리에 만드는 리소스

1) stings.xml : 문자열 리소스

2) colors.xml

3) style.xml : 스타일 리소스 - 글자 모양 등

4) arrays.xml : 문자열 배열

5) dimens.xml : 크기

 

** 스마트 폰 호환성

- 아이콘이나 이미지는 스마트 폰의 해상도에 따라 적절한 파일을 제공해주는 것이 필요하다.

- mipmap이나 drawable 디렉토리를 만들 때 -mdpi, -hdpi, -xhdpi, -xxhdpi, -xxxhdpi 등을 추가해서 만들면 된다.

- 지역 코드를 붙일 수 있다.

  en(영어), en_US(미국에서 사용하는 영어)

- 방향을 지정할 수 있다.

  port(수직), land(수평)

- 스마트 폰 크기 가져오기

  DisplayMetrics 변수명 = new DisplayMetrics();

  getWindowManager().getDefaultDisplay().getMetrics(변수명);

  변수명에 크기가 저장된다.

- 단위

  절대 단위 : 크기가 고정 - pt, px, mm, in

  상대 단위 : 크기가 변경 - dp(dip), sp(sip)

  인쇄를 할 때는 절대 단위를 사용하는 것이 좋고, 화면 출력을 할 때는 상대 단위가 좋다.

1) string.xml 파일에 문자열을 정의

2) res 디렉토리에 values-ko 디렉토리를 생성

3) values-ko 디렉토리에 string.xml 파일을 만들고 작성

4) 레이아웃 파일에서 버튼의 텍스트를 수정

** 회전 처리

- 스마트 폰은 가로 보기와 세로 보기 모드가 존재한다.

- 안드로이드는 단말의 방향이 변경되면 Activity를 메모리에서 제거한 후 새로 만든다.

- Activity에서 회전을 지원하고자 하면 androidmanifest,xml 파일에 Activity를 등록할 때 android:configChanges = "orientation|keyboardHidden|screenSize" 옵션을 추가해 주어야 한다.

  Android:screenOrientation="portrait이나 landscape"를 설정하면 고정된다.

- 방향 전환이 발생하면 호출되는 메소드

  Activity 클래스의 onConfigurationChanged(Configuration newConfig)가 호출되고 매개변수의 orientation 속성을 조사하면 기기의 방향을 알 수 있다.

- 방향에 따라 다른 레이아웃을 출력하고자 하면 layout-land 디렉토리를 만들고 layout을 생성하면 된다.

  이렇게 만들었을 때는 회전이 발생했을 때 setContentView 메소드를 호출해주어야 한다.

- 이전 상태를 보관하고 다음에 실행했을 때 이전 상태를 가지고 실행하고자 하면 이 때는 onSaveInstanceState 메소드를 재정의해서 상태를 저장하면 된다.

  onCreate에서 이전 상태를 복원해 준다.

 

** 회전이 발생하면 토스트를 출력

1. androidmanifest.xml 파일을 수정

2. AnimationActivity.java 파일에 회전이 발생하면 호출되는 메소드를 재정의