当前位置:  编程技术>移动开发
本页文章导读:
    ▪WindowManager兑现悬浮窗口&可自由移动的悬浮窗口(类似来电通记录流量)        WindowManager实现悬浮窗口&可自由移动的悬浮窗口(类似来电通记录流量) Android中悬浮窗口的实现原理和示例代码 http://www.xsmile.net/?p=404 调用WindowManager,并设置WindowManager.LayoutParams的相关.........
    ▪ 合适显示时间的字体        适合显示时间的字体     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 50, 320, 300)];     label.font = [UIFont fontWithName:@"DBLCDTempBlack" size:128.0];     label.backgroundColor = [UIColor colorWithRed:1 .........
    ▪ [转]Widget实则可以很炫       [转]Widget其实可以很炫 Android AppWidget如何支持复杂的View 一直想知道如何在AppWidget里面添加 ListView,EditText 这些复杂的View.我们知道要在AppWidget里添加 View都是通过RemoteView来做到了,然而RemoteVie.........

[1]WindowManager兑现悬浮窗口&可自由移动的悬浮窗口(类似来电通记录流量)
    来源: 互联网  发布时间: 2014-02-18
WindowManager实现悬浮窗口&可自由移动的悬浮窗口(类似来电通记录流量)

Android中悬浮窗口的实现原理和示例代码 
http://www.xsmile.net/?p=404 

调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了。比如创建系统顶级窗口,实现悬浮窗口效果! 

WindowManager的方法很简单,基本用到的就三个addView,removeView,updateViewLayout。 

而WindowManager.LayoutParams的属性就多了,非常丰富,具体请查看SDK文档。这里给出Android中的WindowManager.java源码,可以具体看一下。 
WindowManager 的源码地址: 
http://www.netmite.com/android/mydroid/frameworks/base/core/java/android/view/WindowManager.java 

以下代码请仅供演示:

 

public class myFloatView extends Activity {  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        Button bb=new Button(getApplicationContext());  
        WindowManager wm=(WindowManager)getApplicationContext().getSystemService("window");  
        WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();  
        wmParams.type=2002;  //type是关键,这里的2002表示系统级窗口,你也可以试试2003。  
        wmParams.format=1;  
        /** 
         *这里的flags也很关键 
         *代码实际是wmParams.flags |= FLAG_NOT_FOCUSABLE; 
         *40的由来是wmParams的默认属性(32)+ FLAG_NOT_FOCUSABLE(8) 
         */  
        wmParams.flags=40;  
        wmParams.width=40;  
        wmParams.height=40;  
        wm.addView(bb, wmParams);//创建View  
    }  
}  

 

PS:本代码在Android2.3下测试无错(从API Level来看,实际上android1.5都可行)!另外别忘了在AndroidManifest.xml文件中加入如下权限:

 

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />  

 

关于代码中wmParams.type的值的问题,下面给出一些数值参考: 
/** 
         * Window type: the status bar.  There can be only one status bar 
         * window; it is placed at the top of the screen, and all other 
         * windows are shifted down so they are below it. 
         */ 
        public static final int TYPE_STATUS_BAR         = FIRST_SYSTEM_WINDOW; 
    
        /** 
         * Window type: the search bar.  There can be only one search bar 
         * window; it is placed at the top of the screen. 
         */ 
        public static final int TYPE_SEARCH_BAR         = FIRST_SYSTEM_WINDOW+1; 
    
        /** 
         * Window type: phone.  These are non-application windows providing 
         * user interaction with the phone (in particular incoming calls). 
         * These windows are normally placed above all applications, but behind 
         * the status bar. 
         */ 
        public static final int TYPE_PHONE              = FIRST_SYSTEM_WINDOW+2; 
    
        /** 
         * Window type: system window, such as low power alert. These windows 
         * are always on top of application windows. 
         */ 
        public static final int TYPE_SYSTEM_ALERT       = FIRST_SYSTEM_WINDOW+3; 
        
        /** 
         * Window type: keyguard window. 
         */ 
        public static final int TYPE_KEYGUARD           = FIRST_SYSTEM_WINDOW+4; 
        
        /** 
         * Window type: transient notifications. 
         */ 
        public static final int TYPE_TOAST              = FIRST_SYSTEM_WINDOW+5; 
        
        /** 
         * Window type: system overlay windows, which need to be displayed 
         * on top of everything else.  These windows must not take input 
         * focus, or they will interfere with the keyguard. 
         */ 
        public static final int TYPE_SYSTEM_OVERLAY     = FIRST_SYSTEM_WINDOW+6; 
        
        /** 
         * Window type: priority phone UI, which needs to be displayed even if 
         * the keyguard is active.  These windows must not take input 
         * focus, or they will interfere with the keyguard. 
         */ 
        public static final int TYPE_PRIORITY_PHONE     = FIRST_SYSTEM_WINDOW+7; 
        
        /** 
         * Window type: panel that slides out from the status bar 
         */ 
        public static final int TYPE_STATUS_BAR_PANEL   = FIRST_SYSTEM_WINDOW+8; 
        
        /** 
         * Window type: panel that slides out from the status bar 
         */ 
        public static final int TYPE_SYSTEM_DIALOG      = FIRST_SYSTEM_WINDOW+8; 
    
        /** 
         * Window type: dialogs that the keyguard shows 
         */ 
        public static final int TYPE_KEYGUARD_DIALOG    = FIRST_SYSTEM_WINDOW+9; 
        
        /** 
         * Window type: internal system error windows, appear on top of 
         * everything they can. 
         */ 
        public static final int TYPE_SYSTEM_ERROR       = FIRST_SYSTEM_WINDOW+10; 
        
        /** 
         * End of types of system windows. 
         */ 
        public static final int LAST_SYSTEM_WINDOW      = 2999; 

--------------------------------- 
这个FIRST_SYSTEM_WINDOW的值就是2000。2003和2002的区别就在于2003类型的View比2002类型的还要top,能显示在系统下拉状态栏之上! 

    可以看出来,2002的值的含义其实就是2000+2。数值2000的含义就是系统级窗口,2002和2003的区别就是 2003 比 2002还要更上一层!比如,type为2003的view,能显示在手机下拉状态栏之上! 

而关于flags等其他的属性请参考SDK文档 

Android悬浮窗体 
http://www.xsmile.net/?p=396 
Android中悬浮窗口的实现原理和示例代码 
http://www.xsmile.net/?p=404 

Android中可自由移动悬浮窗口的Demo 
http://www.xsmile.net/?p=452 
前段时间捣鼓出Android悬浮窗口的实现,今天抽空写了一个可自由移动悬浮窗口的Demo。 


简要说明如下: 

1、通过覆写悬浮View中onTouchEvent方法实现自由移动悬浮窗口。 

2、悬浮窗口坐标的移动实际是windowMananager.LayoutParams中x和y的变换,但是要注意设置相应的gravity。 

3、用windowManager创建的View,当不需要时,务必记住使用windowManager的removeView方法来移除,请在Activity相关生命周期中自行添加扫尾工作。 

4、代码中已经附上详细注释。有关参数具体含义,请自行参考SDK。 

=============================== 

注意Demo中wmParams.format=1的属性(我源码中打了双斜杠),如果启用,图片背景将会透明,效果图如下: 


================================ 

一些说明: 

对于种种原因没有查看SDK文档的一些朋友,可能对我源码中wmParams.type=2002这样的语句不太了解其2002的具体意义,给出可读性好点的语句。 

 

wmParams.type=LayoutParams.TYPE_PHONE;   
       //wmParams.format=PixelFormat.RGBA_8888;   //设置图片格式,效果为背景透明  
       wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL  
                             | LayoutParams.FLAG_NOT_FOCUSABLE;  
       /* 
        * 下面的flags属性的效果形同“锁定”。 
        * 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。 
        wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL  
                              | LayoutParams.FLAG_NOT_FOCUSABLE 
                              | LayoutParams.FLAG_NOT_TOUCHABLE; 
       */  

 

附Demo源码: 

Android中悬浮窗口 
http://www.cnblogs.com/GnagWang/archive/2011/02/06/1949569.html 

 


    
[2] 合适显示时间的字体
    来源: 互联网  发布时间: 2014-02-18
适合显示时间的字体

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 50, 320, 300)];

    label.font = [UIFont fontWithName:@"DBLCDTempBlack" size:128.0];

    label.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0];

    label.text = @"10:32";

    label.textColor = [UIColor greenColor];

    [self.view addSubview:label];


    
[3] [转]Widget实则可以很炫
    来源: 互联网  发布时间: 2014-02-18
[转]Widget其实可以很炫

Android AppWidget如何支持复杂的View 

一直想知道如何在AppWidget里面添加 ListView,EditText 这些复杂的View.我们知道要在AppWidget里添加 View都是通过RemoteView来做到了,然而RemoteView本身功能很弱,支持的操作很少,而且支持RemoteView的Widget很少:
在Dev Guide中有下面这段: 

引用

A RemoteViews object (and, consequently, an App Widget) can support the following layout classes: 

    * FrameLayout 
    * LinearLayout 
    * RelativeLayout 

And the following widget classes: 

    * AnalogClock 
    * Button 
    * Chronometer 
    * ImageButton 
    * ImageView 
    * ProgressBar 
    * TextView 

Descendants of these classes are not supported. 



所以从这里可以知道,为什么在AppWidget里添加EditText会显示LoadError了,因为本身它就不支持这些复杂的 Widget. 

但我们又会有疑问了,为什么Google Search会有EditText呢?其实这些都是假象,并不是AppWidget支持EditText. 

具体怎么回事,我猜有两种情况: 

1.一种确实是EditText但确不是AppWidget 支持的,而是集成到Home里面去了。 

具体可以参考这里:http://www.eoeandroid.com/archiver/tid-1729.html 

2.最新的SDK 1.6中,显示在桌面的EditText只是一个ImageView,而这个ImageView的背景就是EditText的截图了。我们点中这个“EditText”后,会调起一个Activity, 

而这个Activity就是复杂输入的EditText,并且会全屏显示。所以我们就误以会那是一个单纯的EditText. 

最近看过HTC Hero Sense UI的人都看到了,它的AppWidget是确实支持复杂Widget的,比如:Bookmark Widget:ListView/GridView,Twitter Widget:EditText. 这些确实是我们可以看到的,但它是怎么做到的呢?我也很想知道,AppWidget支持到那么强大,甚至超过了本身AP的功能,很抢眼。但不管是怎么实现的,我想人家肯定是花了大力气去做到了,我猜想可能是将Google 提供的AppWidget进行了比较大的改动。我们查看一下framework下的appwidget: 

pjq@gentoo-pjq ~/android/donut $ ls frameworks/base/core/java/android/appwidget/ -lh  
total 60K  
-rw-r--r-- 1 pjq users 7.9K 2009-09-29 21:49 AppWidgetHost.java  
-rw-r--r-- 1 pjq users  12K 2009-09-29 21:49 AppWidgetHostView.java  
-rw-r--r-- 1 pjq users  14K 2009-09-29 21:49 AppWidgetManager.java  
-rw-r--r-- 1 pjq users  691 2009-09-29 21:49 AppWidgetProviderInfo.aidl  
-rw-r--r-- 1 pjq users 5.6K 2009-09-29 21:49 AppWidgetProviderInfo.java  
-rwxr-xr-x 1 pjq users 6.3K 2009-09-29 21:49 AppWidgetProvider.java  
-rw-r--r-- 1 pjq users 1.5K 2009-09-29 21:49 package.html  

 

可以看到,appwidget的文件很少,虽然不能说明什么,但按照正常的推理,文件少功能一般也强大不到哪里去,这种想法虽然有些牵强,但暂且就这样认为吧。 

所以我想HTC一定是将这里给改动了,以支持复杂的Widget,有知道内情的透露一点最好了。 

要知道RemoteView的功能很少,特别是对事件处理的能力,都需要通过PendingIntent,传到BroadcastReceiver 去处理。所以这里对一些事件处理也仅限于比较简单事件:比如说:Button Clicked,其它的我好像还没怎么用过,orz…. 对复杂的View:比如ListView(当然这里还不支持,打个比方),ListView里面那么多Item,要设置Listener,要传值,这些 RemoteView都不能像一个单纯的Activity那样处理,呵呵 ,扯远了,如果能的话,我也就没有必要这么费劲的写这篇博客了。 

写这篇文章的时候,我已经实现了在 AppWidget里显示ListView/GridView这些复杂的Widget了,我这里只说显示,并不是说我已经能让AppWidget支持 ListView/GridView了。所以我这里更倾向于教你如何在AppWidget里支持显示ListView/GridView这些复杂的 Widget. 

我们知道AppWidget只支持RemoteView,那哪些Widget是RemoteView呢,我来教你搜一下: 

pjq@gentoo-pjq ~/android/donut/frameworks/base/core/java/android/widget $ grep -i -n -A 1  @remoteview *.java  
AbsoluteLayout.java:40:@RemoteView  
AbsoluteLayout.java-41-public class AbsoluteLayout extends ViewGroup {  
--  
AnalogClock.java:39:@RemoteView  
AnalogClock.java-40-public class AnalogClock extends View {  
--  
Button.java:58:@RemoteView  
Button.java-59-public class Button extends TextView {  
--  
Chronometer.java:45:@RemoteView  
Chronometer.java-46-public class Chronometer extends TextView {  
--  
FrameLayout.java:47:@RemoteView  
FrameLayout.java-48-public class FrameLayout extends ViewGroup {  
--  
ImageButton.java:66:@RemoteView  
ImageButton.java-67-public class ImageButton extends ImageView {  
--  
ImageView.java:55:@RemoteView  
ImageView.java-56-public class ImageView extends View {现在没什么问题。  
--  
LinearLayout.java:44:@RemoteView  
LinearLayout.java-45-public class LinearLayout extends ViewGroup {  
--  
ProgressBar.java:122:@RemoteView  
ProgressBar.java-123-public class ProgressBar extends View {  
--  
RelativeLayout.java:66:@RemoteView  
RelativeLayout.java-67-public class RelativeLayout extends ViewGroup {  
--  
TextView.java:186:@RemoteView  
TextView.java-187-public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {  

 

就是这些了,类名前面加了”@RemoteView”,和我前面列出的那些是不是一样的呢?–对了,就是这些了,所以以后你想知道你在AppWidget支持哪些Widget就可以像我这样去搜一下就知道了,这样最适时。 

写到这里我已经将最关键的内容都已经写出来了,还不明白? 

其实简单点讲就是在一个Widget类前面加上”@RemoteView”,加上了它就等于说RemoteView可以支持它, RemoteView支持就等于是AppWidget支持这它了。 

好了,现在你只需要自定义一些你需要的Widget,加上”@RemoteView”标记,你就可以在AppWidget里使用它了。 

关于如何自定义一个Widget你完全可以参照frameworks/base/core/java/android/widget已有的这些Widget.依样加一个。 

其实如果你需要自定义一个Widget,比如说支持ListView,你可以先在一个activity里实现它,然后将它移到framework下面去。 

这里说一下可能需要注意的地方: 

1.如果有多个文件,需要Package的时候,名字最好按照这样的形式:android.widget.bookmark 

其中bookmark就是你要添加一个Widget存放的地方,这样的话你就可以在frameworks/base/core/java/android/widget 目录下新增bookmark文件夹,将java文件放在这个目录下。 

如果你新增的Widget只有一个java文件就可以不用这样了,可以完全按照已经存在的Widget的样子,直接将java文件放到frameworks/base/core/java/android/widget目录下。 

2.资源文件存放: 

frameworks/base/core/res/res 

资源文件都放到这个目录下。 

3.资源的引用: 

要用这样的方式引用:com.android.internal.R.drawable.** 

4.记着在这个Customer Widget类名前加上”@RemoteView”标记. 

这些都做完了,你就已经将一个自定义的Widget添加到framework了。之后要做的工作就是编译整个工程了,重新生成SDK。 

最后你就可以在AppWidget引用你新加的这个Widget了:com.widget.bookmark.***。 

至此,你已经用上了你新加的这个Widget,并且可以加到AppWidget. 

在新加Widget的时候可能会遇到的一些问题: 

1.构造函数初始化问题。 

如果在XML里写的layout不能直接指定哪个构造函数进行初始化,如果你不确定会跑哪个构造函数,最好在每个构造函数里对加上log,这样你就知道初始化时会跑哪个构造函数,并将初始化的工作加到里面。我当时就遇到了这个问题,因为用XML写layout,你不能显示调用哪个构造函数进行初始化,如果你将初始化的操作放到一个不会自动跑到的构造函数里面,那面你运行的时候就好像没添加到Widget一样。 

2.其它的再说吧。 

后继我可能会写如何添加Bookmark Widget(支持ListView/GridView,见过HTC Hero Sense UI吗,就是那个样子)到AppWidget,敬请期待! 

 



    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3