@@ -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