如何在android 悬浮按钮实现中实现悬浮Activity

&nbsp&#8250&nbsp&nbsp&#8250&nbsp
android悬浮按钮(Floating action button)的两种实现方法
最近中有很多新的设计规范被引入,最流行的莫过于被称作的设计了,是指一种操作按钮,它不是放在actionbar中,而是直接在可见的UI布局中(当然这里的UI指的是setContentView所管辖的范围)。因此它更容易在代码中被获取到(试想如果你要在actionbar中获取一个菜单按钮是不是很难?),往往主要用于一个界面的主要操作,比如在email的邮件列表界面,promoted action可以用于接受一个新邮件。promoted action在外观上其实就是一个悬浮按钮,更常见的是漂浮在界面上的圆形按钮,一般我直接将promoted action称作悬浮按钮,英文名称Float Action Button 简称(FAB,不是FBI哈)。float action button是android l中的产物,但是我们也可以在更早的版本中实现。假设我这里有一个列表界面,我想使用float action button代表添加新元素的功能,界面如下:要实现float action button可以有多种方法,一种只适合android L,另外一种适合任意版本。用实现这种方式其实是在ImageButton的属性中使用了android L才有的一些特性:&ImageButton
android:layout_width="56dp"
android:layout_height="56dp"
android:src="@drawable/plus"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
android:tint="@android:color/white"
android:id="@+id/fab"
android:elevation="1dp"
android:background="@drawable/ripple"
android:stateListAnimator="@anim/fab_anim"
/&仔细一点,你会发现我们将这个ImageButton放到了布局的右下角,为了实现float action button应该具备的效果,需要考虑以下几个方面:???背景上我们使用来增强吸引力。注意上面的xml代码中我们将设置成了 ,的定义如下:&ripple xmlns:android="/apk/res/android" android:color="?android:colorControlHighlight"&
&shape android:shape="oval"&
&solid android:color="?android:colorAccent" /&
&/ripple&既然是悬浮按钮,那就需要强调维度上面的感觉,当按钮被按下的时候,按钮的阴影需要扩大,并且这个过程是渐变的,我们使用属性动画去改变。&selector xmlns:android="/apk/res/android"&
android:state_enabled="true"
android:state_pressed="true"&
&objectAnimator
android:duration="@android:integer/config_shortAnimTime"
android:propertyName="translationZ"
android:valueFrom="@dimen/start_z"
android:valueTo="@dimen/end_z"
android:valueType="floatType" /&
&objectAnimator
android:duration="@android:integer/config_shortAnimTime"
android:propertyName="translationZ"
android:valueFrom="@dimen/end_z"
android:valueTo="@dimen/start_z"
android:valueType="floatType" /&
&/selector&使用自定义控件的方式实现悬浮按钮这种方式不依赖于,而是码代码。首先定义一个这样的类:public class CustomFAB extends ImageButton {
}然后是读取一些自定义的属性(假设你了解styleable的用法)private void init(AttributeSet attrSet) {
Resources.Theme theme = ctx.getTheme();
TypedArray arr = theme.obtainStyledAttributes(attrSet, R.styleable.FAB, 0, 0);
setBgColor(arr.getColor(R.styleable.FAB_bg_color, Color.BLUE));
setBgColorPressed(arr.getColor(R.styleable.FAB_bg_color_pressed, Color.GRAY));
StateListDrawable sld = new StateListDrawable();
sld.addState(new int[] {android.R.attr.state_pressed}, createButton(bgColorPressed));
sld.addState(new int[] {}, createButton(bgColor));
setBackground(sld);
catch(Throwable t) {}
arr.recycle();
}在中我们需要加入如下代码,一般是在文件中。&?xml version="1.0" encoding="utf-8"?&
&resources&
&declare-styleable name="FAB"&
&!-- Background color --&
&attr name="bg_color" format="color|reference"/&
&attr name="bg_color_pressed" format="color|reference"/&
&/declare-styleable&
&/resources&使用来实现不同状态下的背景private Drawable createButton(int color) {
OvalShape oShape = new OvalShape();
ShapeDrawable sd = new ShapeDrawable(oShape);
setWillNotDraw(false);
sd.getPaint().setColor(color);
OvalShape oShape1 = new OvalShape();
ShapeDrawable sd1 = new ShapeDrawable(oShape);
sd1.setShaderFactory(new ShapeDrawable.ShaderFactory() {
public Shader resize(int width, int height) {
LinearGradient lg = new LinearGradient(0,0,0, height,
new int[] {
Color.WHITE,
Color.GRAY,
Color.DKGRAY,
Color.BLACK
}, null, Shader.TileMode.REPEAT);
LayerDrawable ld = new LayerDrawable(new Drawable[] { sd1, sd });
ld.setLayerInset(0, 5, 5, 0, 0);
ld.setLayerInset(1, 0, 0, 5, 5);
}最后将控件放中:&RelativeLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
xmlns:custom="/apk/res/com.survivingwithandroid.fab"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MyActivity"&
&com.survivingwithandroid.fab.CustomFAB
android:layout_width="56dp"
android:layout_height="56dp"
android:src="@android:drawable/ic_input_add"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginRight="16dp"
android:layout_marginBottom="16dp"
custom:bg_color="@color/light_blue"
android:tint="@android:color/white"
&/RelativeLayout&项目的源码下载:
上一篇: Android5.0 Lollipop 的 sdk 发布以后,我就希望兼容包中也包含了新的 Material Design 主题,幸运的是的确如此。 这个新的主题包含在 AppCompat 21 中,所以需要注意的是如果你要将 Material Design 运用到以前的项目中,需要做点额外的工作。 本文演示用最
下一篇: 做Android应用开发的同学们相信对“缓存”这个词不陌生,缓存可能有多方面的概念,这里大概列举下程序开发的缓存大概有哪些: 1.服务端控制缓存 如volley请求库,便是通过服务端的“Cache-Control”和“max-age”来告诉客户端有没有缓存以及缓存的时间,也是将一个activity以对话框的形式悬浮在另一个activity之上_iOS开发_动态网站制作指南
将一个activity以对话框的形式悬浮在另一个activity之上
来源:人气:78
本篇文章主要介绍了&将一个activity以对话框的形式悬浮在另一个activity之上&,主要涉及到将一个activity以对话框的形式悬浮在另一个activity之上方面的内容,对于将一个activity以对话框的形式悬浮在另一个activity之上感兴趣的同学可以参考一下。
dialog&&activity&&android&
达到的效果就像google自带的搜索widiget中,点击录音键弹出的对话框效果一样
除了一个dialog,没有其他的东西,而且背景是半透明的。
在网上搜了一下,android自带theme如下:
oandroid:theme=&@android:style/Theme.Dialog&&& 将一个Activity显示为对话框模式
oandroid:theme=&@android:style/Theme.NoTitleBar&& 不显示应用程序标题栏
oandroid:theme=&@android:style/Theme.NoTitleBar.Fullscreen&& 不显示应用程序标题栏,并全屏
oandroid:theme=&Theme.Light&& 背景为白色
oandroid:theme=&Theme.Light.NoTitleBar&& 白色背景并无标题栏&
oandroid:theme=&Theme.Light.NoTitleBar.Fullscreen&& 白色背景,无标题栏,全屏
oandroid:theme=&Theme.Black&& 背景黑色
oandroid:theme=&Theme.Black.NoTitleBar&& 黑色背景并无标题栏
oandroid:theme=&Theme.Black.NoTitleBar.Fullscreen&&&& 黑色背景,无标题栏,全屏
oandroid:theme=&Theme.Wallpaper&& 用系统桌面为应用程序背景
oandroid:theme=&Theme.Wallpaper.NoTitleBar&& 用系统桌面为应用程序背景,且无标题栏
oandroid:theme=&Theme.Wallpaper.NoTitleBar.Fullscreen&& 用系统桌面为应用程序背景,无标题栏,全屏
oandroid:theme=&Translucent&
oandroid:theme=&Theme.Translucent.NoTitleBar&
oandroid:theme=&Theme.Translucent.NoTitleBar.Fullscreen&
oandroid:theme=&Theme.Panel&
oandroid:theme=&Theme.Light.Panel&
其实,只要在manifest.文件中把&&中设置为android:theme = &@android:style/Theme.Dialog&即可,效果如下:
在这个activity中添加去除标题栏的语句&& &requestWindowFeature(Window.FEATURE_NO_TITLE);
设置Activity的背景为透明色
1.先在res/valaus/下新建color.xm.文件,内容包括:
&?xml version=&1.0& encoding=&utf-8&?&
&resources&
&color name=&white&&#CCCCCCCC&/color& &!-- 白色 --&
&color name=&darkgray&&#A9A9A9&/color& &!-- 暗灰色 --&
&color name=&transparent&&#0000&/color& &!-- 透明色 --&
&/resources&
2.在Activity实现中的OnCreat()方法中添加语句:
Resources res = getResources();
&& &&&&&&&& Drawable drawable = res.getDrawable(R.color.touming);
&& &&&&&&&& this.getWindow().setBackgroundDrawable(drawable);
要让activity 的UI不显示,只是让一个activity 做某一件事情,可以设置主题为android:theme=&@android:style/Theme.Translucent.NoTitleBar&;
其中&@android:style/Theme.Translucent.NoTitleBar&的实现是在theme.xml文件中,进入这个theme.xml文件,&style name=&Theme.Translucent.NoTitleBar&&风格定义:
&style name=&Theme.Translucent.NoTitleBar&&
&&&&&&& &item name=&android:windowNoTitle&&true&/item&
&&&&&&& &item name=&android:windowContentOverlay&&@null&/item&
&&&&&&&& &item name=&android:windowBackground&&@null&/item&
&&& &/style&
对比原来系统生成的是:
&style name=&Theme.Translucent.NoTitleBar&&
&&&&&&& &item name=&android:windowNoTitle&&true&/item&
&&&&&&& &item name=&android:windowContentOverlay&&@null&/item&
&&& &/style&
多了最后一行:&item name=&android:windowBackground&&@null&/item&;OK了。
优质网站模板Android(1)
随着android大屏设备越来越多(手机,电视),许多的应用出于需求考虑,需要实现窗口式activity,并且实现位置修改,具体该如何实现,本文将着重介绍这一点:
首先,悬浮式activity需要在AndroidManifest.xml中对应的activity上配置属性:android:theme=&@style/Theme.WindowActivity&具体属性如下(具体属性需求,可以根据需求做适当变化,此方案只给出个方案参考):
&style name=&Theme.WindowActivity& parent=&android:style/Theme.Dialog&&
&item name=&android:windowNoTitle&&true&/item&
&item name=&android:windowIsTranslucent&&false&/item&
&item name=&android:backgroundDimEnabled&&false&/item&
&item name=&android:windowBackground&&@android:color/transparent&/item&
&item name=&android:windowFrame&&@null&/item&
&item name=&android:windowFullscreen&&false&/item&
做了以上的配置后,activity已经可以实现窗口悬浮式显示了,但是面对大屏显示,需要控制其的显示位置,我们该如何设置呢?可以参考以下方案:
在activity中复写以下方法实现位置控制,具体参考以下代码:
public void onAttachedToWindow() {
View view = getWindow().getDecorView();
WindowManager.LayoutParams lp = (WindowManager.LayoutParams) view
.getLayoutParams();
lp.gravity = Gravity.LEFT | Gravity.TOP;
lp.x = 60;
lp.y = 100;
getWindowManager().updateViewLayout(view, lp);
按照以上的设置,activity在窗口中任意位置的悬浮设置均已可以满足了,本文只是参考,具体值还得看情况修改,谢谢!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1282次
排名:千里之外如何在Android中实现悬浮Activity - 文章 - 伯乐在线
& 如何在Android中实现悬浮Activity
通常来说,为一款已经优化过的手机APP开发平板的版本也不是很难。使用Fragment、decompose Entities等组件就可以又快又轻松地完成。但是,最近遇到一个项目就没有这么简单了。我们不只要(基于ActionBarSherlock库,也称作ABS),还需要实现以下功能:
实现一个悬浮并且透明显示的Activity,这样用户在进行输入操作的时候可以看到别的Activity或者它自己的窗口背景;
保存悬浮的Activity的原始尺寸,包括水平方向和竖直方向;最好是Activity可以居中显示,在小尺寸设备上可以全屏显示,在大尺寸设备上至少显示2/3的大小。
因为我们之前说过已经有了一个开发好的手机APP,所以如果为了讲这个重新设计再编码那就浪费时间了。以下的讲解和描述都是基于已有的代码,通过修改Activity的实现来适配平板设备,已达到代码的最大利用率。
这里主要有三个任务:
计算已有的Activity的尺寸并确定它的新坐标位置;
使Activity透明,可以看见其背景;
处理背景使其不能再和用户进行交互。
计算窗口大小
前面提到,我们需要以一个已有的手机APP为基础(使用了ActionBarSherlock库),这个库我们已经以一个外部库的形式集成到项目中,并带有源代码。
如果对ABS的源码很熟悉或者曾对原生ActionBar的构架有了解,就会发现:如果改变Activity的大小,那在调用setContentView方法的时候,功能没有实现:ActionBar的大小和位置都没有变化。这时要做的就是在更高的级别里操作,在系统绘制ActionBar的时候——ABS或者原生的ActionBar,这时候还没有任何窗口的数据,这样我们就可以按照需要调整了。
最显而易见的方式就是改变Window的尺寸,所以这里需要以下这段代码:
; html-script: false ]
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 = mActivityWindowW
lp.height = mActivityWindowH
getWindowManager().updateViewLayout(view, lp);
12345678910111213141516
; html-script: false ]&&&&@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这个类,然后注释掉以下这行代码:
; html-script: false ]
registerImplementation(ActionBarSherlockNative.class);
; html-script: false ]&&&&//
registerImplementation(ActionBarSherlockNative.class);
代码运行应该没问题,然后就可以看到不透明背景的Activity了。
添加透明功能
在实现了Activity的尺寸和大小都改变后,现在就要让它透明了。可以给这个平板上的Activity主题添加这个属性:
; html-script: false ]
&item name=&android:windowIsTranslucent&&true&/item&
; html-script: false ]<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里加上这几行:
; html-script: false ]
&item name=&android:windowIsFloating&&true&/item&
&item name=&android:windowCloseOnTouchOutside&&false&/item&
&item name=&android:colorBackgroundCacheHint&&@null&/item&
&item name=&android:backgroundDimEnabled&&true&/item&
; html-script: false ]&&&&&&&&<item name="android:windowIsFloating">true</item>&&&&&&&&<item name="android:windowCloseOnTouchOutside">false</item>&&&&&&&&<item name="android:colorBackgroundCacheHint">@null</item>&&&&&&&&<item name="android:backgroundDimEnabled">true</item>
这样问题就解决了。综上所述,我们就实现了一个悬浮、透明的Activity。
关于作者:
可能感兴趣的话题
说的太零散。
能不能详细点。
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线}

我要回帖

更多关于 android 悬浮窗实现 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信