沉浸式中显示 PopupWindow

在全屏沉浸模式时(Immersive Full-Screen Mode),如果弹出 Dialog 或 PopupWindow,则会自动退出沉浸模式。退出沉浸式的原因是因为 Activity 的 Window 焦点被抢走了,Window 中的 DecorView 状态改变导致了退出。如果要继续保持沉浸模式。对于 Dialog 情况,这里有解决办法 。 Dialog 在初始化时会生成新的 Window,先禁止 Dialog Window 获取焦点,等 Dialog 显示后对 Dialog Window 的 DecorView 设置 setSystemUiVisibility ,接着再获取焦点。 这样表面上看起来就没有退出沉浸模式。而 PopupWindow 并没有创建新的 Window,只是将 PopupWindow 的 View 添加到当前的…

Read this article

GroupSnapHelper

Android Support Library v24.2.0 版中,RecyclerView 新增加了 OnFlingListener 接口, 同时提供了SnapHelper 抽象类和 LinearSnapHelper 实现类,用来处理在滚动过程中的定位。试用了一下 LinearSnapHelper , 使用的场景类似 WheelPicker 或 ViewPager,滚动后能将最接近 RecyclerView 中心的 closestItem 滚动居中。想了一下,可以用这一特性来实现滑动一组 items ,代替 ViewPager 嵌套 RecyclerView 的情况。代码见 GroupSnapHelper在 LinearSnapHelper 和 SnapHelper 之间绕了半天,发现其实实现起来也挺简单的,在 LinearSnapHelper 基础上根据查找到的 closestItem , 再查找计算包含 closestItem 的 item…

Read this article

PhotoDraweeView

前段时间 Facebook 祭出大杀器 Fresco,基本解决了所有 Android 图片加载需求,相比现有图片加载库,最大的亮点就是三级缓存,然后其它零零碎碎的小需求都已近写好了,用起来简单省心。于是趁着有空就开始逐步把项目里的图片加载改成 Fresco。但在图片缩放预览就卡住了,Fresco 还不支持缩放平移等,常见的一些图片缩放库都是使用 ImageView 和 Drawable 来实现基本功能。而且 Fresco 文档里明确指出它的 DraweeView 和系统的 ImageView 将会是两个独立的控件,DraweeView 里又有许多不同特性的 Drawable,无法简单获取真正图片的 Drawable。 所以只能自己实现了,写了下面这个:PhotoDraweeView参照 PhotoView 和 Fresco 的一些 issues。实现了常用的双指缩放、双击缩放、平滑移动。因为 Fresco 版本升级很快,API 可能也会有少许变动,而且我也赶时间没有什么配置,…

Read this article

ViewPagerHeader滚动

【Update 2015.09.06】使用新的Android Design Support Library中的 CoordinatorLayout可以完美实现这个功能。这不太会起标题的名字了。简单来说想在 ViewPager 上方加一个 Header,当 ViewPager 内部滚动时,同时或者优先滚动顶部的 Header。总结一下,大概有3种方案。 Android 5.0 电话里联系人。 当 ViewPager 内部列表向上滚动时,Actionbar 滚动隐藏,向下滚动时跟着出现。不过这是 API 21 的新特性(setHideOnContentScrollEnabled(boolean hideOnContentScroll) 和 setNestedScrollingEnabled (boolean enabled)),不能广泛使用。 Google Play 应用列表。 首先需要给 ViewPager 内部的 ListView…

Read this article

使用manifestPlaceholders

【内容过期】发现前几天 Android Studio Gradle Plugin 发布了0.13.0版, 终于支持Gradle 2.1了。其中Product Flavors能支持AndroidManifest placeholder了,赶紧应用起来。比如我需要打包不同渠道的APK,需要在AndroidManifest中定义渠道名称,以便在java中调用。以前ant或gradle打包时动态改变渠道的思路是:正则AndroidManifest的特定字符然后替换。新版本直接可以省掉自己编写正则的过程啦。旧版gradle编写(参考友盟渠道打包)AndroidManifest.xml<meta-data android:name="channel" android:value="CHANNEL_VALUE"/> builde.gradleandroid { productFlavors { "xiaomi"{} "360market"{} "…

Read this article