资讯专栏INFORMATION COLUMN

使用SlidingPaneLayout 实现仿微信的滑动返回

番茄西红柿 / 2756人阅读

摘要:上周公司的项目改版要求加上一个右滑返回上一个界面于是就在网上找了一些开源库打算实现但是在使用的时候遇见了许多的问题试了两天用过等库都没成功然后在看见了使用来实现的一个滑动返回案例然后就看了看发现不错于是就使用了这个虽然上面链接里面已近写好啦

上周,公司的项目改版要求加上一个右滑返回上一个界面,于是就在网上找了一些开源库打算实现.但是在使用的时候遇见了许多的问题.试了两天用过 https://github.com/ikew0ng/SwipeBackLayout ,https://github.com/r0adkll/Slidr等库都没成功.

然后在https://www.jianshu.com/p/c0a15bdc2690 看见了使用SlidingPaneLayout 来实现的一个滑动返回案例然后就看了看发现不错于是就使用了这个.

虽然上面链接里面已近写好啦.但是还是写一下代码:

先看看最终效果:

 

 

 

实现如下:

主要是在baesActivity里面

public class BaesActivity extends AppCompatActivity implements SlidingPaneLayout.PanelSlideListener{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        initSlideBackClose();//滑动返回的设置
        super.onCreate(savedInstanceState);
    }

    private void initSlideBackClose() {
        if (isSupportSwipeBack()) {
           SlidingPaneLayout slidingPaneLayout = new SlidingPaneLayout(this);
            // 通过反射改变mOverhangSize的值为0,
            // 这个mOverhangSize值为菜单到右边屏幕的最短距离,
            // 默认是32dp,现在给它改成0
            try {
                Field overhangSize = SlidingPaneLayout.class.getDeclaredField("mOverhangSize");
                overhangSize.setAccessible(true);
                overhangSize.set(slidingPaneLayout, 0);
            } catch (Exception e) {
                e.printStackTrace();
            }
            slidingPaneLayout.setPanelSlideListener(this);
            slidingPaneLayout.setSliderFadeColor(getResources()
                    .getColor(android.R.color.transparent));

            // 左侧的透明视图
            View leftView = new View(this);
            leftView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            slidingPaneLayout.addView(leftView, 0);

            ViewGroup decorView = (ViewGroup) getWindow().getDecorView();


            // 右侧的内容视图
            ViewGroup decorChild = (ViewGroup) decorView.getChildAt(0);
            decorChild.setBackgroundColor(getResources()
                    .getColor(android.R.color.white));
            decorView.removeView(decorChild);
            decorView.addView(slidingPaneLayout);

            // 为 SlidingPaneLayout 添加内容视图
            slidingPaneLayout.addView(decorChild, 1);
        }
    }
    //设置是否使用滑动返回
    protected boolean isSupportSwipeBack() {
        return true;
    }

    @Override
    public void onPanelSlide(View panel, float slideOffset) {

    }

    @Override
    public void onPanelOpened(View panel) {
        finish();
    }

    @Override
    public void onPanelClosed(View panel) {

    }
}

然后让Acitivity继承baesActivity就可以了

public class MainActivity extends BaesActivity

看看效果

怎么会这样!

然后就去看看那需要改动,发现在BaesActivity里面写了一个方法:

  //设置是否使用滑动返回
    protected boolean isSupportSwipeBack() {
        return true;
    }

在不需要返回的界面重写此方法并返回 false,就行了向这样

  @Override
    protected boolean isSupportSwipeBack() {
        return false;
    }

 

主界面不滑动的问题解决了,但是还有一个问题在滑动的时候左边显示的是一个白板,这怎么破?

这就要设置  activity 的 style了 在AndroidManifest.xml 文件里面找到 application 就是黄色那行,跳进去

  //设置样式
        
            
                

                
            
        
        
        
    

设置styles.xml ,添加黄色部分的内容

 

运行起来:

偶买噶! 我的首页怎么变成这样了,透明了?怎么办,

小事,因为我们设置了上面那两行的原因,现在只要把界面的根布局里面添加一个背景色就行了



    

OK,初步实现就这样了,但是这效果也太丑了吧!

嗯,现在来改改Activity的开启关闭的样式

还是在styles.xml 进行修改

    
    





anim/in_from_right.xml和anim/out_to_left在 

进行设置:

in_from_right.xml



    

out_to_left.xml



    

然后看看效果

OK,效果出来了.但是当它遇到ViewPager的时候呢?

怎么这样,ViewPager的右滑无法使用了,SlidingPaneLayout的右滑抢了ViewPager的滑动事件.怎么办

然后我就在网上找呀找.终于发现了  https://blog.csdn.net/dota_wy/article/details/52890870 自定义SlidingPaneLayout

import android.content.Context;
import android.support.v4.view.MotionEventCompat;
import android.support.v4.widget.SlidingPaneLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
/*
在使用侧滑菜单的时候如果主界面中有ViewPager的时候调用该自定义控件,避免二者的冲突事件的发生
 */
public class PageEnabledSlidingPaneLayout extends SlidingPaneLayout {
    private float mInitialMotionX;
    private float mInitialMotionY;
    private float mEdgeSlop;//手滑动的距离

    public PageEnabledSlidingPaneLayout(Context context) {
        this(context, null);
    }

    public PageEnabledSlidingPaneLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PageEnabledSlidingPaneLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        ViewConfiguration config = ViewConfiguration.get(context);
        mEdgeSlop = config.getScaledEdgeSlop();//getScaledTouchSlop是一个距离
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (MotionEventCompat.getActionMasked(ev)) {
            case MotionEvent.ACTION_DOWN: {
                mInitialMotionX = ev.getX();
                mInitialMotionY = ev.getY();
                break;
            }
            case MotionEvent.ACTION_MOVE: {
                final float x = ev.getX();
                final float y = ev.getY();
                // The user should always be able to "close" the pane, so we only check
                // for child scrollability if the pane is currently closed.
                if (mInitialMotionX > mEdgeSlop && !isOpen() && canScroll(this, false,
                        Math.round(x - mInitialMotionX), Math.round(x), Math.round(y))) {

                    // How do we set super.mIsUnableToDrag = true?

                    // send the parent a cancel event
                    MotionEvent cancelEvent = MotionEvent.obtain(ev);
                    cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
                    return super.onInterceptTouchEvent(cancelEvent);
                }
            }
        }
        return super.onInterceptTouchEvent(ev);
    }
}

并用其替换BaesActivity 里面的SlidingPaneLayout 就可以了

OK,最终效果就这样完成了.

感谢 https://blog.csdn.net/dota_wy/article/details/52890870,

感谢 https://www.jianshu.com/p/c0a15bdc2690

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/3118.html

相关文章

  • 【Flutter组件】仿微信左滑删除组件与透明背景时的处理

    摘要:本文用到的组件这是一个简单版仿微信的左滑删除的组件左滑删除组件地址仓库地址问题在上,使用仿微信样式的左滑删除组件时如果这一行的背景色是透明的,就会出现如下问题透明的下可以看到删除和编辑按钮,我们就需要处理一下。 本文用到的组件: 这是一个简单版仿微信的左滑删除的组件: # 左滑删除组件 left_scroll_actions: any pub地址:https://pub.dartlan...

    mingzhong 评论0 收藏0
  • 基于SpringBoot的仿微信扫描登陆+轻量级富文本编辑->文章系统

    摘要:微信的扫码的登陆是要企业号的,对于一个学生狗哪来企业号,自己有个测试号内心已十分满足。自己决心做一个仿微信扫码登陆,对,你没看错,就是仿,坚信高仿出奇迹。 前言 点击访问项目链接看到慕课网和segmentfault的发表手记和发表文章是Markdown 编辑器,说实话,对于第一次用的我真的很不习惯。不过对于我们代码开发者来写挺好的,也就对我们这些开发者述写自己的代码故事好点而已。这边我...

    MyFaith 评论0 收藏0
  • iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码

    摘要:本文内容就是这些苹果开发者的红宝书,包含变量,集合,函数,类等等。据统计,有十种应用性能问题危害最大,分别为连接超时闪退卡顿崩溃黑白屏网络劫持交互性能差使用率问题内存泄露不良接口。里包含一个微博的列表发布视图,还包含一个的列表。 iOS精选源码 iOS WKWebView的使用源码 showImg(https://segmentfault.com/img/remote/14600000...

    newtrek 评论0 收藏0
  • 微信小程序仿微信SlideView组件slide-view

    摘要:使用安装从小程序基础库版本或以上及开发者工具或以上开始,小程序支持使用安装第三方包。节点用于承载滑动时所展示的节点,其宽度应于传入的相同。 微信小程序仿微信SlideView组件。 使用 1、安装 slide-view 从小程序基础库版本 2.2.1 或以上、及开发者工具 1.02.1808300 或以上开始,小程序支持使用 npm 安装第三方包。 npm install --save...

    mikyou 评论0 收藏0
  • GitHub 上受欢迎的 Android UI Library 整理二

    摘要:通知克服和的限制高仿淘宝微信等热门通知视图通过一行代码实现通知功能工具类轮播框通知全新的通知栏聊天视图简化开发快速创建聊天信息视图聊天视图实现聊天界面基于实际需求做出的灵活可定制的功能模仿饿了么详情页的例子带 通知 https://github.com/Tapadoo/Al... ★2528 - 克服Toast和Snackbar的限制https://github.com/wenming...

    nifhlheimr 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<