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
       }
   }
   

}


更多相关文章

  1. android登录窗口——基础编
  2. 【Android】窗口机制分析与UI管理系统
  3. Android 大约Dialog弹出窗口
  4. android Dialog无法获取窗口问题闪退
  5. Android — 制作悬浮窗口
  6. android设置保持窗口常亮

随机推荐

  1. Android群英传笔记
  2. android中执行线程的部分代码
  3. 一句话源码
  4. android 实现视频缓存
  5. Android仿微信activity滑动关闭效果
  6. Android 日历方式显示的日期选择组件
  7. Android实现百度地图两点画弧线
  8. Android4.4之Camera2预览流程(从APP到Dri
  9. android Gallery
  10. Android9.0 Activity启动流程分析(三)