Как получать события перетаскивания в представлении верхнего слоя, но проходить через клики? - PullRequest
0 голосов
/ 31 августа 2018

В приложении есть пользовательский интерфейс, который получает клики, например EditText для получения фокуса и кнопки (не на скриншоте ниже), которые запускают действие. Но вся часть пользовательского интерфейса также должна сдвинуться в сторону, чтобы показать виды внизу. Я реализовал его как представление, которое содержит пользовательский интерфейс и перемещается при перетаскивании (видимом), и представление верхнего уровня, которое невидимо, но собирает данные перетаскивания.

Приведенный ниже код частично работает в том смысле, что видимое представление перетаскивается при перетаскивании невидимого представления, и оно может ощутить разницу между перетаскиванием и щелчком, но, несмотря на возврат false в View.OnTouchListener.onTouch (), представления под ним невидимый перетаскиваемый вид не получают щелчки.

Как мне получить клики, чтобы перейти к просмотрам внизу, не нарушая функциональность рабочего перетаскивания?

import android.view.MotionEvent
import android.view.View

class ViewHorizontalSlider(dragView: View,
                           private val moveView: View,
                           private val distancePx: Int = 100) {

    private var xPos = 0f
    private var downX = 0f
    private var isOnClick = false
    private val scrollThreshold = 6

    init {
         dragView.setOnTouchListener { _, event ->
            when (event.actionMasked) {
                MotionEvent.ACTION_DOWN -> {
                    downX = event.x
                    xPos = moveView.x - event.rawX
                    isOnClick = true
                    return@setOnTouchListener true
                }
                MotionEvent.ACTION_MOVE -> {
                    var newX = event.rawX + xPos
                    if (newX > distancePx) newX = distancePx.toFloat()
                    if (newX < 0) newX = 0f
                    moveView.x = newX

                    val movement = Math.abs(downX - event.x)
                    if (isOnClick && (movement > scrollThreshold)) {
                        isOnClick = false;
                    }
                    return@setOnTouchListener true
                }
                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                    if (isOnClick) {
                        return@setOnTouchListener false
                    } else {
                        return@setOnTouchListener true
                    }
                } else -> {
                    return@setOnTouchListener false
            }
            }
        }
    }

На скриншоте "P1" и т. Д. Представляют собой EditText Views. Вся цветная панель должна быть перетаскиваемой вправо (например, P1, чтобы открыть пользовательский интерфейс удаления), но также должна быть возможность щелкнуть (в перетаскиваемом представлении с невидимым наложением), но сфокусировать на EditText внизу. Я ожидал просто вернуть false в приведенном выше коде, но этого недостаточно для того, чтобы клик прошел.

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="72dp"
    >

    <ImageView
        android:id="@+id/delete"
        android:layout_width="@dimen/perspective_delete_slide"
        android:layout_height="match_parent"
        android:src="@drawable/ic_delete"
        android:scaleType="center"
        android:background="@color/black_light"
        android:contentDescription="@string/delete_perspective"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        />

    <android.support.constraint.ConstraintLayout
        android:id="@+id/container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:focusableInTouchMode="true"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        tools:layout_marginStart="72dp"
        >

        <EditText
            android:id="@+id/name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:background="@null"
            android:inputType="text|textCapSentences"
            android:layout_marginStart="12dp"
            android:layout_marginEnd="12dp"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/marker"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            />

        <View
            android:id="@+id/marker"
            android:layout_width="8dp"
            android:layout_height="match_parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@id/name"
            app:layout_constraintTop_toTopOf="parent"
            />

        <View
            android:id="@+id/draggable"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:clickable="false"
            android:focusable="false"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            />

    </android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>

The UI

1 Ответ

0 голосов
/ 31 августа 2018

если вы хотите меню при пролистывании, тогда вам нужно это Проведите по меню или около того Проведите по меню 2

...