上滑取消view

此view显示界面是一个横条,可在上滑指定距离后自动滑动至隐藏。或者上滑距离不够则自动回退至原始位置,支持设置点击跳转监听

SlideTopView.ktandroid

import android.animation.Animator
import android.animation.ObjectAnimator
import android.content.Context
import android.support.constraint.ConstraintLayout
import android.util.AttributeSet
import android.view.MotionEvent
import com.koolearn.android.utils.Log
import com.koolearn.android.utils.Utils

class SlideTopView(context: Context,attr: AttributeSet):ConstraintLayout(context,attr){
//    private var lastX = 0
    private var lastY = 0;
    var animation:ObjectAnimator?=null
    var downTime:Long?=null
    private lateinit var onSlideTopListener:()->Unit
    private lateinit var onClickListener:()->Unit

    override fun onTouchEvent(event: MotionEvent): Boolean {
//        val x = event.rawX.toInt()
        val y = event.rawY.toInt()

        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
//                lastX = x
                lastY = y
                downTime = System.currentTimeMillis()
            }
            MotionEvent.ACTION_MOVE -> {
//                val offsetX = x - lastX
                var offsetY = y - lastY
                if(top+offsetY>0){//只能向上滑动
                    offsetY=0
                }
                layout(left,top + offsetY,right,bottom + offsetY)
//                onSlideTopListener(top+offsetY)
//                lastX = x
                lastY = y
            }
            MotionEvent.ACTION_UP -> {
                Log.i("share","top=$top")
                if(top>-height+ Utils.dp2px(15f)){
                    startAnim(0)
                    Log.i("share","移到0")
                }else{
                    startAnim(-height)
                    Log.i("share","移到-height")
                }
                if(downTime!=null&&System.currentTimeMillis()-downTime!!<500){
                    //0是取消显示 1是点击跳转
                    onClickListener()
                }
            }
        }
        return true
    }

    /**
     * 设置动画移动偏移量
     */
    fun startAnim(offSet:Int){
        animation = ObjectAnimator.ofInt(this,"offset",top,offSet)
        var i=top-offSet.toLong()
        animation?.duration = if(i>0) i else -i
        animation?.addListener(object:Animator.AnimatorListener{
            override fun onAnimationRepeat(animation: Animator?) {
            }

            override fun onAnimationEnd(animation: Animator?) {
                if(offSet!=0){
                    //0是取消显示 1是点击跳转
                    onSlideTopListener()
                }
            }

            override fun onAnimationCancel(animation: Animator?) {
            }

            override fun onAnimationStart(animation: Animator?) {
            }

        })
        animation?.start()
    }

    fun setOffset(offset: Int) {
        Log.i("share","offset=$offset")
        layout(left,offset,right,offset+height)
    }

    fun setOnSlideTop(onSlideTopListener:()->Unit){
        this.onSlideTopListener = onSlideTopListener;
    }

    fun setOnClickListener(onClickListener:()->Unit){
        this.onClickListener = onClickListener;
    }
}
复制代码
相关文章
相关标签/搜索