Andorid仿微信侧滑退出
使用主题窗体透明,背景透明,侧滑时可见前一页布局
<!--窗体透明-->
<item name="android:windowIsTranslucent">true</item>
<!--设置的背景-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--背景是否模糊显示-->
<item name="android:backgroundDimEnabled">true</item>
<!--背景模糊 0.0f完全不暗,1.0f全暗-->
<item name="android:backgroundDimAmount">0.85</item>
父类Activity :
/**
* <pre>
* Created by DengDongQi on 2020/5/13
* 仿微信侧滑退出
* </pre>
*/
@SuppressLint("Registered")
abstract class SideOutActivity : AppCompatActivity() {
companion object {
/** DecorView左边滑出间距占屏幕宽度PRESENT_TO_FINISH时表示用户需要退出当前Activity */
private const val PRESENT_TO_FINISH = 0.3f
/** 用户距离左边MIN_EDGE_DISTANCE内拖动有效 */
private const val MIN_EDGE_DISTANCE = 100
}
/** 屏幕宽度 */
private var mScreenW = -1f
/** 用户计算用户在屏幕滑动的距离 */
private var mStartX = 0f
/** 当前是否允许拖动 */
private var mIsScrollEnable = false
/** 当前Activity的DecorView */
private var mDecorView: View? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//设置进出动画为滑入滑出
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
//获得当前窗体对象
val window = window
//获取窗体View 以及屏幕宽度
mDecorView = window.decorView
if (mScreenW == -1f) {
val metrics = DisplayMetrics()
windowManager.defaultDisplay
.getMetrics(metrics)
mScreenW = metrics.widthPixels.toFloat()
}
}
/**
* 处理仿微信侧滑退出效果
* */
fun registerFinishTouchEvent(event: MotionEvent){
if (event.action == MotionEvent.ACTION_DOWN) {
mStartX = event.x
if (mStartX < MIN_EDGE_DISTANCE) {
// 距离左边距离足够小,设置为可拖动状态
mIsScrollEnable = true
}
} else if (event.action == MotionEvent.ACTION_MOVE && mIsScrollEnable) {
// 滚动DecorView内容
val dX = event.x - mStartX
mStartX = event.x
mDecorView!!.scrollBy((-dX).toInt(), 0)
} else if (event.action == MotionEvent.ACTION_UP || event.action == MotionEvent.ACTION_CANCEL) {
// 触摸操作取消,重置
mIsScrollEnable = false
// 根据当前滑动状态判断最终是滑到左边还是滑到右边(结束Activity)
val targetX = if (-mDecorView!!.scrollX / mScreenW > PRESENT_TO_FINISH) (-mScreenW).toInt() else 0
val animator = ValueAnimator.ofInt(mDecorView!!.scrollX, targetX)
animator.addUpdateListener { animation -> mDecorView!!.scrollTo(animation.animatedValue as Int, 0) }
animator.addListener(object : Animator.AnimatorListener {
override fun onAnimationStart(animation: Animator) {}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) {
if (targetX.toFloat() == -mScreenW) {
finish()
}
}
})
animator.start()
}
}
}
需要使用的Activity页面继承SideOutActivity类并添加如下代码
布局文件添加背景
android:background="@android:color/black"
kotlin 代码中:
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
registerFinishTouchEvent(ev)
return super.dispatchTouchEvent(ev)
}
效果如下: