要实现 FloatingActionButton 可以拖动到任意位置并且不吸附的效果,你可以使用以下步骤:

  1. 在 build.gradle 文件中,添加以下依赖项:
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'com.google.android.material:material:1.4.0'
  1. 在布局文件中,添加 ConstraintLayout 和 FloatingActionButton:
<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/constraintLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 添加其他布局元素 -->

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/floatingActionButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_baseline_add_24"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
  1. 在 MainActivity 中,实现拖动功能:
import android.annotation.SuppressLint
import android.graphics.Rect
import android.view.MotionEvent
import android.view.View
import android.widget.RelativeLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import com.google.android.material.floatingactionbutton.FloatingActionButton

class MainActivity : AppCompatActivity() {

    private lateinit var constraintLayout: ConstraintLayout
    private lateinit var floatingActionButton: FloatingActionButton
    private var dX: Float = 0f
    private var dY: Float = 0f

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

        constraintLayout = findViewById(R.id.constraintLayout)
        floatingActionButton = findViewById(R.id.floatingActionButton)

        floatingActionButton.setOnTouchListener(FloatingActionButtonTouchListener())
    }

    inner class FloatingActionButtonTouchListener : View.OnTouchListener {
        @SuppressLint("ClickableViewAccessibility")
        override fun onTouch(view: View, event: MotionEvent): Boolean {
            val layoutParams = view.layoutParams as RelativeLayout.LayoutParams
            val action = event.action
            when (action) {
                MotionEvent.ACTION_DOWN -> {
                    dX = view.x - event.rawX
                    dY = view.y - event.rawY
                    return true
                }
                MotionEvent.ACTION_MOVE -> {
                    val newX = event.rawX + dX
                    val newY = event.rawY + dY

                    // 确保浮动按钮不超出父布局的边界
                    val parentRect = Rect()
                    constraintLayout.getDrawingRect(parentRect)
                    val floatingButtonRect = Rect(
                        newX.toInt(),
                        newY.toInt(),
                        newX.toInt() + view.width,
                        newY.toInt() + view.height
                    )
                    if (parentRect.contains(floatingButtonRect)) {
                        layoutParams.leftMargin = newX.toInt()
                        layoutParams.topMargin = newY.toInt()
                        view.layoutParams = layoutParams
                    }
                    return true
                }
                else -> return false
            }
        }
    }
}

这样,你就可以在布局中拖动 FloatingActionButton 到任意位置,并且不会吸附到其他位置。

Android Kotlin 实现 FloatingActionButton 可拖动至任意位置且不吸附效果

原文地址: https://www.cveoy.top/t/topic/ml7m 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录