详解如何在Android中实现悬浮Activity

 更新时间:2017年01月05日 16:42:44   作者:海燕885  
本篇文章主要介绍详解如何在Android中实现悬浮Activity,通过修改Activity的实现来适配平板设备,已达到代码的最大利用率。有兴趣的可以了解一下。

通常来说,为一款已经优化过的手机APP开发平板的版本也不是很难。使用Fragment、decompose Entities等组件就可以又快又轻松地完成。但是,最近遇到一个项目就没有这么简单了。我们不只要开发一个平板APP(基于ActionBarSherlock库,也称作ABS),还需要实现以下功能:

  • 实现一个悬浮并且透明显示的Activity,这样用户在进行输入操作的时候可以看到别的Activity或者它自己的窗口背景;
  • 保存悬浮的Activity的原始尺寸,包括水平方向和竖直方向;最好是Activity可以居中显示,在小尺寸设备上可以全屏显示,在大尺寸设备上至少显示2/3的大小。

因为我们之前说过已经有了一个开发好的手机APP,所以如果为了讲这个重新设计再编码那就浪费时间了。以下的讲解和描述都是基于已有的代码,通过修改Activity的实现来适配平板设备,已达到代码的最大利用率。

如何在Android中实现悬浮Activity

如何在Android中实现悬浮Activity

任务概述

这里主要有三个任务:

  • 计算已有的Activity的尺寸并确定它的新坐标位置;
  • 使Activity透明,可以看见其背景;
  • 处理背景使其不能再和用户进行交互。

计算窗口大小

前面提到,我们需要以一个已有的手机APP为基础(使用了ActionBarSherlock库),这个库我们已经以一个外部库的形式集成到项目中,并带有源代码。

如果对ABS的源码很熟悉或者曾对原生ActionBar的构架有了解,就会发现:如果改变Activity的大小,那在调用setContentView方法的时候,功能没有实现:ActionBar的大小和位置都没有变化。这时要做的就是在更高的级别里操作,在系统绘制ActionBar的时候——ABS或者原生的ActionBar,这时候还没有任何窗口的数据,这样我们就可以按照需要调整了。

最显而易见的方式就是改变Window的尺寸,所以这里需要以下这段代码:

@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
if (getResources().getBoolean(R.bool.is_tablet) && mOpenAsSmallWindow) {
final View view = getWindow().getDecorView();
final WindowManager.LayoutParams lp = (WindowManager.LayoutParams) view.getLayoutParams();
lp.gravity = Gravity.CENTER;
lp.width = mActivityWindowWidth;
lp.height = mActivityWindowHeight;
getWindowManager().updateViewLayout(view, lp);
}
}

代码执行完毕后,就可以看到窗口的大小已经根据mActivityWindowWidth和mActivityWindowHeight的值发生了改变。

is_tablet检查只对平板有效,mOpenAsSmallWindow标识表示是否让窗口全屏显示或者是否作为新的窗口渲染。

如果在运行的时候报错了,错误日志是:ActionBarView can only be used with Android:layout_width="match_parent" (or fill_parent).那不用担心,我们有ABS的源码,直接修改源码就可以了。

打开ActionBarView这个文件,然后再onMeasure方法里把抛出的异常注释掉——这样应该就可以解决问题了。安卓上使用的是比较特殊的权限控制机制,所以这里我们可以继续深入的不多,也许还能粗略计算菜单项等,不过很多东西我们都不可把控。
注意:这个方法没有在原生ActionBar上测试,因为这里只是在作者的Android版本中测试过。如果要禁用ActionBar,需要找到ActionBarSherlock这个类,然后注释掉以下这行代码:

 // registerImplementation(ActionBarSherlockNative.class);

代码运行应该没问题,然后就可以看到不透明背景的Activity了。

如何在Android中实现悬浮Activity

添加透明功能

在实现了Activity的尺寸和大小都改变后,现在就要让它透明了。可以给这个平板上的Activity主题添加这个属性:

<item name="android:windowIsTranslucent">
  true
</item>

这个属性值可以使Activity背景透明。

如何在Android中实现悬浮Activity

看起来不错,效果已经基本实现了。

还有一个小问题:以上测试的都是在Nexus7 android4.3上执行,而这个App在Nexus7 的android4.2版本中,Activity没有显示。

经过多次调试和日志检查后,发现我们的Activity(就叫MainActivity吧)没有被销毁(没有调用onDestroy方法),所以Android系统就把它忽略了,没有绘制它。为什么呢?因为Android 4.4 KitKat新增了一个优化算法。因为这个优化算法,Android系统看到Activity为全屏显示模式(不管WindowManager的改变),就会绘制这个MainActivity,但是它之上的东西就被忽略了,所以我们就看不到任何显示了。

我们研究了下这个问题,然后发现对话框和其他不全屏显示的部件都可以正常绘制,所以我们需要在主题theme里加上这几行:

<item name="android:windowIsFloating">true</item>
<item name="android:windowCloseOnTouchOutside">false</item>
<item name="android:colorBackgroundCacheHint"><a href="http://www.jobbole.com/members/NULL/" rel="nofollow">@null</a></item>
<item name="android:backgroundDimEnabled">true</item>

这样问题就解决了。综上所述,我们就实现了一个悬浮、透明的Activity。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android实现动态高斯模糊背景效果

    Android实现动态高斯模糊背景效果

    在现代 Android UI 中,动态高斯模糊背景 常见于对话框或弹窗后面的模糊遮罩,相比静态模糊图,动态模糊可随着内容滚动或变化实时更新,使界面更具层次感与沉浸感,所以本文给大家介绍了Android实现动态高斯模糊背景效果,需要的朋友可以参考下
    2025-04-04
  • Android不压缩图片实现高清加载巨图实例

    Android不压缩图片实现高清加载巨图实例

    这篇文章主要为大家介绍了Android不压缩图片实现高清加载巨图实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Android Studio3.2中导出jar包的过程详解

    Android Studio3.2中导出jar包的过程详解

    这篇文章主要介绍了Android Studio3.2中导出jar包的过程,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • android获得当前view在屏幕中坐标的方法

    android获得当前view在屏幕中坐标的方法

    这篇文章主要介绍了android获得当前view在屏幕中坐标的方法,涉及Android针对view坐标相关属性的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • 详解android 视频图片混合轮播实现

    详解android 视频图片混合轮播实现

    这篇文章主要介绍了android 视频图片混合轮播实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 详解Android如何自定义view实现圆形进度条

    详解Android如何自定义view实现圆形进度条

    Android中实现进度条有很多种方式,自定义进度条一般是继承progressBar或继承view来实现。本文将介绍通过自定义View实现的圆形进度条,感兴趣的可以动手试一试
    2022-01-01
  • android onTouchEvent处理机制总结(必看)

    android onTouchEvent处理机制总结(必看)

    下面小编就为大家带来一篇android onTouchEvent处理机制总结(必看)小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 基于Android应用中如何反馈Crash报告的详解

    基于Android应用中如何反馈Crash报告的详解

    本篇文章是对在Android应用中如何反馈Crash报告的详细分析介绍。需要的朋友参考下
    2013-05-05
  • Android 中为什么要用Fragment.setArguments(Bundle bundle)来传递参数

    Android 中为什么要用Fragment.setArguments(Bundle bundle)来传递参数

    这篇文章主要介绍了Android 中为什么要用Fragment.setArguments(Bundle bundle)来传递参数,非常不错,具有参考借鉴价值,需要的朋友参考下
    2017-01-01
  • Android实现高德地图首页效果(上)

    Android实现高德地图首页效果(上)

    这篇文章主要为大家详细介绍了基于Android实现高德地图首页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-08-08

最新评论