From 3fb33f278c44715be0a8454b241a0eb3e9932a96 Mon Sep 17 00:00:00 2001 From: lang-v Date: Mon, 19 Oct 2020 19:25:25 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8D=E5=99=A8=E4=B8=AD=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0onRelease=E3=80=81onCancel=E4=B8=A4=E4=B8=AA=E6=96=B9?= =?UTF-8?q?=E6=B3=95,=E6=8F=90=E5=8D=87=E4=BA=86=E7=81=B5=E6=B4=BB?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 6 ++ .idea/gradle.xml | 1 + .idea/misc.xml | 2 +- .../view/elasticviewlibrary/ElasticLayout.kt | 83 ++++++++++++++----- .../elasticviewlibrary/base/BaseFooter.kt | 6 +- .../elasticviewlibrary/base/BaseHeader.kt | 12 ++- .../src/main/res/layout/base_layout.xml | 2 +- 7 files changed, 82 insertions(+), 30 deletions(-) create mode 100644 .idea/compiler.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 8671093..396d1de 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -16,6 +16,7 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 37a7509..d5d35ec 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/ElasticLayout.kt b/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/ElasticLayout.kt index d29bc4f..1b9fa6f 100644 --- a/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/ElasticLayout.kt +++ b/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/ElasticLayout.kt @@ -12,16 +12,13 @@ import android.animation.TimeInterpolator import android.animation.ValueAnimator import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.core.view.NestedScrollingParent2 import androidx.core.view.ViewCompat -import java.lang.Math.pow import kotlin.math.abs import kotlin.math.pow -import kotlin.math.tanh class ElasticLayout @JvmOverloads constructor( context: Context, @@ -111,7 +108,6 @@ class ElasticLayout @JvmOverloads constructor( }) != 0 } - /** * @param consumed 记录parent消耗的距离,consumed[0]-->X [1]-->y * 如果parent消耗完,那么child就不会继续处理了 @@ -189,25 +185,41 @@ class ElasticLayout @JvmOverloads constructor( if (headerAdapter != null && scrollOffset < 0 && scrollOffset <= -headerAdapter!!.offset) { springBack(scrollOffset + headerAdapter!!.offset, animTimeShort) if (isLoadingOrRefreshing()) return - isRefreshing = true - headerAdapter!!.onDo() - listener?.onRefresh() + headerAdapter!!.onRelease() + if(cancel){ + cancel = false + headerAdapter!!.onCancel() + springBack(getScrollOffset(),cancelAnimationTime) + }else { + isRefreshing = true + headerAdapter!!.isDoing = true + headerAdapter!!.onDo() + listener?.onRefresh() + } return } //达到加载条件 if (footerAdapter != null && scrollOffset > 0 && scrollOffset >= footerAdapter!!.offset) { springBack(scrollOffset - footerAdapter!!.offset, animTimeShort) if (isLoadingOrRefreshing()) return - footerAdapter!!.isDoing = true - isLoading = true - footerAdapter!!.onDo() - listener?.onLoad() + footerAdapter!!.onRelease() + if(cancel){ + cancel = false + footerAdapter!!.onCancel() + springBack(getScrollOffset(),cancelAnimationTime) + }else { + footerAdapter!!.isDoing = true + isLoading = true + footerAdapter!!.onDo() + listener?.onLoad() + } return } springBack(scrollOffset, animTimeLong) } override fun scrollBy(x: Int, y: Int) { + if(scrollListener?.preOnScrolled(scrollX,scrollY,x,y)!!)return //根据布局选择移动水平垂直 if (orientation == VERTICAL) { super.scrollBy(0, y) @@ -283,7 +295,7 @@ class ElasticLayout @JvmOverloads constructor( */ fun headerRefreshStop(msg: String) { if (headerAdapter == null) return - headerAdapter!!.overDo(msg) + headerAdapter!!.onDone(msg) postDelayed({ springBack(getScrollOffset(), animTimeLong) }, 300) @@ -294,7 +306,7 @@ class ElasticLayout @JvmOverloads constructor( */ fun footerLoadStop(msg: String) { if (footerAdapter == null) return - footerAdapter!!.overDo(msg) + footerAdapter!!.onDone(msg) postDelayed({ springBack(getScrollOffset(), animTimeLong) }, 300) @@ -346,8 +358,20 @@ class ElasticLayout @JvmOverloads constructor( dampingTemp = damping / count } - private var animator: ValueAnimator? = null + private var cancel = false + private var cancelAnimationTime = 100L + /** + * 取消所有事件,View直接弹回 调用adapter.onCancel() + * @param animTime 弹回的时间 + */ + fun cancelLoading(animTime: Long){ + if(cancel)return + cancel = true + cancelAnimationTime = animTime + } + + private var animator: ValueAnimator? = null //弹回动画 @Synchronized private fun springBack(offset: Int, animTime: Long) { @@ -473,11 +497,6 @@ class ElasticLayout @JvmOverloads constructor( /**在这里生成一个view,这个view将会被放置到列表主体的尾部*/ abstract fun getContentView(viewGroup: ViewGroup): View -// /**设置回调,通过它通知ElasticView加载完成,执行完成动画*/ -// fun setPullCallBack(callBack: PullCallBack) { -// this.callBack = callBack -// } - /** * 滑动进度 * @param progress in 0 .. offset 当超过offset时依旧会继续调用知道松开手指 @@ -490,15 +509,27 @@ class ElasticLayout @JvmOverloads constructor( /**释放加载*/ open fun releaseToDo() {} + /**释放手指时调用*/ + open fun onRelease(){} + /**加载中*/ open fun onDo() { isDoing = true } + /** + * 与onDo对应 在还没加载之前调用了cancel + */ + open fun onCancel(){ + + } + /**加载完成,通知ElasticView播放完成动画*/ - open fun overDo(msg: String) { + open fun onDone(msg: String) { isDoing = false } + + } abstract class HeaderAdapter(offset: Int) : BaseAdapter(offset) {} @@ -508,7 +539,6 @@ class ElasticLayout @JvmOverloads constructor( fun over() } - interface OnEventListener { //下拉刷新 fun onRefresh() @@ -518,11 +548,20 @@ class ElasticLayout @JvmOverloads constructor( } interface OnScrollListener{ + + /** + * @param scrollX + * @param scrollY 当前滑动到的位置x ,y + * + * @param dx + * @param dy 还未滑动的偏移值 + * @return true 拦截滑动事件 + */ + fun preOnScrolled(scrollX:Int,scrollY:Int,dx: Int,dy: Int):Boolean /** * @param dx x变化值 移动的长度 * @param dy y变化值 移动的长度 */ fun onScrolled(dx:Int,dy:Int) } - } \ No newline at end of file diff --git a/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/base/BaseFooter.kt b/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/base/BaseFooter.kt index 1ccef00..8d24f4f 100644 --- a/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/base/BaseFooter.kt +++ b/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/base/BaseFooter.kt @@ -1,8 +1,6 @@ package sl.view.elasticviewlibrary.base import android.content.Context -import android.opengl.Visibility -import android.provider.Settings import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -56,11 +54,11 @@ open class BaseFooter(private val context: Context, offset:Int):ElasticLayout.Fo super.onDo() } - override fun overDo(msg:String) { + override fun onDone(msg:String) { text.text = msg progressBar.visibility = View.INVISIBLE icon.visibility = View.VISIBLE direction = DIRECTION_UP - super.overDo(msg) + super.onDone(msg) } } \ No newline at end of file diff --git a/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/base/BaseHeader.kt b/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/base/BaseHeader.kt index 784a9b7..455349a 100644 --- a/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/base/BaseHeader.kt +++ b/elasticviewlibrary/src/main/java/sl/view/elasticviewlibrary/base/BaseHeader.kt @@ -46,6 +46,14 @@ open class BaseHeader(private val context: Context, offset: Int) : ElasticLayout super.releaseToDo() } + override fun onRelease() { + super.onRelease() + } + + override fun onCancel() { + super.onCancel() + } + override fun onDo() { text.text = "正在更新" progressBar.visibility = View.VISIBLE @@ -53,11 +61,11 @@ open class BaseHeader(private val context: Context, offset: Int) : ElasticLayout icon.visibility = View.INVISIBLE super.onDo() } - override fun overDo(msg:String) { + override fun onDone(msg:String) { text.text = msg progressBar.visibility = View.INVISIBLE icon.visibility = View.VISIBLE direction = DIRECTION_DOWN - super.overDo(msg) + super.onDone(msg) } } \ No newline at end of file diff --git a/elasticviewlibrary/src/main/res/layout/base_layout.xml b/elasticviewlibrary/src/main/res/layout/base_layout.xml index dce08de..37c0461 100644 --- a/elasticviewlibrary/src/main/res/layout/base_layout.xml +++ b/elasticviewlibrary/src/main/res/layout/base_layout.xml @@ -15,7 +15,7 @@ android:id="@+id/img" android:layout_width="30dp" android:layout_height="30dp" - android:layout_gravity="center" + android:padding="5dp" android:scaleType="fitXY" android:src="@drawable/ic_arrow_downward_gray_50dp" android:contentDescription="loading" />