如何在Android中实现悬浮Activity
发布网友
发布时间:2022-04-21 12:54
我来回答
共1个回答
热心网友
时间:2022-04-14 23:36
计算已有的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了。
添加透明功能
在实现了Activity的尺寸和大小都改变后,现在就要让它透明了。可以给这个平板上的Activity主题添加这个属性:
<item name="android:windowIsTranslucent">true</item>
这个属性值可以使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>
如何在Android中实现悬浮Activity
1、将需要悬浮的Activity设置dialog的样式主题,定义样式文件如下:<?xml version="1.0" encoding="utf-8"?> <resources> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> </resources> 2、在在清单文件中给activity设...
android 怎么设置 悬浮activity
WindowManager实现悬浮窗需要声明权限 首先在manifest中添加如下权限:<!-- 显示顶层浮窗 --><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 注意:在MIUI上需要在设置中打开本应用的”显示悬浮窗”开关,并且重启应用,否则悬浮窗只能显示在本应用界面内,不能显示在手机桌面上。服务获取和基...
如何在Android中实现悬浮Activity
打开ActionBarView这个文件,然后再onMeasure方法里把抛出的异常注释掉——这样应该就可以解决问题了。安卓上使用的是比较特殊的权限控制机制,所以这里我们可以继续深入的不多,也许还能粗略计算菜单项等,不过很多东西我们都不可把控。注意:这个方法没有在原生ActionBar上测试,因为这里只是在作者的Android版...
android开发怎样让悬浮Activity只是隐藏而不销毁
性 android:theme="@android:style/Theme.Dialog",可以使Activity悬浮在其它窗口上面,在布局中可以设置activity的大小,当点击悬浮Activity边缘以外区域时,Activity会消失,观察消失时其生命周期会发现执行了finish()方法从而执行了onDestroy方法。有时我们只是需要将Activity隐藏,并不销毁,此时可以重写finish方...
android开发怎样让悬浮Activity只是隐藏而不销毁
manifest中为相应的Activity设置android:configChanges属性即可Andorid 3.2以前的SDK可以使用如下配置android:configChanges="orientationkeyboardHidden"而Adnroid 3.2以后的SDK必须添加一个screenSize属性,具体如下android:configChanges="keyboardHiddenorientationscreenSize"或者android:configChanges="orientationscreenSize"...
求大神指点,android如何实现这种Activity效果? 比如说,我打开文件管理...
貌似是由服务在后台打开一个popupwindows吧,或者是手机特有的功能,比如三星note3就有悬浮窗口
【MyAndroid】RecyclerView实现头部悬浮吸顶效果且可点击--100个经典UI...
首先,代码结构主要包括RecyclerView、LinearLayoutManager和Adapter。在布局中,关键部分是StickyHeadContainer的使用,如在StockActivity的initView()方法中。要确保头部悬浮吸顶效果的显示,务必在RecyclerViewAdapter中设置mDataCallback。StickyHeadContainer的onDataChange()方法是实现吸顶效果的关键,其源码清晰易...
android中主Activity是什么意思
android中主Activity是指应用的主界面。Activity本身是用户能够操作的活动界面。通常我们所配置的android.intent.action.MAIN不一定是主界面,有可能是启动页,启动之后就销毁了,而另外开启一个主界面。
...然后出现一片文章的效果(用的是在一个activity中调用一个fragment...
你要控制一下ListView和Fragment的布局,不然确实会出现重叠,Fragment是轻量级的Activity,是为了方便在同一个Activity使用不同的布局而引入的,你的这种需求可以不用Fragment,要使用就要重新修改布局才行。
在android中,设置一个activity在后台运行??
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);并不是设置后台运行,而是设置这个intent启动的activity优先创建一个新的task将这个activity做为该task的root。如果实在是向要在activity b中按返回的时候回到activity a 同时b不销毁,那就要重写onKeyDown回调来更改返回按钮的行为了,改为启动activity a。