滑动即可完成活动模式

Cha*_*ake 2 android design-patterns

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

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

这个行为是如何实现的?

Knu*_*dna 11

[免责声明:以下论文是在检查Telegram的源代码仅一小时左右后撰写的,因此可能包含重要的缺陷或错误.随意发表评论]

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

由于Telegram是开源的,您可以查看其代码库以了解它是如何实际完成的.

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

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

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

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

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

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

现在,如果你看一下onTouchEvent()这个ActionBarActivity类的方法,这似乎是负责实现"轻扫以消除"效果的核心算法的人.这会跟踪用户的手指并相应地移动假片段的视图.当用户抬起手指时,如果解除"片段"的条件为真(backAnimation为假),则删除片段:当动画结束时,onSlideAnimationEnd()调用该方法,然后从片段堆栈中删除"片段"在ActionBarActivity课堂上保留.

因此,简而言之,Telegram通过实现一个时髦的"片段"系统来实现"轻扫以消除"效果,其中似乎是一个Activity是一个通过子类建模的原始视图BaseFragment.这迫使他们推出自己版本的动作栏,并遵循一些非常奇怪和"非标准"的Android技术.

我实际上并不知道Telegram是以这种方式实现的,所以此刻我有点失望.我期待他们访问一些隐藏的Android API,这当然是错误的,但至少它不会像实现他们自己的操作栏和"片段"系统那么麻烦和丑陋.从现在开始,对我来说,Telegram的代码将是你在Android中不能做的事情的参考.