最近小伙伴有个需求,就是实现类似于小红书、Lemon8的拖拽退出效果,查了一圈发现并没有实现该功能的Library,于是便做了一个开源Library项目,方便大家集成后,一行代码实现Android仿小红书、Lemon8的拖拽退出效果。
集成效果
1.实现思路:
(1)创建一个自定义Layout
,作为实现拖拽退出的视图
(2)在自定义Layout中
,重写onInterceptTouchEvent
,用来检查TouchEvent
的滑动方向是否可以执行退拽退出效果,如果可以执行退拽退出效果则返回true
表示拦截TouchEvent
(3)在自定义Layout中
,重写onTouchEvent
,在可以执行退拽退出效果时,先根据TouchEvent
计算出滑动距离,然后使用滑动距离来设置leftMargin和topMargin以实现自定义Layout
拖拽时移动的效果,同时设置scaleX
和scaleY
以实现自定义Layout
拖拽时缩放的效果。
2.集成方式:
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
implementation 'com.github.Arcns.arc-fast:rounded:1.23.1'
implementation 'com.github.Arcns.arc-fast:drag-exit:1.23.1'
// Library中使用了Constraintlayout,如果你的项目中未引入,那么你还需要
implementation 'androidx.constraintlayout:constraintlayout:yourversion'
3.使用方式
使用时,只需要在布局文件的最外层包裹FastDragExitLayout
,然后在代码文件中使用FastDragExitLayout.enableDragExit()
启用拖拽退出效果即可。
布局文件:
<com.arc.fast.view.FastDragExitLayout
android:id="@+id/dragExitLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
// 你自己的布局
... ...
</com.arc.fast.view.FastDragExitLayout>
代码文件:
// 简单调用方式一:在拖拽退出时关闭activity
dragExitLayout.enableDragExit(activity)
// 简单调用方式二:在拖拽退出时自定义处理操作
dragExitLayout.enableDragExit{
// 自定义处理操作
}
// 完整的调用方式:
dragExitLayout.enableDragExit(
bindExitActivity = activity, // 可选项:绑定在拖拽退出时的关闭activity
onDragCallback = {isDrag:Boolean->
// 可选项:在开始或取消拖拽时的回调
},
onExitWaitCallback = {currentScale: Float, continueExit: (() -> Unit) ->
// 可选项:在拖拽退出之前的回调,你可以在此处进行耗时的操作,完成后调用 continueExit即可继续退出
},
onExitCallback = { currentScale: Float ->
// 可选项:在拖拽退出时的回调
}
)
ps:如果你希望dragExitLayout
在拖拽后,当前activity背景能够变得透明(即拖拽后可以看到上一个activity),那么你需要设置当前activity为透明样式:
<style name="TransitionTheme" parent="@style/YourAppTheme">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item> // 注意:因系统bug,API26时android:windowIsTranslucent必须为false
<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowActivityTransitions">true</item>
</style>