Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
炎炎夏日學 Android 課程 - Part2: Android 元件介紹
Search
Johnny Sung
June 30, 2019
Programming
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
炎炎夏日學 Android 課程 - Part2: Android 元件介紹
炎炎夏日學 Android 課程 - Part2: Android 元件介紹
(Kotlin EveryWhere 活動)
Johnny Sung
June 30, 2019
More Decks by Johnny Sung
See All by Johnny Sung
Escape RCA Writing Hell: Using MCP to Let AI Handle the Last Mile of Operations 告別 RCA 撰寫地獄:利用 MCP 讓 AI 替你完成維運最後一哩路 @ DevOpsDays 2026
j796160836
0
96
ArgoCD 新手村:告別手動部署,從 0 到 1 打造自動化部署路徑 @ CNTUG meetup #73
j796160836
0
51
CI/CD 落地指南:用開源 Jenkins & Ansible 打造自動化部署平台 @ DevOps Taiwan Meetup #76
j796160836
0
41
全端 AI 實戰:Gemini x Antigravity 快速開發與 PentestGPT 滲透攻防實務
j796160836
0
87
Event Driven Ansible (EDA) 使用情境分享 @ Red Hat Ansible User Club 線上交流會
j796160836
0
49
用 Gemma 3 開放模型來解決企業難解的問題 @ COSCUP 2025
j796160836
0
72
[GDG Build with AI] 善用現代 AI 科技:打造專屬行銷工具箱 @ GDG Changhua 彰化
j796160836
0
69
Kubernetes 地端自建 v.s. GKE,哪個更適合你? @Devfest Taipei 2024
j796160836
0
120
地端自建 Kubernetes (K8s) 小宇宙 (On-premises Kubernetes) @ CNTUG 2024/11 Meetup #63
j796160836
0
83
Other Decks in Programming
See All in Programming
XHTMLが残したもの
yosuke_furukawa
PRO
2
650
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
230
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
130
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
7
3.6k
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
150
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
230
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
130
高専キャリア LT 発表内容
crysta1221
6
5.6k
AIの中の人になってみる
htkym
0
170
typoなんかねぇよ
raspython3
0
680
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
150
Featured
See All Featured
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Designing Powerful Visuals for Engaging Learning
tmiket
1
540
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
The Cult of Friendly URLs
andyhume
79
7k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Automating Front-end Workflow
addyosmani
1369
210k
Marketing to machines
jonoalderson
1
5.8k
Transcript
炎炎夏⽇日學 Android Johnny Sung Part2: Android 元件介紹
Mobile Device developer Johnny Sung https://fb.com/j796160836 https://blog.jks.coffee/ https://www.slideshare.net/j796160836 https://github.com/j796160836
⼤大綱 • 軟體設計介紹 • Android 專案資料夾結構介紹 • Android 部件介紹
軟體設計 • 企劃 • UI/UX 介⾯面設計(美術) • 程式 • 測試
開⼀一個新專案吧!
None
None
專案資料夾結構 寫程式區 編譯資訊 / Logcat / Debug ⾯面版 / 搜尋⾯面板...等
資料夾結構 • app 模組 • AndroidManifest.xml • Kotlin 程式檔案 •
Gradle 設定檔檔案 • 畫⾯面 XML 檔案 ( res/layout ) • 圖片檔案 ( res/drawable ) • 字串串檔 ( res/values/strings.xml )
app 模組 AndroidManifest.xml Kotlin 程式檔案 單元測試 (Unit test) 檔案 Gradle
設定檔檔案 畫⾯面 XML 檔案 圖片檔案 字串串檔
畫⾯面 XML 檔案
Gradle 設定檔檔案(app 模組)
Gradle 設定檔檔案(專案)
Kotlin 程式檔案 (MainActivity.kt)
MVC
Model View Controller 控制器 模型 視圖
Controller View Model 控制器 模型 視圖 Activity Fragment
Layout
View 視圖
Layout • LinearLayout • FrameLayout • RelativeLayout • ConstraintLayout
LinearLayout 線性布局 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="wrap_content"/> <View
android:layout_width="match_parent" android:layout_height="wrap_content"/> <View android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
FrameLayout 框架布局 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="150sp" android:text="T"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="200sp" android:text="A"/> </FrameLayout>
Layout 畫⾯面參參數 android:layout_width="match_parent" android:layout_height="match_parent" 元件的⾼高度 元件的寬度 match_parent 符合⽗父親⼤大⼩小 wrap_content 符合內容⼤大⼩小
150dp 指定 dp 寬度(例例如:150dp) 0dp 依照特定規則執⾏行行
Layout 畫⾯面參參數 android:layout_marginTop="5dp" android:layout_marginLeft="5dp" android:layout_marginStart="5dp" android:layout_marginRight="5dp" android:layout_marginEnd="5dp" android:layout_marginBottom="5dp" Margin android:paddingTop="10dp"
android:paddingLeft="10dp" android:paddingStart="10dp" android:paddingRight="10dp" android:paddingEnd="10dp" android:paddingBottom="10dp" Padding
LinearLayout android:orientation="vertical" android:orientation="horizontal" 排列列⽅方向為⽔水平(由左⽽而右) 排列列⽅方向 排列列⽅方向為垂直(由上⽽而下)
RelativeLayout 相對布局 http://fiend1120.pixnet.net/blog/post/191809863 android:layout_above 將此元件置於"指定元件"(使⽤用元件id指定)上⽅方. android:layout_below 將此元件置於"指定元件"(使⽤用元件id指定)下⽅方. android:layout_toLeftOf 將此元件置於"指定元件"(使⽤用元件id指定)左⽅方. android:layout_toRightOf
將此元件置於"指定元件"(使⽤用元件id指定)右⽅方.
RelativeLayout 相對布局 http://fiend1120.pixnet.net/blog/post/191809863 android:layout_alignParentTop 將此元件對⿑齊於佈局畫⾯面上邊線 android:layout_alignParentRight 將此元件對⿑齊於佈局畫⾯面右邊線 android:layout_alignParentLeft 將此元件對⿑齊於佈局畫⾯面左邊線 android:layout_alignParentBottom
將此元件對⿑齊於佈局畫⾯面底線 android:layout_centerHorizontal 將該元件⽔水平居中於整個布局畫⾯面 android:layout_centerVertical 將該元件垂直居中於整個布局畫⾯面 android:layout_centerInParent 將該元件⽔水平及垂直均居中於整個布局畫⾯面
RelativeLayout 相對布局 <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <View android:id="@+id/view1" android:layout_width="match_parent" android:layout_height="wrap_content"/> <View
android:id="@+id/view2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/view1"/> <View android:id="@+id/view3" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/view2"/> </RelativeLayout>
RelativeLayout • 對⿑齊類 android:layout_alignParentLeft 靠左對⿑齊,(吸附邊框左邊) android:layout_alignParentTop 靠上對⿑齊,(吸附邊框上⽅方) android:layout_alignParentRight 靠右對⿑齊,(吸附邊框右邊) android:layout_alignParentBottom
靠下對⿑齊,(吸附邊框下⽅方) android:layout_centerInParent 置中,(計算放在正中間)
TextView • android:text="Hello!" • android:background="#ff384c0a" • android:textColor="#ffe5d9ff" • android:textSize="35sp"
dp? px? 單位長度⼤大集合 • 螢幕長度 • px (pixel) 像素,RGB螢幕三原⾊色合成的⼀一個彩⾊色點 •
物理理長度 • inch (inches) 英吋,1 Inch = 2.54 cm • pt (points) 點數,1pt = 1/72 Inch = 0.352777778 mm
1px (pixel) 像素 http://img01.hc360.cn/01/busin/166/732/b/01-166732201.jpg
dp? px? 單位長度⼤大集合 • 密度 • dpi (dot per inch):⼀一英吋有幾個
點 • ppi (pixel per inch):⼀一英⼨寸有多少 像素
https://blog.prototypr.io/designing-for-multiple-screen-densities-on-android-5fba8afe7ead 密度 (Density)
密度 (Density) ( > 300dpi = Retina ) 160dpi (mdpi)
326dpi (xhdpi) iPhone 3Gs iPhone 4
dp? px? 單位長度⼤大集合 •dp, dip (Density-Independent Pixels) 對應到在 160 dpi
的螢幕上的幾個 px(像素) • 1 dp = 1/160 Inch = 0.15875 mm •sp (Scale Independent Pixels) 對應在 160 dpi 的螢幕上的幾個 pt。
https://blog.prototypr.io/designing-for-multiple-screen-densities-on-android-5fba8afe7ead 密度 (Density)
我的圖應該要多⼤大? • px = dip * (density / 160) •
dip = px / (density / 160) • sp = pt * (density / 160) • 2:3:4:6:8 scaling ratio
我的圖應該要多⼤大? • ldpi (low) ~120dpi • mdpi (medium) ~160dpi •
hdpi (high) ~240dpi • xhdpi (extra-high) ~320dpi • xxhdpi (extra-extra-high) ~480dpi • xxxhdpi (extra-extra-extra-high) ~640dpi https://www.pixplicity.com/dp-px-converter
https://blog.prototypr.io/designing-for-multiple-screen-densities-on-android-5fba8afe7ead
https://blog.prototypr.io/designing-for-multiple-screen-densities-on-android-5fba8afe7ead
https://material.io/tools/devices/
https://www.pixplicity.com/dp-px-converter
Controller Activity Fragment 控制器
my_button.setOnClickListener { // ... } <Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按⼀一下!"
/> import kotlinx.android.synthetic.main.activity_main.* activity_main.xml MainActivity.kt
findViewById
Android Lifecycle (⽣生命週期)
https://www.youtube.com/watch?v=6KMm0quizrQ
https://www.youtube.com/watch?v=6KMm0quizrQ
https://android.i-visionblog.com/trip-on-android-activity-life-cycle-%EF%B8%8F-3ea59a3261fb
https://android.i-visionblog.com/trip-on-android-activity-life-cycle-%EF%B8%8F-3ea59a3261fb
Thread 執⾏行行緒
https://www.taiwanviptravel.com/see-join-puppet-theater-restaurant-2/
https://flipedu.parenting.com.tw/article/4060 Main Thread (UI Thread) 主執⾏行行緒 Thread 1 Thread 2
Thread 3 ...
val mainHandler = Handler(Looper.getMainLooper()) val thread = Thread(Runnable { //
Do something mainHandler.post { // My result } }) thread.start() (把繁重的事情放在這) (回傳結果給 Main Thread 顯⽰示)
Model 模型
單元測試原則 • Arrange – 準備,準備輸入資料與期待值 • Act – 執⾏行行,執⾏行行測試對象 •
Assert – 驗證,驗證結果 3A 原則
class ExampleUnitTest { @Test fun addition_isCorrect() { // Arrange val
expected = 4 // Act val actual = 2 + 2 // Assert assertEquals(expected, actual) } } Arrange 準備 Act 執⾏行行 Aessrt 驗證
休息⼀一下 ☕
等等來來⼩小試⾝身⼿手!