模仿360桌面图标

如何实现:

1.要首先要确定当前图标所在是否为桌面如果为桌面就显示图标,如果不是并且图标还在显示就隐藏掉

2.如何在桌面上创建view,这里需要使用WindowManager来实现

主要是通过WindowManager这个类来实现的,调用这个类的addView方法用于添加一个悬浮窗,updateViewLayout方法用于更新悬浮窗的参数,removeView用于移除悬浮窗。其中悬浮窗的参数有必要详细说明一下。


WindowManager.LayoutParams这个类用于提供悬浮窗所需的参数,其中有几个经常会用到的变量:

type值用于确定悬浮窗的类型,一般设为2002,表示在所有应用程序之上,但在状态栏之下。

flags值用于确定悬浮窗的行为,比如说不可聚焦,非模态对话框等等,属性非常多,大家可以查看文档。

gravity值用于确定悬浮窗的对齐方式,一般设为左上角对齐,这样当拖动悬浮窗的时候方便计算坐标。

x值用于确定悬浮窗的位置,如果要横向移动悬浮窗,就需要改变这个值。

y值用于确定悬浮窗的位置,如果要纵向移动悬浮窗,就需要改变这个值。

width值用于指定悬浮窗的宽度。

height值用于指定悬浮窗的高度。


创建悬浮窗这种窗体需要向用户申请权限才可以的,因此还需要在AndroidManifest.xml中加入<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

主要代码:

WindowManager windowManager = getWindowManager(context);  
windowManager.removeView(bigWindow);  

smallWindow.setParams(smallWindowParams);  
windowManager.addView(smallWindow, smallWindowParams);  

3. 自定义一个View继承LinearLayout
在这个类里面要添加要添加的View,并进行onTouchEvent方法重写







1、首先获得属于桌面的应用(系统原装应用、Go桌面等等)

分析:1)这些应用都会包含:"Android.intent.category.Home";
     2)所以只要找出所有的声明为Home的activity的"android.intent.action.MAIN"所在的包名就可以了!
代码如下:
[java] view plain copy print?
/** 
 * 获得属于桌面的应用的应用包名称 
 * @return 返回包含所有包名的字符串列表 
 */  
private List<String> getHomes() {  
    List<String> names = new ArrayList<String>();  
    PackageManager packageManager = this.getPackageManager();  
    //属性  
    Intent intent = new Intent(Intent.ACTION_MAIN);  
    intent.addCategory(Intent.CATEGORY_HOME);  
    List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,  
            PackageManager.MATCH_DEFAULT_ONLY);  
    for(ResolveInfo ri : resolveInfo){  
        names.add(ri.activityInfo.packageName);  
        System.out.println(ri.activityInfo.packageName);  
    }  
    return names;  
}  


2、然后就是在你的应用中需要判断是否是桌面(在service或者新线程之类的)
分析:1)既然要判断当前界面,那就要判断当前的RunningTasks中的第一个;
2)引入ActivityManager获取RunningTasks;
3)取出RunningTasks中的topActivity的PackageName;
4)最后跟第一步得到的List做比较即可!
5)别忘了添加权限
<uses-permission android:name="android.permission.GET_TASKS" />
代码如下:
[java] view plain copy print?
/** 
 * 判断当前界面是否是桌面 
 */  
public boolean isHome(){  
    ActivityManager mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);  
    List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);  
    return homePackageNames.contains(rti.get(0).topActivity.getPackageName());  


获取系统中占用的内存:

  1. public static String getUsedPercentValue(Context context) {  
  2.         String dir = "/proc/meminfo";  
  3.         try {  
  4.             FileReader fr = new FileReader(dir);  
  5.             BufferedReader br = new BufferedReader(fr, 2048);  
  6.             String memoryLine = br.readLine();  
  7.             String subMemoryLine = memoryLine.substring(memoryLine.indexOf("MemTotal:"));  
  8.             br.close();  
  9.             long totalMemorySize = Integer.parseInt(subMemoryLine.replaceAll("\\D+"""));  
  10.             long availableSize = getAvailableMemory(context) / 1024;  
  11.             int percent = (int) ((totalMemorySize - availableSize) / (float) totalMemorySize * 100);  
  12.             return percent + "%";  
  13.         } catch (IOException e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.         return "悬浮窗";  
  17.     }  



具体实现:http://blog.csdn.net/guolin_blog/article/details/8689140

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值