向右滑动移出屏幕的view,带监听

862 阅读1分钟
package com.k.android.player.ui

import android.animation.Animator
import android.animation.ObjectAnimator
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.widget.RelativeLayout
import com.k.android.utils.Log
import com.k.android.utils.Utils

class SlideRightView(context: Context, attr: AttributeSet):RelativeLayout(context,attr){
    /**
     * 点击时x点的位置
     */
    private var lastX = 0
    var animation:ObjectAnimator?=null
    private var onSlideRightListener:()->Unit={}
    private var downX = 0;
    override fun onTouchEvent(event: MotionEvent): Boolean {
        val x = event.rawX.toInt()
        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                lastX = x
                downX = x;
            }
            MotionEvent.ACTION_MOVE -> {
                var offsetX = x - lastX
                if(offsetX<0){//只能向上滑动
                    offsetX=0
                }
                layout(left+offsetX,top,right+offsetX,bottom)
                lastX = x
            }
            MotionEvent.ACTION_UP -> {
                var offsetX = x - downX

                if(offsetX<width/2){
                    startAnim(left,1)
                }else{
                    if(width-offsetX>0){
                        startAnim(width,2)
                    }else{
                        onSlideRightListener()
                    }
                }
            }
        }
        return true
    }

    /**
     * 设置动画移动偏移量
     */
    fun startAnim(leftOffSet:Int,mark:Int){
        if(mark==2){//是移出屏幕动画
            animation = ObjectAnimator.ofInt(this,"offset",left,leftOffSet)
        }else{
            animation = ObjectAnimator.ofInt(this,"offset",leftOffSet,0)
        }
        animation?.duration = 200
        animation?.addListener(object:Animator.AnimatorListener{
            override fun onAnimationRepeat(animation: Animator?) {
            }

            override fun onAnimationEnd(animation: Animator?) {
                //证明移出界面则执行监听
                if(mark==2){
                    onSlideRightListener()
                }
            }

            override fun onAnimationCancel(animation: Animator?) {
            }

            override fun onAnimationStart(animation: Animator?) {
            }

        })
        animation?.start()
    }

    /**
     * 设置动画执行的内容,此方法由Object动画框架执行
     */
    fun setOffset(newPos: Int) {
        layout(newPos,top,width+newPos,bottom)
    }

    /**
     * 设置向右移动到顶部的监听
     */
    fun setOnSlideRight(onSlideRightListener:()->Unit){
        this.onSlideRightListener = onSlideRightListener;
    }
}