首先是因为有一个这样的功能:
一开始我用到了overridePendingTransition(int enterAnim, int exitAnim)
去判断滑动的距离,如果超过指定值就关闭,并用overridePendingTransition添加进入和退出的动画
但看上去真的很呆:
我想到的效果应该是页面随着手指的滑动同时跟着滑动,同时可以看见上一个Activity。 那怎么办? 改!
首先我知道层级关系是Activity -> Window -> decorView
* Activity。。。 * Window。。。 * decorView 嘿,这是一个View啊,View是有移动和动画的Api的呀。 好,就从它下手。
只需要监听到手指移到的距离,然后把这个距离设置给移动的Api不就动起来了吗
直接一顿操作
你以为到这里就结束了吗
看一下效果
。。。
咋回事啊?这白色的那一块是什么啊!
回想一下层级关系:Activity -> Window -> decorView
这白色的难到是Window
好,给Window搞个透明背景:
有那感觉了,但用了这个主题之后切换动画好像也变了
所以再加上之前的切换动画
下班!!!
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
val decorView = window.decorView //拿到decorView
when (ev?.action) { //判断是哪个事件
MotionEvent.ACTION_DOWN -> startX = ev.x //记录手指按下时的X轴位置
MotionEvent.ACTION_MOVE -> if (ev.x > startX) { //如果当前位置大于开始的位置,就是只判断从左向右滑动
val scrollX = ev.x - startX //拿到移动的距离
decorView.translationX = scrollX //开始移动
}
MotionEvent.ACTION_UP -> if ((ev.x - startX) > (point.x / 3)) { //松手的时候如果滑动的距离超过了屏幕的1/3就关闭Activity
finish()
overridePendingTransition(R.anim.enter_activity, R.anim.exit_activity)
} else { //松手的时候,滑动的距离小于屏幕的1/3就回弹
val ofFloat = ObjectAnimator.ofFloat(decorView, "translationX", 0f)
ofFloat.duration = 400
ofFloat.start()
}
}
return super.dispatchTouchEvent(ev)
}