@@ -2,45 +2,36 @@ package com.goyourfly.multiple.adapter.viewholder
22
33import android.content.Context
44import android.support.v4.view.MotionEventCompat
5- import android.util.Log
65import android.view.MotionEvent
76import android.view.View
7+ import android.view.ViewConfiguration
88import android.widget.FrameLayout
99import com.goyourfly.multiple.adapter.MultipleAdapter
1010import com.goyourfly.multiple.adapter.ViewState
1111
1212/* *
1313 * Created by gaoyufei on 2017/7/20.
14+ * 用于检测和拦截长按手势的ViewGroup
1415 */
1516
16- internal class InterceptFrameLayout (context : Context , val adapter : MultipleAdapter , child : View ) : FrameLayout(context) {
17- val CLICK_ACTION_THRESHHOLD = 20
18- val CLICK_LONG_TIME = 500L
17+ internal class EventObserverView (context : Context , val adapter : MultipleAdapter , child : View ) : FrameLayout(context) {
18+ val CLICK_ACTION_THRESHHOLD = ViewConfiguration .get(context).getScaledTouchSlop()
19+ val CLICK_LONG_TIME = ViewConfiguration .getLongPressTimeout().toLong()
1920
2021 var startX = 0F
2122 var startY = 0F
2223 var moveX = 0F
2324 var moveY = 0F
2425 var downTime = 0L
2526 var isTouching = false
26- var isLongClick = false
27- var touchDownTime = 0L
27+ var mHasPerformedLongPress = false ;
2828
2929 private var onLongClicked: (() -> Unit )? = null
3030 private var onClick: (() -> Unit )? = null
3131
3232 val run = Runnable {
33- if (isTouching && ! isLongClick && isAClick()) {
34- // 制作一个假的事件
35- val event = MotionEvent .obtain(
36- downTime,
37- System .currentTimeMillis(),
38- MotionEvent .ACTION_MOVE ,
39- moveX,
40- moveY,
41- 0 )
42- isLongClick = true
43- onTouchEvent(event)
33+ if (isTouching && ! mHasPerformedLongPress && isAClick()) {
34+ onLongClick()
4435 }
4536 }
4637
@@ -55,19 +46,20 @@ internal class InterceptFrameLayout(context: Context, val adapter: MultipleAdapt
5546 addView(child)
5647 }
5748
49+
5850 override fun onInterceptTouchEvent (ev : MotionEvent ): Boolean {
59- Log .d(" ..." , " onIntercept:$ev " )
6051 val action = MotionEventCompat .getActionMasked(ev)
52+ var isLongClick = false
6153 when (action) {
6254 MotionEvent .ACTION_DOWN -> {
63- isLongClick = false
55+ mHasPerformedLongPress = false
6456 isTouching = true
6557 startX = ev.x
6658 startY = ev.y
6759 moveX = ev.x
6860 moveY = ev.y
6961 downTime = System .currentTimeMillis()
70- handler. postDelayed(run, CLICK_LONG_TIME )
62+ postDelayed(run, CLICK_LONG_TIME )
7163 }
7264 MotionEvent .ACTION_MOVE -> {
7365 moveX = ev.x
@@ -78,51 +70,48 @@ internal class InterceptFrameLayout(context: Context, val adapter: MultipleAdapt
7870 }
7971 MotionEvent .ACTION_UP , MotionEvent .ACTION_CANCEL -> {
8072 isTouching = false
81- handler. removeCallbacks(run)
73+ removeCallbacks(run)
8274 }
8375 }
8476 return isLongClick || adapter.showState == ViewState .SELECT
8577 }
8678
79+ override fun dispatchTouchEvent (ev : MotionEvent ? ): Boolean {
80+ return super .dispatchTouchEvent(ev)
81+ }
82+
83+ fun onLongClick () {
84+ removeCallbacks(run)
85+ post {
86+ mHasPerformedLongPress = true
87+ onLongClicked?.invoke()
88+ }
89+ }
8790
8891 override fun onTouchEvent (ev : MotionEvent ): Boolean {
8992 val action = MotionEventCompat .getActionMasked(ev)
90- Log .d(" ..." , " onTouch:$ev " )
91- if (isTouching
92- && isLongClick
93- && action != MotionEvent .ACTION_CANCEL ) {
94- handler.removeCallbacks(run)
95- handler.post {
96- onLongClicked?.invoke()
97- }
98- return true
99- }
10093 when (action) {
10194 MotionEvent .ACTION_DOWN -> {
10295 isTouching = true
96+ mHasPerformedLongPress = false
10397 startX = ev.x
10498 startY = ev.y
10599 moveX = ev.x
106100 moveY = ev.y
107- touchDownTime = System .currentTimeMillis()
108101 }
109102 MotionEvent .ACTION_MOVE -> {
110103 moveX = ev.x
111104 moveY = ev.y
112105 }
113- MotionEvent .ACTION_UP -> {
106+ MotionEvent .ACTION_UP , MotionEvent . ACTION_CANCEL -> {
114107 isTouching = false
115- handler. removeCallbacks(run)
116- if (adapter.showState == ViewState . SELECT
117- && ! isTouchLong()
108+ removeCallbacks(run)
109+ if (action == MotionEvent . ACTION_UP
110+ && adapter.showState == ViewState . SELECT
118111 && isAClick()) {
119112 onClick?.invoke()
120113 }
121114 }
122- MotionEvent .ACTION_CANCEL -> {
123- isTouching = false
124- handler.removeCallbacks(run)
125- }
126115 }
127116 return true
128117 }
@@ -137,7 +126,6 @@ internal class InterceptFrameLayout(context: Context, val adapter: MultipleAdapt
137126 }
138127
139128 private fun isInterceptLong () = System .currentTimeMillis() - downTime > CLICK_LONG_TIME
140- private fun isTouchLong () = System .currentTimeMillis() - touchDownTime > CLICK_LONG_TIME
141129
142130 private fun isAClick (): Boolean {
143131 val differenceX = Math .abs(startX - moveX)
0 commit comments