Skip to content

关于RelateSlider平滑度的建议与修改,望作者重视 #49

@Paul-KK

Description

@Paul-KK

首先非常感谢作者的这个开源库,网上很多swipeback的开源库,但是你这个和其他最大的区别就是有微信联动效果,曾经我想实现微信联动效果,始终没有实现,最终在网上找到了你的这个开源库,顺利的解决了我的需求。但是在使用这个库的时候发现存在很多问题,最明显的一个是statusbar闪烁问题,看到别人也有提到这个问题,另一个就是开启微信联动功能会导致卡顿,特别是滑动松手后上一级activity会一顿一顿地,经过多版迭代后始终没有得以解决,然后我就认真研究了你的这个开源库,目前算是找到了一些优化方案,我想有必要通知你,更加完善这个开源库。
问题1:statusbar闪烁问题,这个是由于该库插入的layout并不能覆盖到statusbar,这是因为statusbar比较特殊,所以需要去掉系统的statusbar自己重绘。
问题2:RelateSlider联动卡顿问题,需要把RelateSlider里面的setX()函数换成setScrollX()函数,就会得到明显的改善。
问题3:如果在activity已经加载完成后再进行setSwipeEnable就会造成某些View如Switch的isLaidOut()函数始终为false,导致动画丢失。具体修改方案我会贴出代码。
问题4:新版本代码有问题,如果把setSwipeEnable设置为false以及禁止联动,就会导致背景透明,我看到也有人提到这个问题,原版是没有问题的,是因为新版额onPostCreate里面发生变化。改回原版就没问题。

以下是代码,希望作者能够关注和参考,大家一起完善这个开源库,让更多的人能够正常使用。

`package com.jude.swipbackhelper;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.ViewGroup;

/**

  • Created by Mr.Jude on 2015/8/3. 每个滑动页面的管理
    */
    public class SwipeBackPage {
    Activity mActivity;
    SwipeBackLayout mSwipeBackLayout;
    RelateSlider slider;

    SwipeBackPage(Activity activity) {
    this.mActivity = activity;
    }

    // 页面的回调用于配置滑动效果
    void onCreate() {
    mActivity.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    mActivity.getWindow().getDecorView().setBackgroundColor(Color.TRANSPARENT);

     mSwipeBackLayout = new SwipeBackLayout(mActivity);
     mSwipeBackLayout.setLayoutParams(
     		new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
     slider = new RelateSlider(this);
    

    }

    void onPostCreate() {
    mSwipeBackLayout.attachToActivity(mActivity);
    }

    public SwipeBackPage setSwipeRelateEnable(boolean enable) {
    slider.setEnable(enable);
    return this;
    }

    public SwipeBackPage setSwipeRelateOffset(int offset) {
    slider.setOffset(offset);
    return this;
    }

    /**

    • 是否可滑动【activity的onWindowFocusChanged之前】调用本方法,
    • 之后请调用{@link #setSwipeBackEnableAfteronWindowFocusChanged()}
      */
      public SwipeBackPage setSwipeBackEnableBeforeonWindowFocusChanged(boolean enable) {
      if (enable) {
      mSwipeBackLayout.attachToActivity(mActivity);
      } else {
      mSwipeBackLayout.removeFromActivity(mActivity);
      }
      mSwipeBackLayout.setEnableGesture(enable);
      return this;
      }

    /**

    • 是否可滑动【activity的onWindowFocusChanged之后】调用本方法,
    • 之前请调用{@link #setSwipeBackEnableBeforeonWindowFocusChanged()}
    • 如果在onWindowFocusChanged之后调用{@link #setSwipeBackEnableBeforeonWindowFocusChanged()},
    • 则会使某些View如Switch的isLaidOut()函数始终为false,导致动画丢失
      */
      public SwipeBackPage setSwipeBackEnableAfteronWindowFocusChanged(boolean enable) {
      mSwipeBackLayout.setEnableGesture(enable);
      return this;
      }

    // 可滑动的范围。百分比。200表示为左边200px的屏幕
    public SwipeBackPage setSwipeEdge(int swipeEdge) {
    mSwipeBackLayout.setEdgeSize(swipeEdge);
    return this;
    }

    // 可滑动的范围。百分比。0.2表示为左边20%的屏幕
    public SwipeBackPage setSwipeEdgePercent(float swipeEdgePercent) {
    mSwipeBackLayout.setEdgeSizePercent(swipeEdgePercent);
    return this;
    }

    // 对横向滑动手势的敏感程度。0为迟钝 1为敏感
    public SwipeBackPage setSwipeSensitivity(float sensitivity) {
    mSwipeBackLayout.setSensitivity(mActivity, sensitivity);
    return this;
    }

    // 底层阴影颜色
    public SwipeBackPage setScrimColor(int color) {
    mSwipeBackLayout.setScrimColor(color);
    return this;
    }

    // 触发关闭Activity百分比
    public SwipeBackPage setClosePercent(float percent) {
    mSwipeBackLayout.setScrollThreshold(percent);
    return this;
    }

    public SwipeBackPage setDisallowInterceptTouchEvent(boolean disallowIntercept) {
    mSwipeBackLayout.setDisallowInterceptTouchEvent(disallowIntercept);
    return this;
    }

    public SwipeBackPage addListener(SwipeListener listener) {
    mSwipeBackLayout.addSwipeListener(listener);
    return this;
    }

    public SwipeBackPage removeListener(SwipeListener listener) {
    mSwipeBackLayout.removeSwipeListener(listener);
    return this;
    }

    public SwipeBackLayout getSwipeBackLayout() {
    return mSwipeBackLayout;
    }

    public void scrollToFinishActivity() {
    mSwipeBackLayout.scrollToFinishActivity();
    }

}
`

package com.jude.swipbackhelper;

/**

  • Created by Mr.Jude on 2015/8/26.
    */
    public class RelateSlider implements SwipeListener {
    public SwipeBackPage curPage;
    private int offset = 500;

    public RelateSlider(SwipeBackPage curActivity) {
    this.curPage = curActivity;
    // curPage.addListener(this);
    }

    public void setOffset(int offset) {
    this.offset = offset;
    }

    public void setEnable(boolean enable) {
    if (enable)
    curPage.addListener(this);
    else
    curPage.removeListener(this);
    }

    @OverRide
    public void onScroll(float percent, int px) {
    SwipeBackPage page = SwipeBackHelper.getPrePage(curPage);
    if (page != null) {

     	// page.getSwipeBackLayout().setX(-offset * Math.max(1 -
     	// percent,0));
     	page.getSwipeBackLayout().setScrollX((int)(offset * Math.max(1 - percent, 0)));
     	if (percent == 0) {
     		page.getSwipeBackLayout().setScrollX(0);
     		// page.getSwipeBackLayout().setX(0);
     	}
     }
    

    }

    @OverRide
    public void onEdgeTouch() {

    }

    @OverRide
    public void onScrollToClose() {
    SwipeBackPage page = SwipeBackHelper.getPrePage(curPage);
    if (page != null)
    page.getSwipeBackLayout().setScrollX(0);
    }
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions