2014-02-11 39 views
2

我在Tumblr和Telegram应用中都看到过这种模式。滑动即可完成活动模式

当您处于详细视图(在Tumblr或电报对话中搜索Hashtag)并从左向右滑动(例如,如果您要拉Navigation Drawer),您可以看到之前的活动出现从那里。如果你释放它,活动结束。

这种行为是如何实施的?

回答

2

像任何良好的视觉特征,这是一个把戏:-)。
如果您使用UI Automator工具在这些幻灯片的中间转储屏幕内容,则可以看到“旧片段”实际上只是一个图像视图。
只有当幻灯片完成时,前一个片段/活动才从后退堆栈中取出。 DDMS rules !

+0

这怎么办?你如何制作一个是前一个屏幕截图的图像视图? –

+0

@AdamKatz无法确定..特别是因为它是前一阵子,但最简单的方法是在停止前一个屏幕时获取视图背后的位图。 它听起来非常昂贵的内存明智,虽然 – Teovald

+0

,我需要无限的层叠这些转换,也许这不是最好的路线:( –

11

【免责声明:以下论文是在考察电报的源代码一小时左右后写出的,因此可能含有重要的缺陷或错误。随意评论]

电报的情况看起来与Teovald所说的完全不同。在电报的情况下,它不是一个固定的图像。你可以通过例如一个打开的聊天来查看,在这个聊天中有人正在写一半的信息。您会看到,“聊天活动”和“聊天活动列表”都会实时更新,如果通过使用静态图像完成了效果,情况就不会如此。

由于电报是开源的,您可以查看其code base以了解它是如何实际完成的。

经过一段时间自己检查代码后,它看起来像他们做的不是一个视觉技巧。事实上,它的技巧远远超出了小小的欺骗,以此来伪造一些视觉效果。无论如何,它闻起来像一些非标准的东西。

首先,你可以看看电报的清单文件,看看他们只定义了三项活动(LaunchActivity,IntroActivityPopupNotificationActivity)......三项活动!任何使用电报的人都会同意,应用似乎有三个以上的活动,所以无论他们在做什么,实际上他们只有一个活动同时运行(LaunchActivity),通过某种机制显示不同的“活动“内容。

事实上,如果你去LaunchActivity你会看到它从一个所谓的ActionBarActivity,这将是在电报所有真正活动的基类继承(虽然在实践中,只有LaunchActivity似乎把它扩大)。这个活动似乎与其他课程一起执行操作栏。是的,这意味着Telegram不使用标准操作栏,也没有定义任何类型的包装以在Android上使用“模拟”版本和在Android> = 11上使用真实版本。它非常扭曲,但您可以拥有看看他们的操作栏(类ActionBar以及其他相关类)的实现,并看到他们正在创建一个原始的FrameLayout并嵌入它来模拟操作栏。这意味着,除了别的以外,它们不会夸大XML资源来为每个“活动”定义操作栏,而是用手工填充它。非常繁琐而且非常不规范,在我看来,Telegram对未来版本的Android中的操作栏的改进会变得很弱。

现在,我最关心的是他们完全忽略了Android的活动和分片系统,推出了自己的版本。确切地说,并不是他们完全忽略了Android的活动和片段,但他们正在使用一些技术(我的愚见)可能会被大多数Android开发人员所诟病。

如果你看看ActionBarActivity你会发现它扩展了一个普通的Android Activity。它通过onCreate()方法删除(通过其主题和编程方式)标准操作栏和活动标题(这证实了他们使用了他们自己的操作栏的自定义版本)。但最重要的是,它们定义了“碎片”的“堆叠”。这里的“片段”并不是“Android片段”所能理解的,但是它们也推出了一些奇怪的版本来实现“片段”的概念。他们使用BaseFragment类来定义一个“片段”,它基本上是一个通过回调创建其视图的类(就像Android的片段一样),并定义了一些“生命周期”方法,如onPause()onFragmentDestroy()。然后你可以看到我们认为是常规的Android活动实际上是通过这个奇怪的机制BaseFragment s实现的。例如,“聊天活动”由ChatActivity类实现,但这不是从Android的Activity继承,而是从BaseFragment代替。

所以总结一下我迄今解释,电报似乎是运行一个单一的活动(LaunchActivity,这反过来从ActionBarActivity继承),它实现了一个自定义的操作栏和一个奇怪的“片段”框架,它模拟了一个应用程序定期的Android活动,至少在视觉层面。

现在,如果您看ActionBarActivity类的onTouchEvent()方法,这似乎是负责实施“滑动到消除”效果的核心算法的一个方法。这跟踪用户的手指并相应地移动假片段的视图。当用户抬起手指时,如果解除“片段”的条件为真(backAnimation为false),则片段被移除:当动画结束时,将调用onSlideAnimationEnd()方法,然后该方法将从片段堆栈由ActionBarActivity类保留。

因此,简而言之,Telegram通过实现一个时髦的“片段”系统来完成“滑动到解除”效果,其中似乎是一个活动是通过BaseFragment的子类建模的原始视图。这迫使他们推出他们自己版本的操作栏,并且遵循一些非常奇怪的和“非标准”的Android技术。

我其实并不知道电报是这样实施的,所以在这一刻我有点失望。我期待他们访问一些隐藏的Android API,这当然是错误的,但至少它不会像执行自己的操作栏和“碎片”系统那样繁琐和丑陋。从现在开始,对我来说,Telegram的代码将成为你在Android中绝不能做的事情的参考。

0

我刚才已经实现了这个,看看这里

SwipeFinishableActivity

一般来说,您需要一个半透明的顶级活动,这样当您拖动顶级活动时,您可以看到下面的第二个顶级活动。而且你应该跟踪你的触摸事件以在你的活动中移动你的观点。