2024年3月9日发(作者:)

return true

}

return false

}

})

}

override fun onTopChild(isTop: Boolean) {

isChildTop = isTop

}

override fun onScrollChain() {

/** child带动parent联动效果,快速滑动事件下发给self view*/

if(enableChildChain && isChildTop ) {

fling(0,velocityY/2)

}

}

override fun dispatchTouchEvent(ev: MotionEvent): Boolean {

if(enableConflict){

dispatchConflictTouchEvent(ev)

}

return chTouchEvent(ev)

}

private fun dispatchConflictTouchEvent(ev: MotionEvent){

//Log.e("xx","dispatchConfict action=${},dy=${ev.y}")

velocity?:{

velocity = ()

}.invoke()

velocity?.addMovement(ev)

when(){

_DOWN ->{

startdx = ev.x

startdy = ev.y

velocityY = 0

isMoveY = false

}

_MOVE ->{

conflictTouchEvent(ev)

}

_UP ->{

isSelfTouch = true

velocity?.let {

eCurrentVelocity(1000, t())

velocityY = -()

velocity?.recycle()

}

velocity = null

}

}

}

private fun conflictTouchEvent(ev: MotionEvent){

/** 纵向滑动处理,横向滑动过滤*/

if(isMoveY || (ev.y-startdy) > (ev.x-startdx)){

isMoveY = true

/** true 在底部*/

val isBottom = !canScrollVertically(1)

/** true向上滑动*/

val directUp = (ev.y - startdy) < 0

//Log.e("xx","isBootom=$isBottom,directUp=$directUp,ischildTop=$isChildTop,y=${ev.y}")

if(isBottom){

if(isChildTop && !directUp){

dispatchSelfTouch(ev)

dispatchSelfTouch(ev)

}else{

dispatchChildTouch(ev)

}

}else{

dispatchSelfTouch(ev)

}

}

}

/** 给selft view分发*/

private fun dispatchSelfTouch(ev: MotionEvent){

if(!isSelfTouch){

isSelfTouch = true

dispatchTouchEvent(obtainCancelEvent(ev.x, ev.y))

dispatchTouchEvent(obtainDownEvent(ev.x, ev.y))

}

}

/** 给child view分发*/

private fun dispatchChildTouch(ev: MotionEvent){

if (isSelfTouch){

isSelfTouch = false

dispatchTouchEvent(obtainCancelEvent(ev.x,ev.y))

dispatchTouchEvent(obtainDownEvent(ev.x,ev.y))

requestDisallowInterceptTouchEvent(true)

}

}

private fun obtainDownEvent(dx :Float, dy :Float) :MotionEvent{

return obtainActionEvent(_DOWN,dx,dy)

}

private fun obtainCancelEvent(dx :Float, dy :Float) :MotionEvent{

return obtainActionEvent(_CANCEL,dx,dy)

}

private fun obtainActionEvent(action :Int,dx :Float, dy :Float) :MotionEvent{

val now = Millis()

return (now,now,action,dx,dy,0)

}

}