blob: 9e7ce504b4525ef749a1dd45618ef6dfeadcffd2 [file] [log] [blame]
package com.airbnb.lottie.samples
import android.annotation.SuppressLint
import android.content.Context
import androidx.customview.widget.ViewDragHelper
import android.util.AttributeSet
import android.view.Gravity
import android.view.MotionEvent
import android.view.View
import android.widget.FrameLayout
import android.widget.ImageView
class TrimView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr) {
private val leftAnchor by lazy {
val iv = ImageView(context)
iv.setImageResource(R.drawable.ic_trim)
iv
}
private val rightAnchor by lazy {
val iv = ImageView(context)
iv.setImageResource(R.drawable.ic_trim)
iv
}
private lateinit var callback: (Float, Float) -> Unit
private val dragHelper = ViewDragHelper.create(this, object: ViewDragHelper.Callback() {
override fun tryCaptureView(child: View, pointerId: Int) = true
override fun getViewHorizontalDragRange(child: View) = width
override fun clampViewPositionHorizontal(child: View, left: Int, dx: Int): Int {
return if (child == leftAnchor) {
maxOf(minOf(left, rightAnchor.left - leftAnchor.width), 0)
} else {
minOf(maxOf(leftAnchor.right, left), width - rightAnchor.width)
}
}
override fun onViewPositionChanged(view: View, left: Int, top: Int, dx: Int, dy: Int) {
val startProgress = leftAnchor.left / width.toFloat()
val endProgress = rightAnchor.right / width.toFloat()
callback(startProgress, endProgress)
}
})
init {
val leftLp = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
leftLp.gravity = Gravity.START
leftAnchor.layoutParams = leftLp
addView(leftAnchor)
val rightLp = LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)
rightLp.gravity = Gravity.END
rightAnchor.layoutParams = rightLp
addView(rightAnchor)
}
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
if (dragHelper.shouldInterceptTouchEvent(ev)) {
return true
}
return super.onInterceptTouchEvent(ev)
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(event: MotionEvent): Boolean {
dragHelper.processTouchEvent(event)
return true
}
fun setCallback(callback: (Float, Float) -> Unit) {
this.callback = callback
}
}