Andorid仿微信侧滑退出

                                            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)
         } 

效果如下: 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值