2017-04-17 10 views
1

私はButtonを開始し、WindowManager.addView()を呼び出すことによってそれを追加するServiceを持っています。このボタンは常にすべての上に表示されます。AndroidでフローティングボタンをクリックしたときにAccessibilityService経由でスクロールイベントを実行する方法は?

AccessibilityServiceを拡張する別のServiceがあります。私はonAccessibilityEventでイベントを受け取りますが、別のServiceで作成されたButtonのクリックイベントは発生しません。私は他のビューthoのクリックイベントを受け取ります。もう1つの問題は、ユーザーがButtonを別のServiceで作成したときに、onAccessibilityEventをトリガーする方法ですか?

で作成されたButtonがなぜServiceで作成されたのかわかりません。

は、ここに私のFloatingButton

public class FloatingButton extends Service { 
    private WindowManager wm; 
    private WindowManager.LayoutParams mButtonParams; 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     mButtonParams = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.WRAP_CONTENT, 
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSLUCENT); 
     mButtonParams.gravity = Gravity.TOP | Gravity.START; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     startFloatingButton(); 
     return START_STICKY; 
    } 

    private void startFloatingButton() { 
     Button btn = new Button(this); 
     btn.setText("scroll"); 
     wm.addView(btn, mButtonParams); 

     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // should fire onAccessibilityEvent() 
      } 
     }); 
    } 
} 

と私のAccessibilityService

public class MyAccessibilityService extends AccessibilityService { 
    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 
     Log.v(TAG, "event type: " + event.getEventType()); 
    } 

    @Override 
    public void onInterrupt() { 

    } 
} 

だ私はどちらかFloatingButton Serviceで作成しButtonが必要onAccessibilityEventでのイベントやAccessibilityNodeInfo.ACTION_SCROLL_FORWARDを実行する方法を発射。 AccessibilityEventがなければ、私はスクロールアクションを実行する方法を知らない。また、アクションを実行する前に現在のビューがスクロール可能かどうかをチェックする手段がありますか?

ありがとうございました!

答えて

0

変更

mButtonParams = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT); 

mButtonParams = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT); 

にごアクセシビリティサービスのonServiceConnected()方法でそれを置きます。あなたのアクセシビリティサービスでウィンドウマネージャを作成すると、アクセシビリティイベントを取得できます。スクロールアップ/ダウンの場合、

nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); 
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); 

TYPE_PHONEはバックグラウンドのクリックを許可しませんでした。

関連する問題