android仿ios右滑关闭,仿IOS右滑finish activity,不依赖布局实现

右滑 finish 活动在IOS APP中是很常见的,可惜Android并没有提供给我们这样的实现。

不过还是有方法的,比如通过自定义ViewGroup拦截触摸事件,但是这并不是一种好的方案,因为耦合度比较高。ok,既然这样,我们来试一试下面这种方案。

重写Activity 的 onTouchEvent 方法

拿到紧贴 window 层的DecorView布局,并设置window的背景为透明

拦截滑动事件,并根据手指的滑动来移动 DecorView 布局

是不是很简单,下面提供源码。

主Activity

public class SixActivity extends AppCompatActivity {

@NoteInterface(value = R.id.button)

private Button mButton;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivitySixBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_six);

NoteParse.Companion.init(this);

mButton.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View aView) {

startActivity(new Intent(SixActivity.this, SevenActivity.class));

overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);

}

});

}

}

实现滑动finish的Activity

class SevenActivity : AppCompatActivity() {

private var slop: Int = 0

private var x: Float = 0.toFloat()

private var y: Float = 0.toFloat()

//拦截的范围

private var scope: Int = 0

private var halfScope: Int = 0

private lateinit var mConstraintLayout : ConstraintLayout

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_seven)

val dm = DisplayMetrics()

windowManager.defaultDisplay.getMetrics(dm)

val width = dm.widthPixels

scope = width / 6

halfScope = width / 2

mConstraintLayout = findViewById(R.id.constraint_layout)

// 触发移动事件的最小距离

slop = ViewConfiguration.get(this).scaledTouchSlop

}

override fun onTouchEvent(event: MotionEvent): Boolean {

when (event.action) {

MotionEvent.ACTION_DOWN -> {

x = event.x

y = event.y

}

MotionEvent.ACTION_MOVE ->

if (event.x - x > 0

&& x.toInt() <= scope

&& Math.abs(event.x - x) > Math.abs(event.y - y)

&& Math.abs(event.x - x) > slop) {

(mConstraintLayout.parent as ViewGroup).scrollTo(-(event.x.toInt() - x.toInt()), 0)

return true

}

MotionEvent.ACTION_UP -> {

if (event.x < halfScope) {

// 如果没有拉取过半,则回退

(mConstraintLayout.parent as ViewGroup).scrollTo(0, 0)

} else {

if (event.x - x > 0

&& x.toInt() <= scope

&& Math.abs(event.x - x) > Math.abs(event.y - y)

&& Math.abs(event.x - x) > slop) {

finish()

}

}

}

}

return super.onTouchEvent(event)

}

}

最后需要修改一下style,让我们的window背景为透明。

#ffffff

@color/colorPrimary

@color/colorPrimaryDark

@color/colorAccent

#ff0000

//右滑需要加上下面两个item属性

@android:color/transparent

true

效果图

8322a59c63fd

Untitled.gif

结束,主Activity牵扯到@NoteInterface,是我自定义的注解,通过它来实例化我们的view,请忽略。布局就不放了,很简单。

笔者能力有限,不足之处欢迎指出。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值