像知乎、iOS那样滑动Activity

这里只介绍原理,更详细的实现代码地址在此:https://github.com/NashLegend/SwipetoFinishActivity



这是Activity滑动的示意图

像fragment一样,activity本身是没有滑动的方法的,但是我们可以制造一个正在滑动activity的假象,使得这个activity看起来正在被手指滑动。其原理其实很简单,我们滑动的其实是activity里面的可见view元素,同时我们将activity设置为透明的,这样当activity中可见的view元素滑过的时候,由于activity的底部是透明的,我们就可以在滑动过程中看到下面的activity,这样看起来就是在滑动activity。所以activity滑动效果分两步,1,设置activity透明,2,滑动view。

  1. 设置透明: 建立一个Style,在Style里面添加下面两行,并将这个style应用在activity上就可以了

    <item name="android:windowBackground">@*android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
  2. 滑动view:先看看activity的层次结构:如下图,我们用的activity的xml的根view(在下图中是倒数第二层的FrameLayout)并不是activity的根view,在它上面还有一个父view,id是android.R.id.content,再向上一层,还有一个view,它是一个LinearLayout,它除了放置我们创建的view之外,还放置我们的xml之外的一些东西比如放ActionBar或者标题栏(在下图是左边那一分枝)。而再往上一级,就到了activity的根view——DecorView。

    要做到像iOS那样,可以滑动整个activity,只滑动我们在xml里面创建的view显然是不对的,因为我们还有标题栏、ActionBar什么的,所以我们要滑动的应该是DecorView或者倒数第二层的那个view。

    而要滑动view的话,我们要重写其父窗口的onInterceptTouchEvent以及onTouchEvent【当然使用setOnTouchListener也可以,但是如果有一个子view消费了onTouch事件,那么也就接收不到了】,但是窗口的创建过程不是我们能控制的,DecorView的创建都不是我们能干预的。解决办法就是,我们自己创建一个SwipeLayout,然后人为地插入到顶层view中,放置在DecorView和其下面的LinearLayout中间,随着手指的滑动,不断改变SwipeLayout的子view——曾经是DecorView的子view——的位置,这样我们就可以控制我们的滑动啦。

    我们在自定义的SwipeLayout中添加一个replaceLayer,这个方法执行将SwipeLayout插入顶层的代码,并在activity的onPostCreate()方法中调用swipeLayout.replaceLaye()替换我们的SwipeLayout,代码如下:

    public void replaceLayer(Activity activity) {
        mActivity = activity;
        screenWidth = getScreenWidth(activity);
        setClickable(true);
        ViewGroup root = (ViewGroup) activity.getWindow().getDecorView();
        content = root.getChildAt(0);
        ViewGroup.LayoutParams params = content.getLayoutParams();
        root.removeView(content);
        this.addView(content);
        root.addView(this, params);
    }

然后我们把这些写成一个SwipeActivity,其它activity只要继承这个SwipeActivity并设置上第一步中的style就可以实现滑动返回功能, 这里只说滑动activity的原理,剩下的都是控制滑动以及关闭Activity什么的事了,详见代码在这里:  摸我



BTW,滑动Fragment原理其实一样,只不过更加简单,省去替换那一步,Fragment在view树中就是它onCreateView返回的元素,用fragment.getView可以取得,滑动fragment其实滑动的就是fragment.getView。只要把滑动方法写在它父view中就可以了。

时间: 2024-10-29 02:50:19

像知乎、iOS那样滑动Activity的相关文章

类似IOS的滑动返回上一级,SwipeBackLayout-android的滑动返回类库

     最近,公司在开发App的需求中增加了一个新的需求,要在android的页面中增加向右滑动的时候返回上一级页面.我刚知道这个需求的时候,感觉有点坑,可能设计那边最近接触到知乎的客户端或者是IOS的滑动可以返回上一级的效果,所以...     之前没有接触过android的滑动返回的开源库,所以还是找一下百度...    后来在Github上找到了SwipeBackLayout:GitHub地址是:https://github.com/ikew0ng/SwipeBackLayout   

ios navigationcontroller 滑动返回与webview加载html图片自适应屏幕宽度

1 .ios navigationcontroller 滑动返回 滑动返回是navigationcontroller默认返回按钮自带的功能,如果返回按钮自定义该功能失效, 解决的办法有两个: ① self.navigationItem.backBarButtonItem =   [[UIBarButtonItem alloc]initWithCustomView:button];//这个方法用不了 只能用 self.navigationItem.backBarButtonItem = [ [UI

android 下拉刷新上拉加载更多,高仿ios左滑动删除item,解决了众多手势问题

一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相!现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; i

IOS 自定义 滑动返回 手势

/** 只需要在你自定义的导航控制器中,改成如下代码即可,自定义手势返回 */ #define KEY_WINDOW [[UIApplication sharedApplication] keyWindow] #define kScreenW KEY_WINDOW.bounds.size.width #define kAnimateDuration 0.3 #define kDefaultAlapa 0.5 #define kDefaultScale 0.95 #define iOS7 ([UI

Cocos2d-x3.1下实现类似iOS页面滑动指示圆点

原文地址:http://blog.csdn.net/qqmcy/article/details/37612457 代码下载:http://download.csdn.net/detail/qqmcy/7613835 SliderIndicatorLayout.h // // SliderIndicatorLayout.h // ht_mobile_cpp // // Created by 杜甲 on 14-7-9. // // #ifndef __ht_mobile_cpp__SliderInd

IOS的滑动菜单(Sliding Menu)的详细写法(附代码)

滑动菜单是一个非常流行的IOS控件 先上效果图:        这里使用github的JTReveal框架来开发,链接是https://github.com/agassiyzh/JTRevealSidebarDemo/commit/ac03d9d7be4f1392020627e5fe8c22b972de4704 我们的ViewController要实现protocol JTRevealSidebarV2Delegate的两个optional方法 @optional - (UIView *)vie

解决页面使用overflow: scroll,overflow-y:hidden在iOS上滑动卡顿的问题

解决页面使用overflow: scroll,overflow-y:hidden在iOS上滑动卡顿的问题 div{ width: 100%; overflow-y: hidden; -webkit-overflow-scrolling: touch; } 在使用overflow的的地方加上?-webkit-overflow-scrolling: touch;便可解决页面在ios机器上卡顿的问题. 解决由-webkit-overflow-scrolling: touch 引起的ios滚动条(将滚动

Android 实现 IOS相机滑动控件

 IOS相比于Android,动画效果是一方面优势,IOS相机切换时滑动的动画很不错,看着是有一个3D的效果,而且变化感觉很自然.Android也可以通过Graphics下面的Camera可以实现3D效果,开始尝试着用这个做了一下,效果不理想,滑动之后各组文字之间的距离就变了,从立体空间来说这是合逻辑的,但是看着很别捏.IOS相机的滑动效果文字之间的间隔在滑动的时候是不变的. 后面通过调整TextView X方向的scale使文字看着紧凑一点,然后通过计算的距离的方式,在滑动的时候保持各组文字之

ANDROID仿IOS微信滑动删除_SWIPELISTVIEW左滑删除例子

http://dwtedx.sinaapp.com/itshare_290.html 本例子实现了滑动删除ListView的Itemdemo的效果.大家都知道.这种创意是来源于IOS的.左滑删除的功能.在Android上面实现比较麻烦.本例子中不仅实现了左滑删除功能.还实现了左滑赞.左滑分享.左滑收藏等功能.当然大家也可以根据自己项目的需求来修改功能.QQ和微信也实现了相同的功能.大家可以看看.先上程序运行的效果 怎么样.大家看了这个截图是不是很心动呀.而且在左滑的时候还配有简单的滑动动画呢.非