Giter Club home page Giter Club logo

swipebackhelper's Introduction

SwipeBackHelper

中文 | English

Only three lines of code makes activity swipe close. Part of the code modified from SwipeBackLayout

swipeback.png

Dependency

compile 'com.jude:swipebackhelper:3.1.2'

Usage

Add this tostyle.xml:

    //if you don't set this the background will be black when you slide.
    <item name="android:windowIsTranslucent">true</item>
    //set the right in/out animation of Activity,you can change this to yours
    <item name="android:windowAnimationStyle">@style/SlideRightAnimation</item>

Attention set up a separate theme for your main activity which should be at bottom and can't be swipe.and set the Activity no swipe by setSwipeBackEnable(false)

    <style name="MainTheme" parent="AppTheme">
        <item name="android:windowIsTranslucent">false</item>
    </style>

Add this code into your activity's lifecycle。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SwipeBackHelper.onCreate(this);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        SwipeBackHelper.onPostCreate(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        SwipeBackHelper.onDestroy(this);
    }

If you need more setting,you can use this after SwipeBackHelper.onCreate()

    SwipeBackHelper.getCurrentPage(this)//get current instance
        .setSwipeBackEnable(true)//on-off 
        .setSwipeEdge(200)//set the touch area。200 mean only the left 200px of screen can touch to begin swipe.
        .setSwipeEdgePercent(0.2f)//0.2 mean left 20% of screen can touch to begin swipe.
        .setSwipeSensitivity(0.5f)//sensitiveness of the gesture。0:slow  1:sensitive
        .setScrimColor(Color.BLUE)//color of Scrim below the activity
        .setClosePercent(0.8f)//close activity when swipe over this 
        .setSwipeRelateEnable(false)//if should move together with the following Activity
        .setSwipeRelateOffset(500)//the Offset of following Activity when setSwipeRelateEnable(true)
.setDisallowInterceptTouchEvent(true)//your view can hand the events first.default false;
        .addListener(new SwipeListener() {

            @Override
            public void onScroll(float percent, int px) {
            }

            @Override
            public void onEdgeTouch() {
            }

            @Override
            public void onScrollToClose() {
            }
        });

License

Copyright 2015 Jude

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

swipebackhelper's People

Contributors

jude95 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

swipebackhelper's Issues

请教一下,与SwipeRefreshLayout搭配会报异常,但是不影响,是什么原因?

package com.example.administrator.myapplication;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import com.jude.swipbackhelper.SwipeBackHelper;


public class MainActivity extends AppCompatActivity {

    private SwipeRefreshLayout mSwipeRefreshLayout;
    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SwipeBackHelper.onCreate(this);
        mHandler = new Handler();


        mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.mSwipeRefreshLayout);
        mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright);
        mSwipeRefreshLayout.setProgressViewOffset(false,300,500);
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                mSwipeRefreshLayout.setRefreshing(true);

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(1000);
                            mHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    mSwipeRefreshLayout.setRefreshing(false);
                                }
                            });
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                }).start();
            }
        });

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        SwipeBackHelper.onPostCreate(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        SwipeBackHelper.onDestroy(this);
    }
}

2.0.0版本手势事件有bug

设置可滑动范围setSwipeEdge(200)后,如果在200范围之外右滑就会崩,java.lang.IllegalArgumentException: pointerIndex out of range的异常,在范围之内右滑和不设置则没问题

You Should call SwipeBackHelper.onCreate(activity) first

一直报这个错:
style 设置:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>
<!--MIUI特殊处理 给你的主Activity(永远在最底层不会滑动关闭)单独设置一个主题-->
<style name="MainTheme" parent="AppTheme">
    <item name="android:windowIsTranslucent" >false</item>
</style>

Manifest 设置:



            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".Main2Activity">
    </activity>
    <activity android:name=".Main3Activity">
    </activity>
</application>

and code 只有BaseActivity:如下:
public class BaseActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
     SwipeBackHelper.onCreate(this);
    SwipeBackHelper.getCurrentPage(this)
            .setSwipeBackEnable(true)
            .setSwipeSensitivity(0.5f)
            .setSwipeRelateEnable(true)
            .setSwipeSensitivity(1);
}


@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    SwipeBackHelper.onPostCreate(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    SwipeBackHelper.onDestroy(this);
}

}
一运行就会报题目标的那个错!!求助

java.lang.IllegalArgumentException: pointerIndex out of range

11-20 11:26:20.157 28454-28454/com.gosport W/System.err: java.lang.IllegalArgumentException: pointerIndex out of range
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.MotionEvent.nativeGetAxisValue(Native Method)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.MotionEvent.getX(MotionEvent.java:1979)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:91)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:219)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at com.ningmilib.swipeback.ViewDragHelper.processTouchEvent(ViewDragHelper.java:1191)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at com.ningmilib.swipeback.SwipeBackLayout.onTouchEvent(SwipeBackLayout.java:261)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.View.dispatchTouchEvent(View.java:7731)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2212)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2198)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1536)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2146)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.View.dispatchPointerEvent(View.java:7911)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4048)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3927)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3488)
11-20 11:26:20.167 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3538)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3507)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3614)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3515)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3671)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3488)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3538)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3507)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3515)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3488)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5699)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5676)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5647)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5843)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.os.MessageQueue.nativePollOnce(Native Method)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.os.MessageQueue.next(MessageQueue.java:138)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.os.Looper.loop(Looper.java:123)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5094)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at java.lang.reflect.Method.invoke(Method.java:515)
11-20 11:26:20.177 28454-28454/com.gosport W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893)
11-20 11:26:20.187 28454-28454/com.gosport W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)
11-20 11:26:20.187 28454-28454/com.gosport W/System.err: at dalvik.system.NativeStart.main(Native Method)

在有些情况下会报这个错,我去看原来项目的SwipeBackLayout,也有人提过这个问题,不过没修复。我把出错地方的index打印出来,index值为 -1;

这个报错并不会影响滑动。

对于那些不想滑动删除的Activity可否根据android:windowIsTranslucent来判断就好

一般项目都会有BaseActivity,现在BaseActivity绑定SwipeBackHelper, 那些不绑定的Activity,就按照你demo那样,在具体的Activity里设置不滑动就好。

但这有一个问题,就是这样Activity还是会在DecorView里插入一层SwipBackLayout,只是禁掉滑动而已,这对于一般项目的主界面来说还是有些影响的;可不可以在SwipeBackHelper() 的 oncreate()方法里,来获取activity的theme,判断一下android:windowIsTranslucent是否为false,是的话之后对于SwipeBackPage里的初始化就都去掉,且不再插入SwipeBackLayout,这样也不需要在具体的activity去禁掉滑动了。

不过需要注意的是,getCurrentPage()时还是需要初始化一些SwipeBackPage,不然在外部设置属性时可能会报空指针。

最后,多谢你这个开源项目。

SwipeBackHelper卡顿

我用的小米note手机来测试,在打开了很多个可以滑动关闭的activity之后,滑动返回有点卡顿,希望能解决一下。

java.lang.NullPointerException

java.lang.NullPointerException
at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:118)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:393)
at com.ningmilib.swipeback.SwipeBackLayout.drawShadow(SourceFile:314)
at com.ningmilib.swipeback.SwipeBackLayout.drawChild(SourceFile:293)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10420)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2597)
at android.view.View.getDisplayList(View.java:10385)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:849)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:1910)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)

这是在阿里云测测试结果里出现的问题。

滑动返回

滑动返回 看不见上一层activity?自己设置什么颜色就是什么颜色吗? 还有一个问题 我androidstudio compile 'com.jude:swipebackhelper:2.0.0'
不行,不知道是不是仓库这个版本不行?SwipeBackHelper这个类找不到

windowistranslucent overridependingtransition exit anim didn't work

When I set
<item name="android:windowIsTranslucent">true</item>
exit animation in overridependingtransition for curent activity didn't work only enter animation
But if I set
<item name="android:windowIsTranslucent">false</item>
exit animation work perfect, but background black when I slide.
How make work exit animation with windowIsTranslucent=true or make not black background for slide with windowIsTranslucent=false?

Rtl support?

this source can swipe layout to left silde?
This means that unlike in this case,

device-2016-07-24-200051

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

首先非常感谢作者的这个开源库,网上很多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);
    }
    }

平滑度问题

感觉滑动的时候平滑度,不是很流畅,不知道是不是错觉...

NullPointerException: SwipeBackPage.getSwipeBackLayout() on a null object reference

应用场景如下:集成极光推送在app退出后可以接到消息通知。假设当前在某个其他app中,点击通知栏后跳转到自己app的某个activity查看消息详情。此时右滑关闭该acitivy,会报空指针异常。

12-11 14:30:23.138:xxx(8711): java.lang.NullPointerException: Attempt to invoke virtual method 'com.xxx.swipebackhelper.SwipeBackLayout com.xxx.swipebackhelper.SwipeBackPage.getSwipeBackLayout()' on a null object reference
12-11 14:30:23.138: xxx(8711): at com.xxx.swipebackhelper.RelateSlider.onScrollToClose(RelateSlider.java:47)

定位代码主要是RelateSlider类的public void onScrollToClose()方法,
SwipeBackPage page = SwipeBackHelper.getPrePage(curPage);
在当前场景下,这里的page = null,之后再调page.getSwipeBackLayout().setX(0);就会报异常了。

目前直接加了一个if(page!=null)的判断,暂时解决问题,其他影响未知。代码没细看,请大神解决。

error

弹起键盘 能看到上个页面的背景 有没有好的处理办法

Fatal Exception: java.lang.StackOverflowError

Fatal Exception: java.lang.StackOverflowError
at android.graphics.Paint.set(Paint.java:437)
at android.view.GLES20Canvas.drawText(GLES20Canvas.java:1010)
at android.view.GLES20RecordingCanvas.drawText(GLES20RecordingCanvas.java:256)
at android.text.Layout.draw(Layout.java:422)
at android.widget.TextView.onDraw(TextView.java:5082)
at android.view.View.draw(View.java:11015)
at android.view.View.getDisplayList(View.java:10454)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.draw(View.java:11018)
at android.support.v4.view.ViewPager.draw(ViewPager.java:2415)
at android.view.View.getDisplayList(View.java:10454)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.draw(View.java:11018)
at android.view.View.getDisplayList(View.java:10454)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.support.v7.widget.RecyclerView.drawChild(RecyclerView.java:3838)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.draw(View.java:11018)
at android.support.v7.widget.RecyclerView.draw(RecyclerView.java:3308)
at android.view.View.getDisplayList(View.java:10454)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2588)
at android.view.View.draw(View.java:11018)
at android.view.View.getDisplayList(View.java:10454)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.draw(View.java:11018)
at android.support.v4.view.ViewPager.draw(ViewPager.java:2415)
at android.view.View.getDisplayList(View.java:10454)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.draw(View.java:11018)
at android.widget.FrameLayout.draw(FrameLayout.java:450)
at android.view.View.getDisplayList(View.java:10454)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.draw(View.java:11018)
at android.support.v4.view.ViewPager.draw(ViewPager.java:2415)
at android.view.View.getDisplayList(View.java:10454)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.draw(View.java:11018)
at android.widget.FrameLayout.draw(FrameLayout.java:450)
at android.view.View.getDisplayList(View.java:10454)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.draw(View.java:11018)
at android.view.View.getDisplayList(View.java:10454)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
# at com.jude.swipbackhelper.SwipeBackLayout.drawChild(SwipeBackLayout.java:292)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.getDisplayList(View.java:10452)
at android.view.ViewGroup.drawChild(ViewGroup.java:2942)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2581)
at android.view.View.draw(View.java:11018)
at android.widget.FrameLayout.draw(FrameLayout.java:450)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2167)
at android.view.View.getDisplayList(View.java:10454)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:858)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2089)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1787)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2642)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4647)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
at dalvik.system.NativeStart.main(NativeStart.java)

看起来是绘制的嵌套太深了,导致栈溢出了。
能不能先try catch一下?

<item name="android:windowIsTranslucent">false</item>无效

首先感谢作者解决卡顿的问题。我遇见的问题是在主activity的theme中添加 false, readme.txt也提到设置了之后就不会滑动退出了。但是我现在是设置了以后依旧滑动退出了。我的手机是小米note以及华为P6

java.lang.ClassCastException: android.view.View cannot be cast to android.view.ViewGroup

和demo一样配置
@OverRide
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
SwipeBackHelper.onPostCreate(this);
}
产生了这个错误
Caused by: java.lang.ClassCastException: android.view.View cannot be cast to android.view.ViewGroup
at com.jude.swipbackhelper.SwipeBackLayout.attachToActivity(SwipeBackLayout.java:331)
at com.jude.swipbackhelper.SwipeBackPage.onPostCreate(SwipeBackPage.java:30)
at com.jude.swipbackhelper.SwipeBackHelper.onPostCreate(SwipeBackHelper.java:42)
at com.example.ui.base.BaseActivity.onPostCreate(BaseActivity.java:165)
求助

2.0.2版本手势事件有bug

setSwipeEdge(200) 200 以外的滑动

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (!mEnable) {
        return false;
    }
    try {
        mDragHelper.processTouchEvent(event);  出现异常
    } catch (Exception e) {
        // FIXME: handle exception
        // issues #9
        Log.i("SWIP", "ERROR"); 打出日志
        return false; 不执行这个return 
    }
    return true;  执行这个 return
}

导致 页面 假死 (recyleView )不能滑动
再一次 向右滑动在 200 以内才会 好使

PopupWindow如何处理?

如果在activity中有PopupWindow,会导致activity变成透明的,这种情况要如何处理呢?
如果是把activity的android:windowIsTranslucent属性直接设置成false不太好,这样在右滑退出时,前一个activity就不是半透明而是全黑了

windowIsTranslucent设置为"true"之后

windowIsTranslucent设置为"true"之后 从该activity中启动的所有activity都不可以应用其他动画了,比如我想要在发布按钮点击后向上弹出activity并且关闭发布界面的时候也要向下关闭

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.