Lesson 13: App UI Design

HanbinΒ·2021λ…„ 9μ›” 7일
0

Teach Android Development

λͺ©λ‘ 보기
13/13
post-thumbnail

πŸ’‘ Teach Android Development

κ΅¬κΈ€μ—μ„œ μ œκ³΅ν•˜λŠ” ꡐ윑자료λ₯Ό μ •λ¦¬ν•˜κΈ° μœ„ν•œ ν¬μŠ€νŠΈμž…λ‹ˆλ‹€.

Android Development Resources for Educators

Android styling

Android styling system

  • μ•±μ˜ μ‹œκ°μ  λ””μžμΈμ„ μ§€μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • μ•± μ „μ²΄μ—μ„œ μΌκ΄€λœ λͺ¨μ–‘을 μœ μ§€ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€.
  • 계측적.(μƒμœ„ μŠ€νƒ€μΌμ—μ„œ μƒμ†ν•˜κ³  νŠΉμ • 속성을 μž¬μ •μ˜ν•  수 있음)

Precedence of each method of styling

각 μŠ€νƒ€μΌ 지정 λ°©λ²•μ˜ μš°μ„ μˆœμœ„λ₯Ό μš”μ•½ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ Themeμ—μ„œ ν…μŠ€νŠΈ 크기λ₯Ό 18sp, Styleμ—μ„œ 16sp, Viewμ—μ„œ 직접 14sp둜 μ„€μ •ν•©λ‹ˆλ‹€. 속성은 Themeλ‚˜ Styleμ—μ„œ μ •μ˜λœ 것보닀 μš°μ„ λ˜κΈ° λ•Œλ¬Έμ— μ΅œμ’…μ μœΌλ‘œ 14sp둜 ν‘œμ‹œλ©λ‹ˆλ‹€.

Themes

  • μ•± μ „λ°˜μ— 걸쳐 κ΄‘λ²”μœ„ν•˜κ²Œ μœ μš©ν•œ Named λ¦¬μ†ŒμŠ€ λͺ¨μŒ.
  • Named λ¦¬μ†ŒμŠ€λ₯Ό ν…Œλ§ˆ 속성이라고 ν•©λ‹ˆλ‹€.
  • μ˜ˆμ‹œ
    • ν…Œλ§ˆλ₯Ό μ‚¬μš©ν•˜μ—¬ μ•±μ—μ„œ κΈ°λ³Έ 및 보쑰 색상 μ •μ˜.
    • ν…Œλ§ˆλ₯Ό μ‚¬μš©ν•˜μ—¬ Activity λ‚΄ λͺ¨λ“  ν…μŠ€νŠΈμ˜ κΈ°λ³Έ κΈ€κΌ΄ μ„€μ •.

Declare a theme

res/values/themes.xml νŒŒμΌμ—μ„œ <style> νƒœκ·Έλ₯Ό μ‚¬μš©ν•΄μ„œ ν…Œλ§ˆλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light">
    <item name="colorPrimary">@color/orange_500</item>
    <item name="colorPrimaryVariant">@color/orange_700</item>
    <item name="colorSecondary">@color/pink_200</item>
    <item name="colorSecondaryVariant">@color/pink_700</item>
    ...
</style>

Apply a theme

AndroidManifest.xmlμ—μ„œ μ‚¬μš©ν•  λ•Œ

<manifest ... >
    <application ... >
        <activity android:theme="@style/Theme.MyApp" ... >
      </activity>
    </application>
</manifest>

layout fileμ—μ„œ μ‚¬μš©ν•  λ•Œ

<ConstraintLayout …
    android:theme="@style/Theme.MyApp">

Refer to theme attribute in a layout

νŠΉμ • λ¦¬μ†ŒμŠ€ λŒ€μ‹  ν…Œλ§ˆ 속성을 직접 μ°Έμ‘°ν•˜μ—¬ 보닀 μœ μ—°ν•œ λ ˆμ΄μ•„μ›ƒκ³Ό μŠ€νƒ€μΌμ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

layout fileμ—μ„œ μ‚¬μš©ν•  λ•Œ

<LinearLayout …
    android:background="?attr/colorSurface">

?attr/themeAttributeName ꡬ문 μ‚¬μš©.

?attr/colorPrimary
?attr/colorPrimaryVariant

Styles

ν…Œλ§ˆμ˜ λ²”μœ„λ₯Ό κ΄‘λ²”μœ„ν•œ View 및 ViewGroup 집합에 μ μš©ν•˜λŠ” 것을 μ‚΄νŽ΄λ΄€μŠ΅λ‹ˆλ‹€. 보닀 쒁은 λ²”μœ„μ˜ Viewμ—μ„œ μ‹œκ°μ  속성을 μ •μ˜ν•˜λ €λ©΄ μŠ€νƒ€μΌμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μŠ€νƒ€μΌμ€ νŠΉμ • λ·° μ†μ„±μ˜ λͺ¨μŒμž…λ‹ˆλ‹€.
  • View의 νƒ€μž….
  • μŠ€νƒ€μΌμ„ μ‚¬μš©ν•˜μ—¬ κΈ€κΌ΄ 크기 λ˜λŠ” 색상과 같은 μž¬μ‚¬μš© κ°€λŠ₯ν•œ 정보 μ»¬λ ‰μ…˜μ„ λ§Œλ“­λ‹ˆλ‹€.
  • μ•± μ „μ²΄μ—μ„œ μ‚¬μš©λ˜λŠ” 곡톡 λ””μžμΈμ˜ μž‘μ€ 집합을 μ„ μ–Έν•˜λŠ”λ° μœ μš©ν•©λ‹ˆλ‹€.

Declare a style

res/values/styles.xml νŒŒμΌμ— μ •μ˜ν•©λ‹ˆλ‹€.

<style name="DescriptionStyle">
    <item name="android:textColor">#00FF00</item>
    <item name="android:textSize">16sp</item>
    ...
</style>

Apply a style

λ ˆμ΄μ•„μ›ƒ 파일 λ‚΄μ—μ„œ μŠ€νƒ€μΌ 속성을 μ§€μ •ν•˜μ—¬ View에 μ μš©ν•©λ‹ˆλ‹€.

<TextView
    style="@style/DescriptionStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/description_text" />

Refer to theme attribute in a style

μŠ€νƒ€μΌ λ‚΄μ—μ„œλ„ ν…Œλ§ˆ 속성을 μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<style name="DescriptionStyle">
    <item name="android:textColor">?attr/colorOnSurface</item>
    <item name="android:textSize">16sp</item>
    ...
</style>

View attributes

  • View attributes을 μ‚¬μš©ν•˜μ—¬ 각 Viewμ•  λŒ€ν•΄ λͺ…μ‹œμ μœΌλ‘œ μ„€μ •.
  • μŠ€νƒ€μΌμ΄λ‚˜ ν…Œλ§ˆλ₯Ό 톡해 μ„€μ •ν•  수 μžˆλŠ” λͺ¨λ“  속성을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ—¬λ°±, νŒ¨λ”© λ˜λŠ” μ œμ•½ 쑰건과 같은 μ‚¬μš©μž 지정 λ˜λŠ” μΌνšŒμ„± λ””μžμΈμ— μ‚¬μš©.

Resources directory

Provide alternative resources

μ•±μ—λŠ” 각기 λ‹€λ₯Έ μž₯치 ꡬ성에 맞게 μ—¬λŸ¬ λ¦¬μ†ŒμŠ€ 집합이 포함될 수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 앱을 μ‹€ν–‰ν•˜λ©΄ AndroidλŠ” 기기와 κ°€μž₯ 잘 λ§žλŠ” λ¦¬μ†ŒμŠ€λ₯Ό μžλ™μœΌλ‘œ μ„ νƒν•˜κ³  λ‘œλ“œν•©λ‹ˆλ‹€.

  • values-b+es : μž₯치 locale이 μŠ€νŽ˜μΈμ–΄λ‘œ μ„€μ •λœ 경우.
  • values-night : 닀크λͺ¨λ“œκ°€ μΌœμ‘Œμ„ 경우.

Color resources

μ•± μ „μ²΄μ—μ„œ μƒ‰μƒμ˜ 이름을 μ§€μ •ν•˜κ³  ν‘œμ€€ν™”ν•˜λŠ” 방법.

res/values/colors.xml νŒŒμΌμ—μ„œ μ„€μ •.

<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    ...
</resources>

#AARRGGBB ν˜•μ‹μ˜ 16μ§„μˆ˜ μƒ‰μƒμœΌλ‘œ μ§€μ •ν•©λ‹ˆλ‹€.

Dimension resources

λ ˆμ΄μ•„μ›ƒμ—μ„œ 수치 κ°’μ˜ 이름을 μ§€μ •ν•˜κ³  ν‘œμ€€ν™”ν•˜λŠ” 방법.

res/values/dimens.xml νŒŒμΌμ—μ„œ μ„€μ •.

<resources>
    <dimen name="top_margin">16dp</dimen>
</resources>

λ ˆμ΄μ•„μ›ƒμ—μ„œλŠ” @dimen/<name>으둜, μ½”λ“œμ—μ„œλŠ” R.dimen.<name>으둜 μ°Έμ‘°ν•©λ‹ˆλ‹€.

<TextView …
    android:layout_marginTop="@dimen/top_margin" />

Typography

Scale-independent pixels (sp)

  • density-independent pixels (dp)에 ν•΄λ‹Ήν•˜λŠ” ν…μŠ€νŠΈ.
  • ν…μŠ€νŠΈ μ‚¬μ΄μ¦ˆ sp둜 지정(μ‚¬μš©μž μ„ ν˜Έλ„ κ³ λ €)
  • μ‚¬μš©μžλŠ” μ„€μ • μ•±μ—μ„œ κΈ€κΌ΄ 및 λ””μŠ€ν”Œλ ˆμ΄ 크기λ₯Ό μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Type scale

  • μ•±κ³Ό μ½˜ν…μΈ μ— λŒ€ν•΄ 응집λ ₯ μžˆλŠ” λ°©μ‹μœΌλ‘œ ν•¨κ»˜ μž‘λ™ν•˜λ„λ‘ μ„€κ³„λœ μŠ€νƒ€μΌ μ„ΈνŠΈ
  • 각각의 λͺ©μ μ΄ μžˆλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν…μŠ€νŠΈ μΉ΄ν…Œκ³ λ¦¬λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.(예: ν—€λ“œλΌμΈ, λΆ€μ œλͺ©)

TextAppearance

  • typeface (android:fontFamily)
  • weight (android:textStyle)
  • text size (android:textSize)
  • capitalization (android:textAllCaps)
  • letter spacing (android:letterSpacing)

Examples using TextAppearance

<TextView
   ...
   android:textAppearance="@style/TextAppearance.MaterialComponents.Headline1"
   android:text="@string/title" />

<TextView
   ...
   android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
   android:text="@string/body_text" />

Customize your own TextAppearance

κΈ°μ‘΄ μŠ€νƒ€μΌμ„ μƒμ†ν•˜κ³  ν•„μš”ν•œ 뢀뢄을 μˆ˜μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

<style name="TextAppearance.MyApp.Headline1"
        parent="TextAppearance.MaterialComponents.Headline1">
    ...
    <item name="android:textStyle">normal</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:textSize">64sp</item>
    <item name="android:letterSpacing">0</item>
    ...
</style>

Use a custom TextAppearance in a theme

ν…Œλ§ˆμ—μ„œ μƒˆλ‘œμš΄ μŠ€νƒ€μΌμ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light">
   ...
   <item name="textAppearanceHeadline1">@style/TextAppearance.MyApp.Headline1</item>
   ...
</style>

Localization

μ‚¬μš©μžμ˜ 언어와 문화에 따라 λŒ€μ²΄ λ¦¬μ†ŒμŠ€λ₯Ό μ œκ³΅ν•  수 μžˆλŠ” κΈ°λŠ₯.

Localize your app

  • localized된 뢀뢄을 μ•±μ˜ 핡심 Kotlin κΈ°λŠ₯κ³Ό λΆ„λ¦¬ν•©λ‹ˆλ‹€.
    • 예: μ‚¬μš©μžμ—κ²Œ λ³΄μ΄λŠ” λ¬Έμžμ—΄μ„ string.xmlμ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • μ‚¬μš©μžκ°€ 앱을 μ‹€ν–‰ν•˜λ©΄ Android μ‹œμŠ€ν…œμ€ 기기의 locale에 따라 λ‘œλ“œν•  λ¦¬μ†ŒμŠ€λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.
  • locale별 λ¦¬μ†ŒμŠ€λ₯Ό 찾을 수 μ—†λŠ” 경우 AndroidλŠ” κΈ°λ³Έ λ¦¬μ†ŒμŠ€λ‘œ λŒ€μ²΄ν•©λ‹ˆλ‹€.

Support different languages and cultures

  • 지원할 locale을 κ²°μ •ν•©λ‹ˆλ‹€.
  • res 디렉토리에 locale 별 디렉토리λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    • <resource type>-b+<language code>[+<country code>]
    • 예: layout-b+en+US, values-b+es
  • ν•΄λ‹Ή 디렉토리에 locale 별 λ¦¬μ†ŒμŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

Support languages that use RTL scripts

  • μ‚¬μš©μžλŠ” 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½(RTL) 슀크립트λ₯Ό μ‚¬μš©ν•˜λŠ” μ–Έμ–΄λ₯Ό 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • manifest μ•± νƒœκ·Έμ— android:supportsRtl="true"λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
  • λ ˆμ΄μ•„μ›ƒ νŒŒμΌμ—μ„œ μ™Όμͺ½κ³Ό 였λ₯Έμͺ½μ„ μ‹œμž‘κ³Ό 끝으둜 λ³€κ²½ν•©λ‹ˆλ‹€.
    • android:paddingLeft -> android:paddingStart
  • λ¬Έμžμ—΄μ„ ν˜„μ§€ν™”ν•˜κ³  λ©”μ‹œμ§€μ˜ ν…μŠ€νŠΈ ν˜•μ‹μ„ μ§€μ •ν•©λ‹ˆλ‹€.
  • -ldrtl(layout-direction-right-to-left) 및 -ldltr(layout-direction-left-to-right) λ¦¬μ†ŒμŠ€ 디렉토리 ν•œμ •μžλ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • λ¦¬μ†ŒμŠ€λ₯Ό μ œκ³΅ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€