2015-07-20 13 views
8

Bir hizmetten diğer uygulamalar üzerinde ekranda bir (fare işaretçisi) simgesi çizmek istiyorum. İşlevselliği uyguladım ve navigasyon çubuğundan ayrı olarak ekranın üzerine çizebiliyorum. Burada severalotherquestions'u araştırdım ve TYPE_SYSTEM_OVERLAY, TYPE_TOAST, TYPE_SYSTEM_ERROR ve diğer bazı pencere türlerini denemeden denedim.Android sürümünde gezinme çubuğu (ve diğer uygulamalar) üzerine gelin> = 5

Odağı yakalamaya çalışmıyorum, sadece bir veya iki fare için ekranda bir fare işaretçisi çiziyorum. Gezinme çubuğu üzerinde çizim yapmaya çalıştığımda, yalnızca (aslında, yükseklik için manuel boyut belirttiğimde bile, RelativeLayout gezinme çubuğuyla kenarda biter) gider. Aşağıdaki ekran görüntüsü, ekranın sağ alt kısmındaki el işaretçisini göstermektedir. Onu yerleştirebileceğim kadar düşük. Uygulamamdaki gezinme çubuğunu saklamaya çalışmıyorum - diğer uygulamalar üzerinde çizim yapmaya çalışıyorum. Hatta ayarlama çalıştı

overlay-pointer-on-screen

xpos ve yposWindowManager.LayoutParams durumda ayarları ofset, ama bu sadece düzeni uzaklıklar ve hala) navigasyon çubuğunun altındaki gider.

Ben bu pencereyi göstermek için kullanıyorum düzen parametreleri:

 WindowManager.LayoutParams params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | 
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
       WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, 
       PixelFormat.TRANSPARENT); 

Sonra WindowManager için bu parametrelerle RelativeLayout ekliyorum: windowManager.addView(relativeLayout, params);

+0

Eğer izin beyan mü 'Manifest'inizde dosyadaki diğer apps' üzerinde çizim –

+0

mr.icetea @ evet, elbette Aksi takdirde hiç çizmek mümkün olmaz ben üzerinde ince çıkarabiliriz?.. durum çubuğu da, sadece gezinme çubuğunun üzerinden değil (altta, arka tarafta, ev ve son yazılım tuşlarında) – miha

cevap

6

Bir sürü şeyden sonra, çalışmasını sağlamak için doğru bayrakları almayı başardım. Neredeyse çalışır (çoğu uygulama için). İşte

@Override 
public void onClick(View view) { 
    if (_windowManager == null) { 
     _windowManager = (WindowManager) MainActivity.this.getSystemService(Context.WINDOW_SERVICE); 
    } 

    WindowManager.LayoutParams params; 
    // create the view on the first try 
    if (_overlayView == null) { 
     ImageView hand; 

     _overlayView = new FrameLayout(MainActivity.this); 
     hand = new ImageView(MainActivity.this); 
     hand.setImageResource(R.drawable.icon_hand_pointer); 
     int w = hand.getDrawable().getIntrinsicWidth(); 
     int h = hand.getDrawable().getIntrinsicHeight(); 
     _overlayView.addView(hand); 

     params = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN | 
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | 
       WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 
       WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | 
       WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, 
       PixelFormat.TRANSLUCENT); 

     params.width = w; 
     params.height = h; 
     params.gravity = Gravity.LEFT | Gravity.TOP; 
     params.x = _xOffset; 
     params.y = _yOffset; 
     _windowManager.addView(_overlayView, params); 
    } else { 
     // move the view 
     params = (WindowManager.LayoutParams) _overlayView.getLayoutParams(); 
     params.x = _xOffset; 
     params.y = _yOffset; 
     _windowManager.removeView(_overlayView); 
     _overlayView.setLayoutParams(params); 
     _windowManager.addView(_overlayView, params); 
    } 

    _xOffset += 40; 
    _yOffset += 100; 
} 

bir uygulama çalışan bu kodun bir görüntü var (eğer elle bindirmeyi görebilirsiniz; bu Android 6.0.1 ile Nexus 5'te geçerli: ulaşmak için kod (düğme tıklaması işleyicide bir örnek) izler : enter image description here

+0

Ayrıca, aşağıdaki [yorum] dosyasına bakın (http: // stackoverflow.com/questions/21380167/draw-bitmaps-on-üstünde-the-the-navigasyon-bar-in-android/21877720 # comment52626546_21877720) hakkında her zaman navbar üzerinde çekmek mümkün değil. – miha

+0

Tüm uygulamalarda çalışmanın bir yolunu buldunuz mu? Yalnızca Chrome ve Tinder profil görünümü modu gibi belirli uygulamalarda navbarın üzerine çizim yapamıyorum! Sadece navbarın altından çizer. – Flyview

+0

@Flyview, hayır, yapmadım; Sonunda bu çözüme ulaştık. – miha

2

altındaki gezinti çubuğu şey olduğunu Yukarıda çizilen öğeler ana düğme, geri düğmesi vs.'ye erişimi engelleyebildiğinden, çekilemezsiniz. Ancak, etkinliğinizi tam ekran haline getirebilirsiniz, yani aşağıdan yukarıya doğru kaydırılana kadar gezinme düğmelerini gizler. Ekranda herhangi bir yere çizme özgür olabilir

DÜZENLEME: Bazı benzer soruları buldum ve bunun bir cevabı var: Draw bitmaps on top of the Navigation bar in Android Yanıt, gezinti çubuğunun boyutu olan bir y sapması eklemekti.

+0

[TeamViewer QS uygulaması] (https://play.google.com/store/apps/details?id=com. teamviewer.quicksupport.market) th yapabilir En. Buradaki fikir, kendi aktiviteleri üzerinde değil, diğer uygulamaları da çekmektir. – miha

+0

@miha ekran görüntüsü? – tachyonflux

+0

@miha, ekran görüntüsünü hızlı bir ekran görüntüsü haline getiriyor ve ardından teknisyenin ekran üzerinde çizim yapmasına izin veriyor ve ardından kullanıcının tekrar kontrolünü ele geçirmesine izin veriyor. – LonelyIdiot

İlgili konular