【发布时间】: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