2011-12-22 35 views
7

Android'de sanal klavye yüksekliğini algılamaya çalışıyorum.Android'de işaretçi olayı nasıl gönderilir

ben bunu elde etmek için bir yol bulmuş: yazar yüksekliğini tespit etmek için bir yol buldu görünüyor Get the height of virtual keyboard in Android

:

Ben de benzer bir konu bulduk. Sanal klavyeyi açmak istediğimde, oluşturduğum işaretçi olayı gönderdim. y koordinatları cihaz yüksekliğinden başlar ve azalır.

Bunu nasıl yapacağımı anlamıyorum.

cevap

3

Sana yayınlanmıştır bağlantıda verilen kodu kullanarak olacak:

// Declare Variables 

int softkeyboard_height = 0; 
boolean calculated_keyboard_height; 
Instrumentation instrumentation; 

// Initialize instrumentation sometime before starting the thread 
instrumentation = new Instrumentation(); 

mainScreenView senin alttan görünüm, sizin etkinliğin görünümüdür. m (ACTION_DOWN) ve m1 (ACTION_UP), Instrumentation#sendPointerSync(MotionEvent) kullanılarak gönderilen dokunma olaylarıdır.

java.lang.SecurityException: mantığı MotionEvent görüntülenmekte olduğunu klavye SecurityException aşağıdaki neden olacaktır yere sevk olmasıdır başka bir uygulamaya enjekte

Yani, biz başlatmak INJECT_EVENTS izin gerektirir Ekranın alt kısmında ve döngünün her yinelemesinde (y) azaltarak yolumuza devam edin. Belirli sayıda yineleme için bir SecurityException alırız (ki bunu yakalarız): Bu, MotionEvent'in klavyede gerçekleştiğini ima eder. an y kadar küçük olur (ne zaman onun sadece klavyenin üstünde), biz döngünün patlak ve kullanma klavyenin yüksekliğini hesaplarız:

softkeyboard_height = mainScreenView.getHeight() - y; 

Kodu:

Thread t = new Thread(){ 
     public void run() { 
      int y = mainScreenView.getHeight()-2; 
      int x = 10; 
      int counter = 0; 
      int height = y; 
      while (true){ 
       final MotionEvent m = MotionEvent.obtain(
         SystemClock.uptimeMillis(), 
         SystemClock.uptimeMillis(), 
         MotionEvent.ACTION_DOWN, 
         x, 
         y, 
         1); 
       final MotionEvent m1 = MotionEvent.obtain(
         SystemClock.uptimeMillis(), 
         SystemClock.uptimeMillis(), 
         MotionEvent.ACTION_UP, 
         x, 
         y, 
         1); 
       boolean pointer_on_softkeyboard = false; 
       try { 
        instrumentation.sendPointerSync(m); 
        instrumentation.sendPointerSync(m1); 
       } catch (SecurityException e) { 
        pointer_on_softkeyboard = true; 
       } 
       if (!pointer_on_softkeyboard){ 
        if (y == height){ 
         if (counter++ < 100){ 
          Thread.yield(); 
          continue; 
         } 
        } else if (y > 0){ 
         softkeyboard_height = mainScreenView.getHeight() - y; 
         Log.i("", "Soft Keyboard's height is: " + softkeyboard_height); 
        } 
        break; 
       } 
       y--; 

      } 
      if (softkeyboard_height > 0){ 
       // it is calculated and saved in softkeyboard_height 
      } else { 
       calculated_keyboard_height = false; 
      } 
     } 
    }; 
    t.start(); 

Instrumentation#sendPointerSync(MotionEvent):

İşaretçi olayını gönderme. Alıcının alıcının olay işleme sürecinden döndüğü bir noktada tamamlandıysa da, olaydan tepki olarak tamamen bitmiş olabilir - örneğin, ekran görüntüsünü güncellemesi gerekiyorsa, yine de bunu yapma işlemi.

+0

Bu genel bir API mi? "INTERNAL_POINTER_META_STATE" ile ilgili dokümanları bulamıyorum. – rid

+0

@rid Üzgünüm. "INTERNAL_POINTER_META_STATE" bir tam sayı sabiti. Sorunun amacı için, herhangi bir tamsayı değeri kullanmak işe yarayacaktır. Yukarıdaki kodu düzenledim. İşaret ettiğin için teşekkürler. – Vikram

+0

Yine de, Android'in gelecekteki sürümlerinde kaybolma şansına sahip olmadan bu özelliği kullanmak güvenli midir? Bu her zaman 1'in aynı olması garantilidir? Resmi olarak Google tarafından herhangi bir yerde belgelenmiş mi? Gevrek kod üretme korkusu olmadan buna güvenebilir misiniz? – rid

1

OnGlobalLayoutListener kullanın, benim için mükemmel çalışır.

İlgili konular