Android实现点击左滑,怎么在Android中利用Activity实现一个左滑退出功能

怎么在Android中利用Activity实现一个左滑退出功能

发布时间:2020-12-15 15:22:52

来源:亿速云

阅读:114

作者:Leah

怎么在Android中利用Activity实现一个左滑退出功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1:定义一个自己的父级容器,让它继承自一个布局(LinearLayout、RelativeLayout都可以)public class SildingFinishLayout extends RelativeLayout implements View.OnTouchListener {

/**

* SildingFinishLayout布局的父布局

*/

private ViewGroup mParentView;

/**

* 处理滑动逻辑的View

*/

private View touchView;

/**

* 滑动的最小距离

*/

private int mTouchSlop;

/**

* 按下点的X坐标

*/

private int downX;

/**

* 按下点的Y坐标

*/

private int downY;

/**

* 临时存储X坐标

*/

private int tempX;

/**

* 滑动类

*/

private Scroller mScroller;

/**

* SildingFinishLayout的宽度

*/

private int viewWidth;

/**

* 记录是否正在滑动

*/

private boolean isSilding;

private OnSildingFinishListener onSildingFinishListener;

private boolean isFinish;

public SildingFinishLayout(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();

mScroller = new Scroller(context);

}

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

super.onLayout(changed, l, t, r, b);

if (changed) {

// 获取SildingFinishLayout所在布局的父布局

mParentView = (ViewGroup) this.getParent();

viewWidth = this.getWidth();

}

}

/**

* 设置OnSildingFinishListener, 在onSildingFinish()方法中finish Activity

*

* @param onSildingFinishListener

*/

public void setOnSildingFinishListener(

OnSildingFinishListener onSildingFinishListener) {

this.onSildingFinishListener = onSildingFinishListener;

}

/**

* 设置Touch的View

*

* @param touchView

*/

public void setTouchView(View touchView) {

this.touchView = touchView;

touchView.setOnTouchListener(this);

}

public View getTouchView() {

return touchView;

}

/**

* 滚动出界面

*/

private void scrollRight() {

final int delta = (viewWidth + mParentView.getScrollX());

// 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动item

mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,

Math.abs(delta));

postInvalidate();

}

/**

* 滚动到起始位置

*/

private void scrollOrigin() {

int delta = mParentView.getScrollX();

mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,

Math.abs(delta));

postInvalidate();

}

/**

* touch的View是否是AbsListView, 例如ListView, GridView等其子类

*

* @return

*/

private boolean isTouchOnAbsListView() {

return touchView instanceof AbsListView ? true : false;

}

/**

* touch的view是否是ScrollView或者其子类

*

* @return

*/

private boolean isTouchOnScrollView() {

return touchView instanceof ScrollView ? true : false;

}

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

downX = tempX = (int) event.getRawX();

downY = (int) event.getRawY();

break;

case MotionEvent.ACTION_MOVE:

int moveX = (int) event.getRawX();

int deltaX = tempX - moveX;

tempX = moveX;

if (Math.abs(moveX - downX) > mTouchSlop

&& Math.abs((int) event.getRawY() - downY) 

isSilding = true;

// 若touchView是AbsListView,

// 则当手指滑动,取消item的点击事件,不然我们滑动也伴随着item点击事件的发生

if (isTouchOnAbsListView()) {

MotionEvent cancelEvent = MotionEvent.obtain(event);

cancelEvent

.setAction(MotionEvent.ACTION_CANCEL

| (event.getActionIndex() <

v.onTouchEvent(cancelEvent);

}

}

if (moveX - downX >= 0 && isSilding) {

mParentView.scrollBy(deltaX, 0);

// 屏蔽在滑动过程中ListView ScrollView等自己的滑动事件

if (isTouchOnScrollView() || isTouchOnAbsListView()) {

return true;

}

}

break;

case MotionEvent.ACTION_UP:

isSilding = false;

if (mParentView.getScrollX() <= -viewWidth / 2) {

isFinish = true;

scrollRight();

} else {

scrollOrigin();

isFinish = false;

}

break;

}

// 假如touch的view是AbsListView或者ScrollView 我们处理完上面自己的逻辑之后

// 再交给AbsListView, ScrollView自己处理其自己的逻辑

if (isTouchOnScrollView() || isTouchOnAbsListView()) {

return v.onTouchEvent(event);

}

// 其他的情况直接返回true

return true;

}

@Override

public void computeScroll() {

// 调用startScroll的时候scroller.computeScrollOffset()返回true,

if (mScroller.computeScrollOffset()) {

mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());

postInvalidate();

if (mScroller.isFinished()) {

if (onSildingFinishListener != null && isFinish) {

onSildingFinishListener.onSildingFinish();

}

}

}

}

public interface OnSildingFinishListener {

public void onSildingFinish();

}

}

2.Acitity

在Activity的onCreate()方法里面@Override

public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {

super.onCreate(savedInstanceState, persistentState);

SildingFinishLayout mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.timed_task_SildingFinishLayout);

mSildingFinishLayout

mSildingFinishLayout .setOnSildingFinishListener(new SildingFinishLayout.OnSildingFinishListener() {

@Override

public void onSildingFinish() {

finish();

}

});

mSildingFinishLayout .setTouchView(mSildingFinishLayout);//绑定底层的布局就可以了 :不起作用的话换个你activity 布局里面view就可以啦

}

截止目前,这个功能已经实现了

解决问题:这个会出现左滑 背景白色问题

1.style.xml中中增加

true

true

@android:color/transparent

2 acvitiy 的属性中加上android:theme="@style/AppTheme"

3 一些属性的详解@null :Dialog的windowFrame框为无

true:是否浮现在activity之上

false:是否半透明

true:是否显示title

@drawable/dia_bg:设置dialog的背景

false: 背景是否透明显示

关于怎么在Android中利用Activity实现一个左滑退出功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值