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
9-patchで画像の一部分を伸縮させる
Search
Shirataki
January 31, 2025
Programming
230
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
9-patchで画像の一部分を伸縮させる
Shibuya.apk#51で発表した内容です!
Shirataki
January 31, 2025
More Decks by Shirataki
See All by Shirataki
海外のアプリで見かけたかっこいいTransitionを真似てみる
shogotakasaki
1
360
Other Decks in Programming
See All in Programming
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
310
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
320
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
200
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
430
一人だけ、Kiroが静止する日
hideg
0
130
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
530
Workers Cache を知る
syumai
0
290
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
130
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
240
Webの地図
yosuke_furukawa
PRO
6
4.8k
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
690
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
170
Featured
See All Featured
From π to Pie charts
rasagy
1
380
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
440
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
330
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.9k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
520
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
680
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
340
Building the Perfect Custom Keyboard
takai
2
890
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Facilitating Awesome Meetings
lara
57
7.1k
Transcript
4IPHP5BLBTBLJ 4IJCVZBBQL QBUDIͰը૾ͷ Ұ෦Λ৳ॖͤ͞Δ
ࣗݾհ w 4IPHP5BLBTBLJ w "OESPJEΤϯδχΞ w ৽ଔ!%F/" 1PDPDIB
ϝοηʔδΞϓϦͰΑ͘ݟΔ6* w ςΩετྖҬʹԠͯ͡ਧ͖ग़͕͠৳ॖ
ϝοηʔδΞϓϦͰΑ͘ݟΔ6* w ςΩετྖҬʹԠͯ͡ਧ͖ग़͕͠৳ॖ w ෦తʹ৳ͼͯཉ͍͠ʂ
1/(ϑΝΠϧΛར༻͢Δ߹ w 1/(Λͦͷ··͏ͱʜ
1/(ϑΝΠϧΛར༻͢Δ߹ w ը૾શମ͕ۉҰʹ৳ॖ
1/(ϑΝΠϧΛར༻͢Δ߹ ཧ ݱ࣮
1/(ϑΝΠϧΛར༻͢Δ߹ w ը૾શମ͕ۉҰʹ৳ॖ w 5BJM෦ͷ6*่͕ΕΔ
1/(ϑΝΠϧΛར༻͢Δ߹ w ը૾શମ͕ۉҰʹ৳ॖ w 5BJM෦ͷ6*่͕ΕΔ w ԑͷತԜ͕ڧௐ
ը૾Λ៉ྷʹ৳ॖͤ͞Δํ๏ w ෳࡶͳॲཧΛॻ͘ඞཁ͕͋Γͦ͏ w ը૾ॲཧඞཁ͔ʜ େมͦ͏ʜ
ը૾Λ៉ྷʹ৳ॖͤ͞Δํ๏ w ෳࡶͳॲཧΛॻ͘ඞཁ͕͋Γͦ͏ w ը૾ॲཧඞཁ͔ʜ w QBUDIը૾Ͱ؆୯ʹղܾʂ
QBUDIը૾ͱ w ը૾ͷपғϐΫηϧʹใΛຒΊࠐΜͩQOHϑΝΠϧ w ্ลɿਫฏํͷ৳ॖྖҬ w ࠨลɿਨํͷ৳ॖྖҬ w ఈลɿਫฏํͷίϯςϯπྖҬ w
ӈลɿਨํͷίϯςϯπྖҬ QBUDIը૾ͷ֓ཁ ը૾Ҿ༻IUUQTEFWFMPQFSBOESPJEDPNEFWFMPQVJ WJFXTHSBQIJDTESBXBCMFTOJOFQBUDI
QBUDIը૾ͷ࡞Γํ w "OESPJE4UVEJPͰ࡞Մೳʂ ը૾ΛӈΫϦοΫˠ$SFBUFQBUDIpMF
QBUDIը૾ͷ࡞Γํ w "OESPJE4UVEJPͰ࡞Մೳʂ ը૾ΛӈΫϦοΫˠ$SFBUFQBUDIpMF (6*Ͱ৳ॖྖҬΛఆٛ w ɿҰํ w ϐϯΫɿೋํ
QBUDIը૾ͷ࡞Γํ w "OESPJE4UVEJPͰ࡞Մೳʂ ը૾ΛӈΫϦοΫˠ$SFBUFQBUDIpMF (6*Ͱ৳ॖྖҬΛఆٛ w ɿҰํ w ϐϯΫɿೋํ ਨํʹ͔͠৳ͼͳ͍
QBUDIը૾ͷ࡞Γํ w "OESPJE4UVEJPͰ࡞Մೳʂ ը૾ΛӈΫϦοΫˠ$SFBUFQBUDIpMF (6*Ͱ৳ॖྖҬΛఆٛ w ɿҰํ w ϐϯΫɿೋํ มԽ͠ͳ͍
QBUDIը૾ͷදࣔ w #PYͷഎܠʹQBUDIը૾Λઃఆ fun Modifier.draw9Patch( context: Context, @DrawableRes ninePatchRes: Int,
) = this.drawBehind { drawIntoCanvas { ContextCompat.getDrawable(context, ninePatchRes)?.let { ninePatch -> ninePatch.run { bounds = Rect(0, 0, size.width.toInt(), size.height.toInt()) draw(it.nativeCanvas) } } } } QBUDIը૾Λഎܠʹඳը͢Δ.PEJpFSͷ֦ுؔ
QBUDIը૾ͷදࣔ w #PYͷഎܠʹQBUDIը૾Λઃఆ fun Modifier.draw9Patch( context: Context, @DrawableRes ninePatchRes: Int,
) = this.drawBehind { drawIntoCanvas { ContextCompat.getDrawable(context, ninePatchRes)?.let { ninePatch -> ninePatch.run { bounds = Rect(0, 0, size.width.toInt(), size.height.toInt()) draw(it.nativeCanvas) } } } } @Composable fun DynamicSpeechBubble( text: String, @DrawableRes bubbleImageRes: Int, paddingValues: PaddingValues, ) { val context = LocalContext.current Box( Modifier.draw9Patch(context = context, ninePatchRes = bubbleImageRes), ) { Text( text = text, color = Color.Black, modifier = Modifier.padding(paddingValues), ) } }
QBUDIը૾ͷҙ w +FUQBDL$PNQPTFͷQBJOUFS3FTPVSDFͰಡΈࠐΊͳ͍ w $PJMͷSFNFNCFS"TZOD*NBHF1BJOUFSͰಡΈࠐΊΔ͕ɺ ௨ৗͷ1/(ͱͯ͠ඳը͞ΕΔ ˠ$BOWBT9.-Λ༻͍ͯඳը͢Δ
QBUDIը૾ͷҙ w ը૾ͷੑ࣭ʹΑͬͯద͞ͳ͍ w άϥσʔγϣϯը૾ ը૾Ҿ༻IUUQT EFWFMPQFSBOESPJEDPNEFWFMPQVJ DPNQPTFHSBQIJDTESBXCSVTI IMKB
QBUDIը૾ͷҙ w ը૾ͷੑ࣭ʹΑͬͯద͞ͳ͍ w ܗঢ়͕ෳࡶͳը૾
ࢀߟ w IUUQTEFWFMPQFSBOESPJEDPNTUVEJPXSJUFESBXQBUDI w IUUQTEFWFMPQFSBOESPJEDPNEFWFMPQVJWJFXTHSBQIJDT ESBXBCMFTOJOFQBUDI w IUUQTTUBDLPWFSqPXDPNRVFTUJPOTIPXUPVTFB QBUDIESBXBCMFQOHJONZTDSFFOVTJOHKFUQBDLDPNQPTF