2013-02-18 14 views
8

Chciałbym stworzyć aplikację podobną do Swapps. Próbuję wyświetlić przycisk na górze dowolnego ekranu, który powinien pojawić się tylko na akcji przesuwającej. Próbowałem z poniższym kodemNie można uzyskać zdarzenia Touch dla TYPE_SYSTEM_OVERLAY

WindowManager.LayoutParams params = new WindowManager.LayoutParams(); 
    params.type =WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; 
    params.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 
    params.format =PixelFormat.TRANSLUCENT; 
    params.height = WindowManager.LayoutParams.WRAP_CONTENT; 
    params.width = WindowManager.LayoutParams.WRAP_CONTENT; 
    parentlay = new LinearLayout(this); 
    mybt = new Button(getApplicationContext()); 
    bt.setText("Click to Go"); 

    parentlay.setBackgroundColor(Color.TRANSPARENT); 
    parentlay.setHapticFeedbackEnabled(true); 
    parentlay.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
       // event.getAction() prints 4 and not able to get up or down event 
      } 
     }); 
    windowmanager.addView(parentlay, params); 

próbuję wyświetlić przycisk, gdy użytkownik przejeżdża od lewej do prawej poprzez uchwycenie tego zdarzenia i robi

parentlay.addView(bt); 

i usunąć widok, gdy użytkownik przejeżdża od prawej do lewej strony przez

parentlay.removeView(bt); 

Jak wspomniano, nie można uzyskać zdarzeń ruchu, o ile nie zmieniono typu TYPE_SYSTEM_ALERT, ale ten komunikat zamroził cały ekran i nie mógł kliknąć przycisku powrotu lub przycisku strony głównej, czy jest jakakolwiek alternatywna metoda wykonania tego.

Właśnie próbowałem poniżej modyfikacji

params.type =WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; 
    params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
    |WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH 
    |WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 

    params.height = WindowManager.LayoutParams.MATCH_PARENT; 
    params.width = WindowManager.LayoutParams.MATCH_PARENT; 

ale nie mogłem kliknąć przycisk pod spodem, może być jej powodu MATCH_PARTENT ale jeśli mogę ustawić go wrap_content potem nie mogę dostać kliknij wydarzenia.

Odpowiedz

8

Aby ukryć widok, należy wywołać mWindowManager.removeView (mOverlay);

private RelativeLayout mOverlay; 
     private WindowManager mWindowManager; 
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
         WindowManager.LayoutParams.WRAP_CONTENT, 
         WindowManager.LayoutParams.WRAP_CONTENT, 
         WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, 
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
           | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
         PixelFormat.TRANSLUCENT); 
       params.gravity = Gravity.TOP; 
       LayoutInflater inflater = (LayoutInflater) context 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       mOverlay = (RelativeLayout) inflater 
         .inflate(R.layout.phasechange, null); 

       mWindowManager = (WindowManager) context 
         .getSystemService(Context.WINDOW_SERVICE); 
       mWindowManager.addView(mOverlay, params); 
       Button b = (Button) mOverlay.findViewById(R.id.button1); 
       b.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         mWindowManager.removeView(mOverlay); 
        } 
       }); 

      } 
+0

Dzięki za odpowiedź, muszę dodać widok przez akcję machnięcia lub dowolne zdarzenie akcji, takie jak to, co zrobiły swapy. Nie uruchomiłem mojej aplikacji.i usunąć widok przez zdarzenie akcji – ganesh

+0

ok jak na razie i mogę zaakceptować odpowiedź DjHacktor, stąd jest to całkiem blisko moich wymagań. – ganesh

+0

Dziękuję bardzo! – kord

1

Twoje podejście do tego zadania jest bardzo nietypowe. Po prostu dodanie nowego widoku poradziłoby sobie z zadaniem bez zarzutu.

Dodaj ten kod:

RelativeLayout layout = new RelativeLayout(this); 
Button b = new Button(this); 
b.setBackgroundColor(Color.LTGRAY); 
b.setText("Click to Go"); 
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.CENTER_IN_PARENT); 
b.setLayoutParams(params); 
layout.addView(b); 

//get a reference to your main layout: 
ViewGroup myLayout = findViewById(R.id.whateverMayLayoutIdIs); 
layout.addView(layout); 

Aby ukryć widok, można po prostu usunąć go z układu, albo zmienić jego widoczność.

Podejście, nad którym pracowałeś, jest bardzo trudne, a inne miały problemy z obsługą. Przykłady obejmują Android : Multi touch and TYPE_SYSTEM_OVERLAY i GestureDetector within a TYPE_SYSTEM_OVERLAY. Wypróbuj this google search, aby uzyskać więcej informacji.

1

Widok z Kodeksu jest zawsze gorączkowy i trudny do opanowania. więc możesz dodać przycisk w układzie i sprawić, że będzie on widoczny i niewidoczny zgodnie z twoimi przesunięciami.

i skorzystać z poniższego kodu, aby uzyskać gesty

public class MyGestureDetector implements OnGestureListener { 
     @Override 
     public boolean onDown(MotionEvent arg0) { 
      return false; 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
       float arg3) { 
      return setCurrentSwipeTab(e1, e2, velocityX, arg3); 
     } 

     @Override 
     public void onLongPress(MotionEvent arg0) { 
     } 

     @Override 
     public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, 
       float arg3) { 
      return false; 
     } 

     @Override 
     public void onShowPress(MotionEvent e) { 
     } 

     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return false; 
     } 
    } 


public boolean setCurrentSwipeTab(MotionEvent e1, MotionEvent e2, 
      float velocityX, float arg3) { 
     try { 
      if (Math.abs(e1.getY() - e2.getY()) > Util.SWIPE_MAX_OFF_PATH) 
       return false; 
      // Left to right swipe of the user detected 
      if (e1.getX() - e2.getX() > Util.SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > Util.SWIPE_THRESHOLD_VELOCITY) { 

       } 
        // Nothing to do since you are at the Last tab!! it's task 
        // of the left swipe now 
       } 
      } else if (e2.getX() - e1.getX() > Util.SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > Util.SWIPE_THRESHOLD_VELOCITY) { 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 
1

Zastosowanie okno typu TYPE_PHONE zamiast TYPE_SYSTEM_OVERLAY wraz z flagą FLAG_NOT_FOCUSABLE.

Powiązane problemy