滑动即可完成活动模式

时间:2014-02-11 18:03:53

标签: android design-patterns

我在Tumblr和Telegram应用程序上都看到了这种模式。

当您处于详细视图中时(在Tumblr上搜索标签或在Telegram上的对话中)并从左向右滑动(就像您要拉一个Navigation Drawer),您可以看到之前的活动从那里出现。如果您将其释放,则活动结束。

这种行为是如何实现的?

3 个答案:

答案 0 :(得分:11)

[免责声明:以下论文是在大约一个小时左右的时间内撰写Telegram的源代码后写的,所以它可能包含重要的缺陷或错误。随意评论]

Telegram的案例与Teovald所说的完全不同。在Telegram的案例中,它不是固定的图像。你可以通过打开聊天来检查这一点,其中有人正在写半滑。您将看到"聊天活动"和#34;聊天活动列表"实时更新,如果使用静态图像完成效果,情况就不会如此。

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

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

首先,您可以查看Telegram的清单文件,看看他们只定义了三项活动(LaunchActivityIntroActivityPopupNotificationActivity)...三项活动!任何使用Telegram的人都同意该应用程序似乎有三个以上的活动,所以无论他们在做什么,看起来在实践中他们只有一个活动同时运行(LaunchActivity),这通过一些机制显示不同的"活动如"内容。

的确,如果你转到LaunchActivity,你会发现它继承了所谓的ActionBarActivity,它将成为Telegram中所有真实活动的基类(虽然在实践中只有LaunchActivity似乎扩展了它)。此活动似乎与其他类一起实施操作栏。是的,这意味着Telegram不使用标准操作栏,也没有定义任何类型的包装器来使用" mock" Android版本< 11和Android上的真实版本> = 11.它非常扭曲,但您可以查看它们的操作栏(类ActionBar以及其他依赖类)的实现,并查看它们实际上是创建一个原始FrameLayout并将其嵌入以模拟操作栏。这意味着,除其他外,他们不会为每个"活动定义操作栏的XML资源,而是手动填充它。非常繁琐且非常不标准,在我看来,Telegram在未来版本的Android中改进动作栏方面有点弱。

现在,最让我担心的是他们完全忽略了Android的活动和片段系统,推出了他们自己的版本。确切地说,它们并不像他们完全无视Android的活动和碎片,但是他们正在使用一些技术(在我的拙见中)可能会被大多数Android开发人员所厌恶。< / p>

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

总结一下到目前为止我所解释的内容,Telegram似乎是一个运行单个活动的应用程序(LaunchActivity,后者继承自ActionBarActivity),它实现了一个自定义的操作栏和一个奇怪的&#34;片段&#34;模拟常规Android活动的框架,至少在视觉层面。

现在,如果您查看onTouchEvent()类的ActionBarActivity方法,这似乎是负责实施&#34;轻扫以解除&#34;的核心算法的方法。影响。这跟踪用户的手指并相应地移动假片段的视图。当用户抬起手指时,如果条件解除&#34;片段&#34;如果为真(backAnimation为假),则删除片段:当动画结束时,调用onSlideAnimationEnd()方法,然后删除&#34;片段&#34;来自ActionBarActivity类保留的片段堆栈。

因此,简而言之,Telegram完成了轻扫以解雇&#34;实施一个时髦的片段&#34;似乎是Activity的系统是通过BaseFragment的子类建模的原始视图。这迫使他们推出他们自己版本的动作栏,并且还要遵循一些非常奇怪的&#34;非标准&#34; Android技术。

我实际上并不知道Telegram是以这种方式实现的,所以此刻我有点失望。我期待他们访问一些隐藏的Android API,这当然是错误的,但至少它不会像实现他们自己的操作栏和&#34;片段&#34;那样繁琐和丑陋。系统。从现在开始,对我而言,Telegram的代码将成为您在Android中不能做的事情的参考。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我刚刚实现了这个,请在​​这里查看

SwipeFinishableActivity

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