2014-09-16 1 views
3

나는 (다른 응용 프로그램보다) 항상 화면에 표시되는보기가 있으며, 터치 이벤트를 수신하지 않고 더 멀리 전달하는 것보다 좋아합니다. 실행중인 Service에서항상 화면에 나타나는보기 만지기

코드 :

WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, 
      WindowManager.LayoutParams.MATCH_PARENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
      WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
      PixelFormat.TRANSLUCENT); 

    v.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Toast.makeText(getApplicationContext(), "view touched", Toast.LENGTH_SHORT).show(); 
      return false; 
     } 
    }); 

    WindowManager localWindowManager = (WindowManager)getSystemService("window"); 
    localWindowManager.addView(v, localLayoutParams); 

현재 나는 접촉을하지 않습니다.

답변

5

당신은 아래와 같이 TYPE_SYSTEM_ALERT로보기를 선언 할 :

WindowManager.LayoutParams params = 
     new WindowManager.LayoutParams(width, height, x, y, 
       WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
       WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
         | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
       PixelFormat.TRANSLUCENT); 
params.gravity = Gravity.LEFT | Gravity.TOP; 

이 방법 만 뷰 자체에 터치에 응답합니다.

이 코드는 내가 디자인 한 작업 전환기에서 가져온 것입니다. 내 오버레이 아래에있는 다른 창과 상호 작용할 때 문제가 발생하여 FLAG_WATCH_OUTSIDE_TOUCH을 사용하지 않았습니다.


는 지금까지 다른 앱에 터치를 전달하는 것과 같은 - 보안 위험을 나타내는 것처럼 즉, 더 이상 가능하지 않다.

는 또한 흥미로운 라이브러리 mentioned by Edward Jezisek이 pingpongboss으로 뛰어난입니다 :

나는 최근에 읽고 당신이 흥미있을 거라고 비슷한 질문, 함께 몇 가지 세부 사항을 더 넣어

오픈 소스이므로 코드를 통해 자신이하는 일을 파악할 수 있습니다.

+0

나는 아직 'onTouch' 이벤트를 얻지 못했습니다.'FLAG_WATCH_OUTSIDE_TOUCH' 플래그를 사용할 때 다른 앱과 상호 작용할 수있었습니다. – RCB

+1

다른 장소에서 터치 리스너를 보았지만 미흡했습니다. 그 사건.
현재 저는 광산 (내 광산이 아닌)의 견해에 사건을 전달하는 문제를 극복하려고 노력하고 있습니다. 당신의 대답을 이해함에 따라 나는 이것을 할 수 없습니다. 그래서 시스템에 터치 이벤트를 시뮬레이트하는 방법을 찾으려고합니다. – RCB

+0

언급 한 앱에는 솔루션이 없습니다. 터치 이벤트 만 처리하고 더 이상 전달하지 않기 때문입니다. – RCB

0

왜 그런지 모르지만 WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY은보기를 감동시킬 수 없습니다.

대신 WindowManager.LayoutParams.TYPE_PHONE을 사용하십시오.

업데이트 :

나는 한 가지를 잊어 버렸습니다. WindowManager.LayoutParams.TYPE_PHONE 만 설정하면 다른 앱의 View은 터치되지 않습니다. 따라서 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 플래그를 반드시 추가하십시오.

관련 문제