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でもドラッグ&ドロップがしたい!
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
m.coder
October 05, 2022
Technology
1.9k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Androidでもドラッグ&ドロップがしたい!
DroidKaigi2022 Day2 14:05-14:30 (Online) の発表スライドです。
m.coder
October 05, 2022
More Decks by m.coder
See All by m.coder
なんとかする力 〜 Android エンジニアからマネージャー、さらにその先へ? 〜
m_coder
2
650
小さいアウトプットを続けること
m_coder
1
230
Compose で Android/iOS アプリを作る
m_coder
0
7.6k
アプリのメンテナンス画面・強制アップデートを再考する #DroidKaigi
m_coder
5
8.9k
Other Decks in Technology
See All in Technology
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
230
How to Design Configuration for Rails Applications
willnet
1
720
LambdaWebFunctionsを試してみた / exploring-lambda-web-functions
koukihosaka
0
310
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
190
事業成長とデータ活用を止めないためのマネジメントへ挑戦
hiracky16
0
380
NDIでApple Vision Proにリアルタイム映像送信
jyouryuusui
0
120
Local CI × GitHub Actions
gogutan
2
140
V8のArray.prototype.flatを最大約20倍速くするまでと、巨大OSSへの大規模コミットの道のり
riyaamemiya
0
290
AIにシークレットを見せない、WSL2で安全な開発環境
yazm
0
280
M5Stackで作る BLEマウス GPSログの世界
tomokusaba
0
410
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
4
1.1k
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
3
1k
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
WENDY [Excerpt]
tessaabrams
14
40k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
260
First, design no harm
axbom
PRO
2
1.3k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
600
The agentic SEO stack - context over prompts
schlessera
0
970
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
500
Ethics towards AI in product and experience design
skipperchong
2
430
Art, The Web, and Tiny UX
lynnandtonic
304
22k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Transcript
Copyright 2022 m.coder All Rights Reserved. 1 Androidでもドラッグ&ドロップがしたい! m.coder
Copyright 2022 m.coder All Rights Reserved. 2 自己紹介 m.coder (
@_m_coder ) フラー株式会社所属 Androidテックリード DroidKaigi 2021で「アプリのメンテナンス画面・強制アップ デートを再考する」という発表をしました https://droidkaigi.jp/2021/timetable/276757?day=1 個人ブログ始めました https://nanaten.github.io/blog/
Copyright 2022 m.coder All Rights Reserved. 3 こんな要望をもらったことありませんか?
Copyright 2022 m.coder All Rights Reserved. 4 「この操作、ドラッグ&ドロップで できるようにならない?」
Copyright 2022 m.coder All Rights Reserved. 5 こう言われた時の第一印象は?
Copyright 2022 m.coder All Rights Reserved. 6 「やったことない」 「難しそう」
Copyright 2022 m.coder All Rights Reserved. 7 (なんとかしてやらない方向に 持っていけないかな)
Copyright 2022 m.coder All Rights Reserved. 8 わかります
Copyright 2022 m.coder All Rights Reserved. 9 「ホーム画面だと普通にできてるのに…」 「iOSだと並び替え操作あるのに…」
Copyright 2022 m.coder All Rights Reserved. 10 ホーム画面 ( Android
) ドラッグ&ドロップで並び替えやフォルダ作成が可能
Copyright 2022 m.coder All Rights Reserved. 11 UITableView ( iOS
) ドラッグ&ドロップでリストの並び替えが可能 ※注:内部実装は自前で行う必要あり
Copyright 2022 m.coder All Rights Reserved. 12 「あれはOSがやってることなので!」 「iOSはiOS、AndroidはAndroid!」
Copyright 2022 m.coder All Rights Reserved. 13 わかります
Copyright 2022 m.coder All Rights Reserved. 14 ドラッグ&ドロップ操作ができるアプリ、 パッと思いつかない
Copyright 2022 m.coder All Rights Reserved. 15 逆に、実装できるエンジニアは 貴重なのでは?
Copyright 2022 m.coder All Rights Reserved. 16 「他の人が実装したことのないUI」を 実装してみませんか?
Copyright 2022 m.coder All Rights Reserved. 17 Androidでも ドラッグ&ドロップがしたい!
Copyright 2022 m.coder All Rights Reserved. 18 テーマ • リストのドラッグ&ドロップ操作の概要を知る
• アプリ内のドラッグ&ドロップ • アプリ間のドラッグ&ドロップ
Copyright 2022 m.coder All Rights Reserved. 19 テーマ • リストのドラッグ&ドロップ操作の概要を知る
• アプリ内のドラッグ&ドロップ • アプリ間のドラッグ&ドロップ 【ゴール】 ドラッグ&ドロップの実装を(難しそうという理由で) 選択肢から外す人を減らせるといいな
01 | RecyclerView のドラッグ&ドロップ 02 | Jetpack DragAndDrop 03 |
Jetpack Compose のドラッグ&ドロップって?(オマケ) アジェンダ Copyright 2022 m.coder All Rights Reserved. アジェンダ 20
Copyright 2022 m.coder All Rights Reserved. 21 RecyclerViewのドラッグ&ドロップ
Copyright 2022 m.coder All Rights Reserved. val itemTouchHelper = ItemTouchHelper(
object : ItemTouchHelper.SimpleCallback( ItemTouchHelper. UP or ItemTouchHelper. DOWN, ItemTouchHelper. LEFT) { override fun onMove( recyclerView: RecyclerView , viewHolder: RecyclerView.ViewHolder , target: RecyclerView.ViewHolder , ): Boolean { return true } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { /* NO USE */ } } ) itemTouchHelper.attachToRecyclerView(recyclerView) 22 RecyclerViewのドラッグ&ドロップ ItemTouchHelperを使って実装する
Copyright 2022 m.coder All Rights Reserved. val itemTouchHelper = ItemTouchHelper(
object : ItemTouchHelper.SimpleCallback( ItemTouchHelper. UP or ItemTouchHelper. DOWN, ItemTouchHelper. LEFT) { override fun onMove( recyclerView: RecyclerView , viewHolder: RecyclerView.ViewHolder , target: RecyclerView.ViewHolder , ): Boolean { return true } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { /* NO USE */ } } ) itemTouchHelper.attachToRecyclerView(recyclerView) 23 RecyclerViewのドラッグ&ドロップ ItemTouchHelperを使って実装する ItemTouchHelper.SimpleCallbackを利用すると比較的簡単 に実装可能
Copyright 2022 m.coder All Rights Reserved. val itemTouchHelper = ItemTouchHelper(
object : ItemTouchHelper.SimpleCallback( ItemTouchHelper. UP or ItemTouchHelper. DOWN, ItemTouchHelper. LEFT) { override fun onMove( recyclerView: RecyclerView , viewHolder: RecyclerView.ViewHolder , target: RecyclerView.ViewHolder , ): Boolean { return true } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { /* NO USE */ } } ) itemTouchHelper.attachToRecyclerView(recyclerView) 24 RecyclerViewのドラッグ&ドロップ ItemTouchHelperを使って実装する ItemTouchHelper.SimpleCallbackを利用すると比較的簡単 に実装可能
Copyright 2022 m.coder All Rights Reserved. val itemTouchHelper = ItemTouchHelper(
object : ItemTouchHelper.SimpleCallback( ItemTouchHelper. UP or ItemTouchHelper. DOWN, ItemTouchHelper. LEFT) { override fun onMove( recyclerView: RecyclerView , viewHolder: RecyclerView.ViewHolder , target: RecyclerView.ViewHolder , ): Boolean { return true } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { /* NO USE */ } } ) itemTouchHelper.attachToRecyclerView(recyclerView) 25 RecyclerViewのドラッグ&ドロップ ItemTouchHelperを使って実装する ItemTouchHelper.SimpleCallbackを利用すると比較的簡単 に実装可能 最低限override必要なメソッド - onMove - onSwiped(スワイプ操作が必要ない場合でもoverride必 須)
Copyright 2022 m.coder All Rights Reserved. val itemTouchHelper = ItemTouchHelper(
object : ItemTouchHelper.SimpleCallback( ItemTouchHelper. UP or ItemTouchHelper. DOWN, ItemTouchHelper. LEFT) { override fun onMove( recyclerView: RecyclerView , viewHolder: RecyclerView.ViewHolder , target: RecyclerView.ViewHolder , ): Boolean { return true } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { /* NO USE */ } } ) itemTouchHelper.attachToRecyclerView(recyclerView) 26 RecyclerViewのドラッグ&ドロップ ItemTouchHelperを使って実装する ItemTouchHelper.SimpleCallbackを利用すると比較的簡単 に実装可能 最低限override必要なメソッド - onMove - onSwiped(スワイプ操作が必要ない場合でもoverride必 須) attachToRecyclerView でドラッグ操作したい RecyclerView にItemTouchHelper をセットする
Copyright 2022 m.coder All Rights Reserved. 27 RecyclerViewのドラッグ&ドロップ ドラッグはできるが…
Copyright 2022 m.coder All Rights Reserved. val itemTouchHelper = ItemTouchHelper(
object : ItemTouchHelper.SimpleCallback( ItemTouchHelper .UP or ItemTouchHelper. DOWN, ItemTouchHelper. LEFT) { override fun onMove( … ): Boolean { return true } override fun onMoved( recyclerView: RecyclerView , viewHolder: RecyclerView.ViewHolder , fromPos: Int , target: RecyclerView.ViewHolder , toPos: Int , x: Int , y: Int , ) { adapter.notifyItemMoved(fromPos, toPos) } … } ) itemTouchHelper.attachToRecyclerView(recyclerView) 28 RecyclerViewのドラッグ&ドロップ onMoved にドラッグ成功時の処理を書く 左のコードでは adapter.notifyItemMoved() で RecyclerView.Adapterに変更を通知している
Copyright 2022 m.coder All Rights Reserved. 29 RecyclerViewのドラッグ&ドロップ リストにドラッグ&ドロップの状態が反映される ※表示上しか反映されていないことに注意。
実際にはViewModelなどのリストを操作して リストの中身を並び替える必要がある
Copyright 2022 m.coder All Rights Reserved. val itemTouchHelper = ItemTouchHelper(
object : ItemTouchHelper.SimpleCallback( ItemTouchHelper. UP or ItemTouchHelper. DOWN, ItemTouchHelper. LEFT) { … override fun onSelectedChanged ( viewHolder: RecyclerView.ViewHolder? , actionState: Int , ) { if (actionState == ACTION_STATE_DRAG) { // ドラッグ開始時 viewHolder?.itemView?.alpha = 0.5f } } override fun clearView( recyclerView: RecyclerView , viewHolder: RecyclerView.ViewHolder , ) { // ドラッグ操作終了時 viewHolder.itemView.alpha = 1.0f } … } ) itemTouchHelper.attachToRecyclerView(recyclerView) 30 RecyclerViewのドラッグ&ドロップ onSelectedChanged メソッド ドラッグ操作を開始した際に呼ばれる clearView メソッド ドラッグ操作を終了した際に呼ばれる
Copyright 2022 m.coder All Rights Reserved. 31 RecyclerViewのドラッグ&ドロップ ドラッグ開始時と終了時のViewの状態を変えられる
Copyright 2022 m.coder All Rights Reserved. 32 RecyclerViewのドラッグ&ドロップ ItemTouchHelperの注意点 onMove,
onMoved は他のアイテム上にドラッグされるたび に呼ばれる
Copyright 2022 m.coder All Rights Reserved. 33 RecyclerViewのドラッグ&ドロップ ItemTouchHelperの注意点 onMove,
onMoved は他のアイテム上にドラッグされるたび に呼ばれる API通信などを行う場合は要注意
Copyright 2022 m.coder All Rights Reserved. 34 Jetpack DragAndDrop
Copyright 2022 m.coder All Rights Reserved. 35 Jetpack DragAndDrop •
Google I/O 2022 で発表されたJetpackライブラリ • アプリ内やアプリ間のドラッグ&ドロップ操作をサポー ト • https://developer.android.com/jetpack/androidx/r eleases/draganddrop
Copyright 2022 m.coder All Rights Reserved. 36 Android Viewクラスに対応
Copyright 2022 m.coder All Rights Reserved. 37 アプリ内のドラッグ&ドロップ
Copyright 2022 m.coder All Rights Reserved. 38 Jetpack DragAndDrop ドラッグする側のView
Copyright 2022 m.coder All Rights Reserved. 39 Jetpack DragAndDrop ドロップする側のView
Copyright 2022 m.coder All Rights Reserved. 40 Jetpack DragAndDrop ドロップする側のView
現状のDragAndDropライブラリの対象範囲はドロップ側
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 41 Jetpack DragAndDrop DragStartHelperを用いる
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 42 Jetpack DragAndDrop DragStartHelperを用いる 引数にはドラッグ対象のViewとOnDragStartListenerを渡す
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 43 Jetpack DragAndDrop DragStartHelperを用いる 引数にはドラッグ対象のViewとOnDragStartListenerを渡す ドラッグ時のデータの設定を行う
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 44 Jetpack DragAndDrop DragStartHelperを用いる 引数にはドラッグ対象のViewとOnDragStartListenerを渡す ドラッグ時のデータの設定を行う startDragAndDropメソッドを実行する
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 45 Jetpack DragAndDrop DragStartHelperを用いる 引数にはドラッグ対象のViewとOnDragStartListenerを渡す ドラッグ時のデータの設定を行う startDragAndDropメソッドを実行する attach()を呼び出す
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 46 Jetpack DragAndDrop OnDragStartListener ClipData型のデータを扱える
Copyright 2022 m.coder All Rights Reserved. 47 ClipData ClipDataについて クリップボードへのデータコピーに用いられるクラス
https://developer.android.com/guide/topics/text/copy-p aste https://developer.android.com/reference/android/conte nt/ClipData
Copyright 2022 m.coder All Rights Reserved. 48 ClipData ClipDataについて クリップボードへのデータコピーに用いられるクラス
https://developer.android.com/guide/topics/text/copy-p aste https://developer.android.com/reference/android/conte nt/ClipData
Copyright 2022 m.coder All Rights Reserved. 49 ClipData ClipDataについて クリップボードへのデータコピーに用いられるクラス
https://developer.android.com/guide/topics/text/copy-p aste https://developer.android.com/reference/android/conte nt/ClipData
Copyright 2022 m.coder All Rights Reserved. 50 ClipData ClipDataについて クリップボードへのデータコピーに用いられるクラス
https://developer.android.com/guide/topics/text/copy-p aste https://developer.android.com/reference/android/conte nt/ClipData
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 51 Jetpack DragAndDrop OnDragStartListener ClipData型のデータを扱える
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 52 Jetpack DragAndDrop OnDragStartListener ClipData型のデータを扱える DragShadowBuilderでドラッグ時のViewの描画を設定
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 53 Jetpack DragAndDrop OnDragStartListener ClipData型のデータを扱える DragShadowBuilderでドラッグ時のViewの描画を設定 startDragAndDropの引数 ・ClipData ・DragShadowBuilder ・myLocalState(Object型) ・ドラッグ時の権限フラグ
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 54 Jetpack DragAndDrop OnDragStartListener ClipData型のデータを扱える DragShadowBuilderでドラッグ時のViewの描画を設定 startDragAndDropの引数 ・ClipData ・DragShadowBuilder ・myLocalState(Object型) ・ドラッグ時の権限フラグ
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val uri = Uri.parse( “{cat_image_uri}” ) val dragData = ClipData( "image", arrayOf("image/*"), ClipData.Item(uri) ) val builder = View.DragShadowBuilder(v) v.startDragAndDrop( dragData, builder, null, 0, ) } ).attach() 55 Jetpack DragAndDrop OnDragStartListener ClipData型のデータを扱える DragShadowBuilderでドラッグ時のViewの描画を設定 startDragAndDropの引数 ・ClipData ・DragShadowBuilder ・myLocalState(Object型) ・ドラッグ時の権限フラグ
Copyright 2022 m.coder All Rights Reserved. DropHelper.configureView( requireActivity() , dropImageView,
arrayOf("text/plain", "image/*"), OnReceiveContentListener { _, payload -> // 受け取ったPayloadの処理 payload } ) 56 Jetpack DragAndDrop DropHelper Jetpack DragAndDropで追加されたHelper configreView() でドロップさせたいViewに設定を行う
Copyright 2022 m.coder All Rights Reserved. DropHelper.configureView( requireActivity() , dropImageView,
arrayOf("text/plain", "image/*"), OnReceiveContentListener { _, payload -> // 受け取ったPayloadの処理 payload } ) 57 Jetpack DragAndDrop DropHelper Jetpack DragAndDropで追加されたHelper configreView() でドロップさせたいViewに設定を行う
Copyright 2022 m.coder All Rights Reserved. DropHelper.configureView( requireActivity() , dropImageView,
arrayOf("text/plain", "image/*"), OnReceiveContentListener { _, payload -> // 受け取ったPayloadの処理 payload } ) 58 Jetpack DragAndDrop DropHelper Jetpack DragAndDropで追加されたHelper configreView() でドロップさせたいViewに設定を行う
Copyright 2022 m.coder All Rights Reserved. DropHelper.configureView( requireActivity() , dropImageView,
arrayOf("text/plain", "image/*"), OnReceiveContentListener { _, payload -> // 受け取ったPayloadの処理 payload } ) 59 Jetpack DragAndDrop DropHelper Jetpack DragAndDropで追加されたHelper configreView() でドロップさせたいViewに設定を行う OnReceiveContentListenerで 受け取ったデータに応じた処理を行う
Copyright 2022 m.coder All Rights Reserved. DropHelper.configureView( requireActivity() , dropImageView,
arrayOf("text/plain", "image/*"), OnReceiveContentListener { _, payload -> val clip: ClipData = payload. clip when (clip.description.getMimeType(0)) { "text/plain" -> { // トースト表示 } "image/*" -> { val uri = clip.getItemAt( 0).uri dropImageView.setImageURI(uri) } } payload } ) 60 Jetpack DragAndDrop DropHelper Jetpack DragAndDropで追加されたHelper configreView() でドロップさせたいViewに設定を行う OnReceiveContentListenerで 受け取ったデータに応じた処理を行う
Copyright 2022 m.coder All Rights Reserved. 61 Jetpack DragAndDrop DropHelper
Jetpack DragAndDropで追加されたHelper configreView() でドロップさせたいViewに設定を行う OnReceiveContentListenerで 受け取ったデータに応じた処理を行う ドラッグ&ドロップが可能になる
Copyright 2022 m.coder All Rights Reserved. 62 アプリ間のドラッグ&ドロップ
Copyright 2022 m.coder All Rights Reserved. 63 Jetpack DragAndDrop アプリ間のドラッグ&ドロップ
Copyright 2022 m.coder All Rights Reserved. 64 Jetpack DragAndDrop アプリ間ドラッグ&ドロップの準備
1. startDragAndDrop のフラグ設定
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> // 省略 ClipDataの生成などなど … v.startDragAndDrop( dragData, builder, null, DRAG_FLAG_GLOBAL or DRAG_FLAG_GLOBAL_URI_READ ) } ).attach() 65 Jetpack DragAndDrop startDragAndDropに DRAG_FLAG_GLOBAL を指定するとアプリ間ドラッグ&ドロップが可能になる DRAG_FLAG_GLOBAL_URI_READ を指定するとURIの読み取りが可能になる
Copyright 2022 m.coder All Rights Reserved. 66 Jetpack DragAndDrop アプリ間ドラッグ&ドロップの準備
2. FileProviderやContentProviderを用いたURIの外部公開
Copyright 2022 m.coder All Rights Reserved. 67 Jetpack DragAndDrop FileProvider・ContentProvider?
→アプリ間でコンテンツを共有するためのクラス 外部アプリからURIを使ったアクセスを可能にする
Copyright 2022 m.coder All Rights Reserved. 68 Jetpack DragAndDrop FileProvider、ContentProviderについては
省略します 参考: https://developer.android.com/training/secure-file-sharing/setup-sharing https://developer.android.com/guide/topics/providers/content-provider-basics
Copyright 2022 m.coder All Rights Reserved. DragStartHelper( imageView, DragStartHelper.OnDragStartListener {
v, _ -> val bitmap = imageView.drawToBitmap() val fileName = "sample_photo.jpg" val tempFile = File( "{file_path}", fileName) // 省略 一時ファイルにFileOutputStream を用いて書き込み val uri = FileProvider.getUriForFile( requireContext() , BuildConfig.APPLICATION_ID + ".provider", tempFile ) // 省略 ClipDataの生成などなど … v.startDragAndDrop( dragData, builder, null, DRAG_FLAG_GLOBAL or DRAG_FLAG_GLOBAL_URI_READ ) } ).attach() 69 Jetpack DragAndDrop FileProviderやContentProviderなどを用いて、URIを適切に 外部アプリから読み取れるようにする
Copyright 2022 m.coder All Rights Reserved. 70 Jetpack DragAndDrop アプリ間ドラッグ&ドロップDone!
Copyright 2022 m.coder All Rights Reserved. 71 【小ネタ】 Jetpack Composeの
ドラッグ&ドロップ…?
Copyright 2022 m.coder All Rights Reserved. 72 まだです
Copyright 2022 m.coder All Rights Reserved. Modifier.pointerInput(Unit) { detectDragGestures( onDrag
= { /* ドラッグ */ }, onDragStart = { /* ドラッグ開始 */ }, onDragEnd = { /* ドラッグ終了 */ }, onDragCancel = { /* ドラッグキャンセル */ } ) } 73 Jetpack Compose detectDragGestures ドラッグ操作の検出は可能そう それ以上の操作は全て自前でやる必要がありそう
Copyright 2022 m.coder All Rights Reserved. 74 Jetpack Composeのドラッグ&ドロップ ロードマップには載っている
https://developer.android.google.cn/jetpack/androidx/c ompose-roadmap
Copyright 2022 m.coder All Rights Reserved. 75 まとめ • ItemTouchHelper
◦ リストの並び替えを実装したい時 • Jetpack DragAndDrop ◦ リスト以外のUIでドラッグ&ドロップを実装したい時 ◦ アプリ間のドラッグ&ドロップを実装したい時 • Jetpack Composeのドラッグ&ドロップ ◦ もう少し待つ必要がありそう
Copyright 2022 m.coder All Rights Reserved. 76 おわり