WindowManger

  1. create a windowmanger,which can receive key events,and do not prevent the events.
public class MainActivity extends AppCompatActivity

{

private WindowManager mWindowManager;
   private WindowManager.LayoutParams mLParams;
   private ImageView mPopupView;

@Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       initWM();
       initPopupView();
   }

@Override
   protected void onDestroy() {
       super.onDestroy();
       mWindowManager.removeView(mPopupView);
   }

private void initWM()
   {
       mWindowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
       mLParams = new WindowManager.LayoutParams(
               WindowManager.LayoutParams.WRAP_CONTENT, //w
               WindowManager.LayoutParams.WRAP_CONTENT, //h
               WindowManager.LayoutParams.TYPE_PHONE, //type,设置显示的类型,TYPE_PHONE指的是来电话的时候会被覆盖,其他时候会在最前端显示

WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON  //flag
                       | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                       | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, //不阻塞事件传递到后面的窗口
               PixelFormat.TRANSLUCENT // 不设置这个弹出框的透明遮罩显示为黑色
       );
       //设置对齐方式
       mLParams.gravity = Gravity.CENTER;
       //设置显示的位置
       mLParams.x = 0;  //base on gravity
       mLParams.y = 0;
   }
   
   private void initPopupView()
   {
       mPopupView = new ImageView(this);
       mPopupView.setImageResource(R.mipmap.ic_launcher);
//        mPopupView.setFocusable(true);
       mPopupView.setFocusableInTouchMode(true);  //enable receive key events
       mPopupView.setOnKeyListener(new View.OnKeyListener() {
           @Override
           public boolean onKey(View view, int keyCode, KeyEvent event) {
               if (keyCode == KeyEvent.KEYCODE_BACK
                       && event.getRepeatCount() == 0
                       && event.getAction() == KeyEvent.ACTION_UP) {
                   Toast.makeText(MainActivity.this, "press back key", Toast.LENGTH_SHORT).show();
               } else if (keyCode == KeyEvent.KEYCODE_ENTER
                       && event.getRepeatCount() == 0
                       && event.getAction() == KeyEvent.ACTION_UP) {
                   Toast.makeText(MainActivity.this, "press enter key", Toast.LENGTH_SHORT).show();

} else {
                   Toast.makeText(MainActivity.this, "press key:keyCode="+keyCode, Toast.LENGTH_SHORT).show();

}
               return false;
           }
       });
   }

private boolean mbVisible;

public void onClick(View view) {
       if (mbVisible = !mbVisible) {
           mWindowManager.addView(mPopupView, mLParams);  //show View
       } else {
           mWindowManager.removeViewImmediate(mPopupView);  //remove View
       }
   }

}

时间: 2024-10-12 03:31:38

WindowManger的相关文章

windowmanger的addview,removeView方法出现的异常

最近在调试一个关于windowmanger添加或移除view时产生诡异的bug,问题就是出现在windowmanger.addview(View view)这行代码. 具体情况:代码走到这行,突然没法往下走了,程序没有崩溃,logcat里也没能抓到error级别的日志. 无意中,发现了warning级别的日志. java.lang.IllegalStateException:xxx has already been added to the window manager. 错误产生的原因是在使用

理解Window和WindowManger

一.Window简介 作用:桌面上显示一个类似悬浮的东西. 介绍:Window是一个抽象类,实现是由PhoneWindow.WindowManager是外界访问Window的入口.但是最终实现是在WindowService中.WindowManger和WindowService是IPC交互.Andorid所有的视图都是由Window实现的,所以Window是View的直接管理者.(从第四章也知道) 二.Window和WindowManager (一).如何添加一个Window到WindowMan

仿掌上英雄联盟能力值图形绘制

一,前沿 相信玩撸啊撸的撸友们一定记得掌上英雄联盟App的能力值吧~~ 好吧,不记得没关系我来给大家上张图!! 所以今天呢我就抽空模仿了一下: 照例线来张GIF,有图有真相 下面是我的微博账号希望可以关注哈: Email:[email protected] Github: https://github.com/icuihai. weibo:http://weibo.com/icuihai 二.言归正传 在平常做项目的时候自定义控件用的还是蛮多的,使用别人造好的轮子比较节省时间,但是作为了一个优雅

Toast添加动画

WindowManger wm =(WindowManger)context.getSystemService(Context.WINDOW_SERVICE); View view = Toast.makeText(context,text,Toast.LENGTH_SHORT).getView(); //设置布局参数 WindowManger.LayoutParams params = new WindowManger.LayoutParams(0; params.height = Windo

android开发步步为营之69:Activity通过设置Theme模拟对话框效果

对话框应该说是手机app中最常见的和用户进行交互的方式了,之前也总结过一下,主要通过popupwindow,dialog,windowmanger来实现,本文详细介绍一下如何通过Activity实现弹出对话框效果. 来先看下效果,有个感性的认识. 中间那个提示其实是一个activity,好的,下面开始一步步实现这个神奇的效果.   第一步:设计对话框页面activity_simulate_dialog.xml <span style="font-size:14px;">&l

Android中通过反射来设置显示时间

这个Toast的显示在Android中的用途还是很大的,同时我们也知道toast显示的时间是不可控的,我们只能修改他的显示样式和显示的位置,虽然他提供了一个显示时间的设置方法,但是那是没有效果的(后面会说到),他有两个静态的常量Toast.SHORT和Toast.LONG,这个在后面我会在源码中看到这个两个时间其实是2.5s和3s.那么我们如果真想控制toast的显示时间该怎么办呢?真的是无计可施了吗?天无绝人之路,而且Linux之父曾经说过:遇到问题就去看那个操蛋的源代码吧!!下面就从源代码开

浅析 Android 的窗口

一.窗口的概念 在开发过程中,我们经常会遇到,各种跟窗口相关的类,或者方法.但是,在 Android 的框架设计中,到底什么是窗口?窗口跟 Android Framework 中的 Window 类又是什么关系?以手机QQ 的主界面为例,如下图所示,上面的状态栏是一个窗口,手机QQ 的主界面自然是一个窗口,而弹出的 PopupWindow 也是一个窗口,我们经常使用的 Toast 也是一个窗口.像 Dialog,ContextMenu,以及 OptionMenu 等等这些都是窗口.这些窗口跟 W

Android桌面悬浮清内存app概述

今天闲来无事写了一个清内存的小东西,类似360,在桌面上悬浮,点击后清除后台无用程序,清除后台程序是通过调用ActivityManger.killBackgroundProcesses的方式来进行的,这样的方式有个不好的地方,就是重要性级别设置的高的应用杀不掉.关键代码如下所示 1 ActivityManager mActivityManager = MyManager.getActivityManager(mContext); 2 List<ActivityManager.RunningApp

[深入理解Android卷一全文-第八章]深入理解Surface系统

由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版.而知识的传播不应该由于纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容. 第8章  深入理解Surface系统 本章主要内容 ·  具体分析一个Activity的显示过程. ·  具体分析Surface. ·  具体分析SurfaceFlinger. 本章涉及的源代码文件名称及位置: · ActivityThread.java framework/base/core/java/an