美文网首页
Android 跟随手指移动View

Android 跟随手指移动View

作者: Ello_Orld | 来源:发表于2024-04-21 15:34 被阅读0次

要移动的View XML布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:background="@android:color/holo_blue_bright">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Main" />

</FrameLayout>

把这个View放到父容器里,用于判断手指位置:

package com.example.fingermoveview

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.widget.FrameLayout
import com.example.fingermoveview.databinding.ViewMoveBinding

/**
 * 自由移动的view
 * @author du_xi
 * Created at 2024/4/22
 */
class MoveView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr), View.OnTouchListener {

    private val viewBinding = ViewMoveBinding.inflate(LayoutInflater.from(context), this, true)


    init {
        setOnTouchListener(this)
    }

    private var downPoint = floatArrayOf(0f, 0f)
    private var trans = floatArrayOf(0f, 0f)

    override fun onTouch(v: View?, event: MotionEvent?): Boolean {
        when (event?.action) {
            MotionEvent.ACTION_DOWN -> {
                val inArea =
                    event.x > viewBinding.root.x && event.x < viewBinding.root.x + viewBinding.root.width && event.y > viewBinding.root.y && event.y < viewBinding.root.y + viewBinding.root.height
                if (inArea) {
                    downPoint = floatArrayOf(event.x, event.y)
                    trans =
                        floatArrayOf(viewBinding.root.translationX, viewBinding.root.translationY)
                    return true
                }
            }

            MotionEvent.ACTION_MOVE -> {
                if (event.x == downPoint[0] && event.y == downPoint[1]) {
                    return true
                }
                viewBinding.root.translationY = trans[1] + event.y - downPoint[1]
                viewBinding.root.translationX = trans[0] + event.x - downPoint[0]
                return true
            }

            MotionEvent.ACTION_UP -> {
                downPoint = floatArrayOf(0f, 0f)
            }
        }
        return false
    }


}

使用方法:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.example.fingermoveview.MoveView
        android:id="@+id/move_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
</androidx.constraintlayout.widget.ConstraintLayout>

代码:https://gitee.com/duxiaolong/FingerMoveView

相关文章

网友评论

      本文标题:Android 跟随手指移动View

      本文链接:https://www.haomeiwen.com/subject/vzevxjtx.html