3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Android】Viewをドラッグして移動させる【Kotlin】

Last updated at Posted at 2024-01-28

はじめに

今回は Viewをドラッグして動かすアニメーションを色々触ったのでその一部をメモがわりに記事にしておこうと思います。

実践

サクッと 初期設定のHello World!を動かしていきます。

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val textView: TextView = findViewById(R.id.text_view)

                // タッチする前のViewの位置を常に持っておきたいので、TouchListener外でインスタンス化
        var oldPositionX = 0
        var oldPositionY = 0

        textView.setOnTouchListener { view, event ->![Something went wrong]()

            val newPositionX = event.rawX.toInt()
            val newPositionY = event.rawY.toInt()
            
            when (event.action) {
                MotionEvent.ACTION_MOVE -> {
                       // 移動後のViewの4辺の位置を取得
                    val viewLeftPosition: Int = view.left + (newPositionX - oldPositionX)
                    val viewRightPoint: Int = viewLeftPosition + view.width
                    val viewTopPosition: Int = view.top + (newPositionY - oldPositionY)
                    val viewUnderPoint: Int = viewTopPosition + view.height
                    
                    // 画像の位置を設定する
                    view.layout(viewLeftPosition, viewTopPosition, viewRightPoint, viewUnderPoint)
                }

                else -> {}
            }
            
            // タッチした位置を古い位置とする
            oldPositionX = newPositionX
            oldPositionY = newPositionY
            
            return@setOnTouchListener true
        }
    }

このように動かすことができます!
Videotogif.gif

離した時に元の位置に戻す

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val textView: TextView = findViewById(R.id.text_view)

        var oldPositionX = 0
        var oldPositionY = 0
+        // 元々Viewの位置
+        var homePositionX = 0
+        var homePositionY = 0
+        // Viewが動いた否か
+        var isHomePosition = true

        textView.setOnTouchListener { view, event ->
+            if (isHomePosition) {
+                homePositionX = view.left
+                homePositionY = view.top
+                isHomePosition = false
+            }

            val newPositionX = event.rawX.toInt()
            val newPositionY = event.rawY.toInt()
            when (event.action) {
                MotionEvent.ACTION_MOVE -> {
                    val viewLeftPosition: Int = view.left + (newPositionX - oldPositionX)
                    val viewTopPosition: Int = view.top + (newPositionY - oldPositionY)
                    val viewRightPoint: Int = viewLeftPosition + view.width
                    val viewUnderPoint: Int = viewTopPosition + view.height
                    
                    // 画像の位置を設定する
                    view.layout(viewLeftPosition, viewTopPosition, viewRightPoint, viewUnderPoint)
                }
                
+                MotionEvent.ACTION_UP -> {
+                    // Viewの位置を元に戻す
+                    // それぞれ四角の位置を記録しておいた
+                    view.layout(
+                        homePositionX,
+                        homePositionY,
+                        homePositionX + view.width,
+                        homePositionY + view.height
+                    )
+                }

                else -> {}
            }
            
            // タッチした位置を古い位置とする
            oldPositionX = newPositionX
            oldPositionY = newPositionY
            
            return@setOnTouchListener true
        }
    }
}

真ん中へ戻るようになります!
Videotogif (1).gif

おわりに

今回は 今後もどこかで使えそうだなって内容を再度調べ直して1から実装するのは、些か勿体無いなと感じたので 自分で作ったアニメーションの実装を復習ついでに記事にしてみました。
アニメーション関連は動きが直感的に分かりやすく、自分のやりたい動きにできた時の達成感がありますね。
他のアニメーションもいくつか作ったので後々記事にできたらと思います。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?