【问题标题】:Dismiss Card View When Swiped刷卡时关闭卡片视图
【发布时间】:2020-07-28 05:57:38
【问题描述】:

我有一个可以垂直“滑动”的卡片视图。我试图做到这一点,以便当卡片视图向上或向下滑动时,卡片视图被关闭。我尝试使用 swipedismissedbehavior,但它似乎没有用。感谢您提供任何帮助。

activity_main

<?xml version="1.0" encoding="utf-8"?>
<com.example.card_view_example.catalog.draggable.DraggableCoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/parentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/card"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_width="match_parent"
        android:layout_height="350dp"
        app:cardCornerRadius="20dp"
        app:cardBackgroundColor="?android:attr/colorBackground"
        android:layout_marginTop="-175dp">

        <TextView
            android:id="@+id/parking_name3"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="225dp"
            android:text="Parking"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/ticket_descrip32t"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="250dp"
            android:text="Test Ticket"
            android:textSize="10sp" />
        <TextView
            android:id="@+id/ticket_descript322"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:layout_marginTop="290dp"
            android:text="Slide to Add Time"
            android:textSize="10sp" />
        <TextView
            android:id="@+id/parking_name32"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_marginLeft="150dp"
            android:layout_marginTop="250dp"
            android:text="+$1.00"
            android:textSize="20sp" />
        <TextView
            android:id="@+id/parking_name223"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_marginLeft="150dp"
            android:layout_marginTop="270dp"
            android:text="$1.00"
            android:textSize="25sp" />

        <SeekBar
            android:id="@+id/seekBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="300dp"
            android:max="12"
            android:min="0" />

    </com.google.android.material.card.MaterialCardView>
</com.example.card_view_example.catalog.draggable.DraggableCoordinatorLayout>

MainActivity.kt

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        if (supportActionBar != null)
            supportActionBar?.hide()
        setupChecking()
        setupDragging()
    }

    private fun setupChecking() {
        card.setOnLongClickListener {
            card.isChecked = !card.isChecked
            true

        }
    }

    private fun setupDragging() {
        parentContainer.addDraggableChild(card)
        parentContainer.setViewDragListener(object
            : DraggableCoordinatorLayout.ViewDragListener {

            override fun onViewCaptured(view: View, i: Int) {
                card.isDragged = true
            }

            override fun onViewReleased(view: View, v: Float, v1: Float) {    
                card.isDragged = false
            }
        })
    }

}

DraggableCoordinatorLayout.kt

class DraggableCoordinatorLayout @JvmOverloads constructor(
    context: Context?,
    attrs: AttributeSet? = null
) : CoordinatorLayout(context!!, attrs) {
    interface ViewDragListener {
        fun onViewCaptured(view: View, i: Int)
        fun onViewReleased(
            view: View,
            v: Float,
            v1: Float
        )
    }

    private val viewDragHelper: ViewDragHelper
    private val draggableChildren: MutableList<View> =
        ArrayList()

    private var viewDragListener: ViewDragListener? = null
    fun addDraggableChild(child: View) {
        require(!(child.parent !== this))
        draggableChildren.add(child)
    }

    fun removeDraggableChild(child: View) {
        require(!(child.parent !== this))
        draggableChildren.remove(child)
    }

    override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
        return viewDragHelper.shouldInterceptTouchEvent(ev) || super.onInterceptTouchEvent(ev)
    }

    override fun onTouchEvent(ev: MotionEvent): Boolean {
        viewDragHelper.processTouchEvent(ev)
        return super.onTouchEvent(ev)
    }

    private val dragCallback: ViewDragHelper.Callback = object : ViewDragHelper.Callback() {
        override fun tryCaptureView(view: View, i: Int): Boolean {
            return view.visibility == View.VISIBLE && viewIsDraggableChild(view)
        }

        override fun onViewCaptured(view: View, i: Int) {
            if (viewDragListener != null) {
                viewDragListener!!.onViewCaptured(view, i)
            }
        }

        override fun onViewReleased(
            view: View,
            v: Float,
            v1: Float
        ) {
            if (viewDragListener != null) {
                viewDragListener!!.onViewReleased(view, v, v1)
            }
        }

        override fun getViewVerticalDragRange(view: View): Int {
            return view.height
        }

        override fun clampViewPositionVertical(
            view: View,
            top: Int,
            dy: Int
        ): Int {
            return top
        }
    }

    private fun viewIsDraggableChild(view: View): Boolean {
        return draggableChildren.isEmpty() || draggableChildren.contains(view)
    }

    fun setViewDragListener(
        viewDragListener: ViewDragListener?
    ) {
        this.viewDragListener = viewDragListener
    }

    init {
        viewDragHelper = ViewDragHelper.create(this, dragCallback)
    }
}

【问题讨论】:

    标签: android android-layout kotlin android-fragments android-cardview


    【解决方案1】:

    添加到你的布局中:

    <com.google.android.material.card.MaterialCardView
        android:id="@+id/card"
        android:clickable="true"
        android:focusable="true"
    

    【讨论】:

    • 感谢您的建议。如果当它垂直向上或向下滑动时,我想要完成什么,卡片视图被关闭/不再显示。此卡片视图将弹出,当用户向上或向下滑动时,它不应再显示。
    猜你喜欢
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2017-12-16
    相关资源
    最近更新 更多