Skip to content

Commit aed19de

Browse files
committed
ClearScreenView支持慢滑模式
1 parent 593ccf2 commit aed19de

File tree

1 file changed

+93
-9
lines changed

1 file changed

+93
-9
lines changed

app/src/main/java/com/allen/androidcustomview/widget/ClearScreenView.kt

Lines changed: 93 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,12 @@ enum class ClearScreenStatus {
3131
CLEARED//已经清屏状态
3232
}
3333

34-
class ClearScreenView @JvmOverloads constructor(val mContext: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(mContext, attrs, defStyleAttr) {
34+
enum class ClearScreenMode {
35+
QUICK_SCROLL,//快速滑动才触发清屏
36+
SLOW_SCROLL//滑动出发清屏
37+
}
38+
39+
class ClearScreenView @JvmOverloads constructor(private val mContext: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : FrameLayout(mContext, attrs, defStyleAttr) {
3540

3641
companion object {
3742
/**
@@ -100,6 +105,16 @@ class ClearScreenView @JvmOverloads constructor(val mContext: Context, attrs: At
100105
*/
101106
private var clearScreenStatus = ClearScreenStatus.NORMAL
102107

108+
/**
109+
* 清屏模式
110+
*/
111+
var clearScreenMode = ClearScreenMode.QUICK_SCROLL
112+
113+
/**
114+
* 是否正在处在滑动清屏状态
115+
*/
116+
private var isScrolling = false
117+
103118
init {
104119
initView()
105120
initAnim()
@@ -132,6 +147,7 @@ class ClearScreenView @JvmOverloads constructor(val mContext: Context, attrs: At
132147
clearScreenListener?.onCleared()
133148
}
134149
}
150+
isScrolling = false
135151
}
136152
})
137153
}
@@ -147,15 +163,23 @@ class ClearScreenView @JvmOverloads constructor(val mContext: Context, attrs: At
147163
mDownX = x
148164
mDownY = y
149165
}
150-
MotionEvent.ACTION_MOVE -> {
151-
return isInterceptClearScreenEvent(x, y)
152-
}
153166
}
154-
return super.onInterceptTouchEvent(ev)
167+
return isInterceptClearScreenEvent(x, y)
155168
}
156169

157170
private fun isInterceptClearScreenEvent(x: Int, y: Int): Boolean {
158-
return isMoveForHorizontal(x, y) && !isAnimRunning() && isGreaterThanMinSize(mDownX, x)
171+
return when (clearScreenMode) {
172+
ClearScreenMode.QUICK_SCROLL -> {
173+
val isIntercept = isMoveForHorizontal(x, y) && !isAnimRunning() && isGreaterThanMinSize(mDownX, x)
174+
requestDisallowInterceptTouchEvent(isIntercept)
175+
isIntercept
176+
}
177+
ClearScreenMode.SLOW_SCROLL -> {
178+
val isIntercept = isMoveForHorizontal(x, y) && !isAnimRunning() || isScrolling
179+
requestDisallowInterceptTouchEvent(isIntercept)
180+
isIntercept
181+
}
182+
}
159183
}
160184

161185
/**
@@ -170,8 +194,20 @@ class ClearScreenView @JvmOverloads constructor(val mContext: Context, attrs: At
170194
}
171195

172196
override fun onTouchEvent(event: MotionEvent): Boolean {
197+
if (isAnimRunning()) return true
198+
when (clearScreenMode) {
199+
ClearScreenMode.QUICK_SCROLL -> {
200+
handleQuickScrollMode(event)
201+
}
202+
ClearScreenMode.SLOW_SCROLL -> {
203+
handleSlowScrollMode(event)
204+
}
205+
}
206+
return true
207+
}
208+
209+
private fun handleQuickScrollMode(event: MotionEvent) {
173210
mVelocityTracker?.addMovement(event)
174-
val x = event.x.toInt()
175211
when (event.action) {
176212
MotionEvent.ACTION_UP -> {
177213
mVelocityTracker?.computeCurrentVelocity(10)
@@ -192,11 +228,58 @@ class ClearScreenView @JvmOverloads constructor(val mContext: Context, attrs: At
192228
if (translateX != 0) {
193229
mAnimator?.start()
194230
}
195-
return true
196231
}
197232
}
233+
}
198234

199-
return super.onTouchEvent(event)
235+
private fun handleSlowScrollMode(event: MotionEvent) {
236+
val x = event.x.toInt()
237+
when (event.action) {
238+
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
239+
when (clearScreenStatus) {
240+
ClearScreenStatus.NORMAL -> {
241+
if (startTranslateX >= width / 2) {
242+
translateX = width - startTranslateX
243+
clearScreenStatus = ClearScreenStatus.NORMAL
244+
} else {
245+
translateX = -startTranslateX
246+
clearScreenStatus = ClearScreenStatus.CLEARED
247+
}
248+
mAnimator?.start()
249+
}
250+
ClearScreenStatus.CLEARED -> {
251+
if (startTranslateX >= width / 2) {
252+
translateX = width - startTranslateX
253+
clearScreenStatus = ClearScreenStatus.NORMAL
254+
} else {
255+
translateX = (-startTranslateX)
256+
clearScreenStatus = ClearScreenStatus.CLEARED
257+
}
258+
mAnimator?.start()
259+
}
260+
}
261+
}
262+
MotionEvent.ACTION_MOVE -> {
263+
translateX = 0
264+
val move = x - mDownX
265+
when (clearScreenStatus) {
266+
ClearScreenStatus.NORMAL -> {
267+
val translate = if (x <= mDownX) 0 else move
268+
startTranslateX = translate
269+
if (translate != 0) {
270+
translateChild(translate.toFloat())
271+
}
272+
}
273+
ClearScreenStatus.CLEARED -> {
274+
val translate = if (x > mDownX) 0 else mDownX - x
275+
startTranslateX = width - translate
276+
if (startTranslateX != 0) {
277+
translateChild(startTranslateX.toFloat())
278+
}
279+
}
280+
}
281+
}
282+
}
200283
}
201284

202285
private fun setLeft2RightMoveTranslateX() {
@@ -246,6 +329,7 @@ class ClearScreenView @JvmOverloads constructor(val mContext: Context, attrs: At
246329
}
247330

248331
private fun translateChild(translate: Float) {
332+
isScrolling = true
249333
for (view in listClearViews) {
250334
view.translationX = translate
251335
}

0 commit comments

Comments
 (0)