Skip to content

Commit b2ff408

Browse files
committed
update long click logic
1 parent 398335c commit b2ff408

4 files changed

Lines changed: 167 additions & 5 deletions

File tree

app/src/main/java/com/goyourfly/multiselectadapter/MainActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class MainActivity : AppCompatActivity() {
6868
.with(this)
6969
.adapter(demoAdapter)
7070
.decorateFactory(CheckBoxFactory(color = resources.getColor(R.color.colorPrimary)))
71+
.ignoreViewType(arrayOf(demoAdapter.TYPE_SECTION))
7172
.linkList(demoAdapter.list)
7273
.customMenu(SimpleDeleteSelectAllMenuBar(this, resources.getColor(R.color.colorPrimary)))
7374
.build()

library/src/main/java/com/goyourfly/multiple/adapter/viewholder/BaseViewHolder.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,32 @@ package com.goyourfly.multiple.adapter.viewholder
22

33
import android.os.Handler
44
import android.support.v7.widget.RecyclerView
5+
import android.util.Log
56
import android.view.MotionEvent
67
import android.view.View
8+
import android.view.ViewGroup
79
import com.goyourfly.multiple.adapter.MultipleAdapter
810
import com.goyourfly.multiple.adapter.ViewState
911

1012
/**
1113
* Created by gaoyufei on 2017/6/8.
1214
*/
13-
abstract class BaseViewHolder(val view: View,
15+
abstract class BaseViewHolder(val root: View,
1416
val viewHolder: RecyclerView.ViewHolder,
15-
val adapter: MultipleAdapter) : RecyclerView.ViewHolder(view) {
17+
val adapter: MultipleAdapter) : RecyclerView.ViewHolder(InterceptFrameLayout(root.context,adapter,root)) {
1618

1719
val onTouchListener = OnTouchListener(adapter,this)
1820
init {
19-
viewHolder.itemView.setOnTouchListener(onTouchListener)
21+
// viewHolder.itemView.setOnTouchListener(onTouchListener)
22+
if(itemView is InterceptFrameLayout){
23+
itemView.setLongClickCallback {
24+
Log.d("...","onLongClickCallback")
25+
adapter.onItemLongClick(viewHolder.adapterPosition)
26+
}
27+
itemView.setSelectStateClickCallback {
28+
adapter.onItemClick(viewHolder.adapterPosition)
29+
}
30+
}
2031
}
2132

2233
abstract fun selectStateChanged(state: Int)
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
package com.goyourfly.multiple.adapter.viewholder
2+
3+
import android.content.Context
4+
import android.support.v4.view.MotionEventCompat
5+
import android.util.Log
6+
import android.view.MotionEvent
7+
import android.view.View
8+
import android.widget.FrameLayout
9+
import com.goyourfly.multiple.adapter.MultipleAdapter
10+
import com.goyourfly.multiple.adapter.ViewState
11+
12+
/**
13+
* Created by gaoyufei on 2017/7/20.
14+
*/
15+
16+
class InterceptFrameLayout(context: Context, val adapter: MultipleAdapter, child: View) : FrameLayout(context) {
17+
val CLICK_ACTION_THRESHHOLD = 20
18+
val CLICK_LONG_TIME = 500L
19+
20+
var startX = 0F
21+
var startY = 0F
22+
var moveX = 0F
23+
var moveY = 0F
24+
var downTime = 0L
25+
var isTouching = false
26+
var isLongClick = false
27+
var touchDownTime = 0L
28+
29+
private var onLongClicked: (() -> Unit)? = null
30+
private var onClick: (() -> Unit)? = null
31+
32+
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)
44+
}
45+
}
46+
47+
init {
48+
val childParams = child.layoutParams
49+
val params =
50+
if (childParams != null)
51+
LayoutParams(childParams)
52+
else
53+
LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
54+
layoutParams = params
55+
addView(child)
56+
}
57+
58+
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
59+
Log.d("...", "onIntercept:$ev")
60+
val action = MotionEventCompat.getActionMasked(ev)
61+
when (action) {
62+
MotionEvent.ACTION_DOWN -> {
63+
isLongClick = false
64+
isTouching = true
65+
startX = ev.x
66+
startY = ev.y
67+
moveX = ev.x
68+
moveY = ev.y
69+
downTime = System.currentTimeMillis()
70+
handler.postDelayed(run, CLICK_LONG_TIME)
71+
}
72+
MotionEvent.ACTION_MOVE -> {
73+
moveX = ev.x
74+
moveY = ev.y
75+
if (isInterceptLong() && isAClick()) {
76+
isLongClick = true
77+
}
78+
}
79+
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
80+
isTouching = false
81+
handler.removeCallbacks(run)
82+
}
83+
}
84+
return isLongClick || adapter.showState == ViewState.SELECT
85+
}
86+
87+
88+
override fun onTouchEvent(ev: MotionEvent): Boolean {
89+
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+
}
100+
when (action) {
101+
MotionEvent.ACTION_DOWN -> {
102+
isTouching = true
103+
startX = ev.x
104+
startY = ev.y
105+
moveX = ev.x
106+
moveY = ev.y
107+
touchDownTime = System.currentTimeMillis()
108+
}
109+
MotionEvent.ACTION_MOVE -> {
110+
moveX = ev.x
111+
moveY = ev.y
112+
}
113+
MotionEvent.ACTION_UP -> {
114+
isTouching = false
115+
handler.removeCallbacks(run)
116+
if (adapter.showState == ViewState.SELECT
117+
&& !isTouchLong()
118+
&& isAClick()) {
119+
onClick?.invoke()
120+
}
121+
}
122+
MotionEvent.ACTION_CANCEL -> {
123+
isTouching = false
124+
handler.removeCallbacks(run)
125+
}
126+
}
127+
return true
128+
}
129+
130+
131+
fun setLongClickCallback(callback: () -> Unit): Unit {
132+
onLongClicked = callback
133+
}
134+
135+
fun setSelectStateClickCallback(callback: () -> Unit): Unit {
136+
onClick = callback
137+
}
138+
139+
private fun isInterceptLong() = System.currentTimeMillis() - downTime > CLICK_LONG_TIME
140+
private fun isTouchLong() = System.currentTimeMillis() - touchDownTime > CLICK_LONG_TIME
141+
142+
private fun isAClick(): Boolean {
143+
val differenceX = Math.abs(startX - moveX)
144+
val differenceY = Math.abs(startY - moveY)
145+
if (differenceX > CLICK_ACTION_THRESHHOLD/* =5 */ || differenceY > CLICK_ACTION_THRESHHOLD) {
146+
return false
147+
}
148+
return true
149+
}
150+
}

library/src/main/java/com/goyourfly/multiple/adapter/viewholder/view/CustomViewHolder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ import com.goyourfly.multiple.adapter.viewholder.BaseViewHolder
1212
/**
1313
* Created by gaoyufei on 2017/6/8.
1414
*/
15-
class CustomViewHolder(view: View,
15+
class CustomViewHolder(root: View,
1616
viewHolder: RecyclerView.ViewHolder,
1717
adapter: MultipleAdapter,
1818
val animationInterface: AnimationInterface,
1919
val selectViewContainer: View,
2020
val selectView: View,
21-
val unSelectView: View) : BaseViewHolder(view, viewHolder, adapter) {
21+
val unSelectView: View) : BaseViewHolder(root, viewHolder, adapter) {
2222
init {
2323
selectView.setOnTouchListener(onTouchListener)
2424
unSelectView.setOnTouchListener(onTouchListener)

0 commit comments

Comments
 (0)