如何在 Android 中干净地叠加 ScrollableViews

Posted

技术标签:

【中文标题】如何在 Android 中干净地叠加 ScrollableViews【英文标题】:How to cleanly superpose ScrollableViews in Android 【发布时间】:2012-04-19 05:49:48 【问题描述】:

为了实现导航栏ala Facebook 我有以下布局配置:

<FrameLayout
  android:layout_
  android:layout_
>
   <!-- This is the Lower Layer hosting the navbar -->
   <LinearLayout
      android:layout_
      android:layout_
   >
      <!-- ListView representing the navbar -->
      <ListView 
       />
   </LinearLayout>

   <!-- This is the Top Layer hosting the Content -->
   <FrameLayout 
      android:layout_
      android:layout_
   > 
      <!-- This is where the View of the Content will be injected -->
   </FrameLayout>
</FrameLayout>

所以基本的想法是,当我想打开 navbar 时,我只需将 TopLayer 向右移动,导航栏就会显示出来。 现在这很好用,我可以与 navbar 的 ListView 交互,以便在应用程序中导航,只要注入到 TopLayer 中的视图不是 ScrollableView(比如另一个ListViewScrollViewWebView)。

例如,当TopLayerWebView实例时,我无法滚动并与导航栏的 ListView进行交互,因为滚动的是WebView(尽管我把它移到了右边)。

我想叠加许多ScrollableView 并不是一件容易的事,但我希望有一些技巧可以克服这些问题。

感谢您的帮助!

编辑

顺便说一句,这就是我转移TopLayerview 的方式(使用TranslateAnimation):

TranslateAnimation translateAnim = new TranslateAnimation(0.0F, mListView.getWidth(), 0.0F, 0.0F);
translateAnim.setDuration(..);
translateAnim.setFillAfter(true);
mTopLayerView.startAnimation(translateAnim);

【问题讨论】:

【参考方案1】:

根据我的应用 - Android UI Patterns (https://play.google.com/store/apps/details?id=com.groidify.uipatterns),Facebook 导航和动画有 2 个示例实现,这是:

android-sliding-menu-demo: https://github.com/gitgrimbo/android-sliding-menu-demo gui-滑动侧边栏:https://github.com/walkingice/gui-sliding-sidebar

如果有效,你可以试一试吗?

【讨论】:

【参考方案2】:

原来问题不是由于叠加ScrollableViews 或其他原因,而是由于使用TranslateAnimation 时动画视图的逻辑位置(即:不可见)仍然绑定到其原始位置。因此,当我以为我在点击导航项时,实际上我正在与我认为已经移动的ContentView 进行交互。

现在我正在使用ObjectAnimator,它解决了这个问题并且效果很好。我只需要确保与 Pre-Honeycomb 设备的兼容性(我正在考虑使用 NineOldAndroids 解决这个问题。如果有人知道使用旧动画 API 正确解决此问题的任何其他替代方法,请随时回答此 question) .

【讨论】:

以上是关于如何在 Android 中干净地叠加 ScrollableViews的主要内容,如果未能解决你的问题,请参考以下文章

Android Scroll 分析

在干净的架构中,如何进行验收测试?

如何在适用于 Android 的 Google API 的 CameraSource 中保存带有叠加层的图像?

如何在 AngularJS 中干净地构建组件/结构逻辑

Android Room Database:如何嵌入多个实体

如何干净地覆盖属性设置器?