2013-02-18 35 views
8

के लिए टच इवेंट नहीं मिल सका, मैं Swapps के समान एक ऐप विकसित करना चाहता हूं। मैं किसी भी स्क्रीन के शीर्ष पर एक बटन प्रदर्शित करने की कोशिश कर रहा हूं और यह केवल एक स्वाइपिंग कार्रवाई पर होना चाहिए। मैंने नीचे दिए गए कोड के साथ प्रयास किया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); 

मैं बटन प्रदर्शित करने के लिए जब उपयोगकर्ता उस घटना पर कब्जा करने और

parentlay.addView(bt); 

कर रहे हैं और हटाने दृश्य है जब उपयोगकर्ता से स्वाइप से बाएँ से सही से स्वाइप कोशिश कर रहा हूँ सही-से-बाएँ से

parentlay.removeView(bt); 

जैसा कि मैंने बताया है कि जब तक मैंने टाइप को TYPE_SYSTEM_ALERT के रूप में नहीं बदला, तब तक मुझे गति की घटनाएं नहीं मिलीं, लेकिन उस आंतन ने सभी स्क्रीन को फ्रीज किया और वापस या होम बटन पर क्लिक नहीं किया, क्या ऐसा करने का कोई वैकल्पिक तरीका है।

मैं सिर्फ संशोधन

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; 

नीचे की कोशिश की है लेकिन मैं नीचे बटन पर क्लिक करें नहीं कर सकता है, MATCH_PARTENT करने के लिए अपने कारण हो सकता है, लेकिन अगर मैं इसे wrap_content करने के लिए सेट तो मैं घटनाओं क्लिक नहीं कर सकते।

उत्तर

8

दृश्य को छुपाने के लिए आपको 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

आपके उत्तर के लिए धन्यवाद, मुझे स्वाइप एक्शन या किसी भी एक्शन इवेंट द्वारा दृश्य जोड़ने की ज़रूरत है, जैसे कि swapps ने किया है। मैंने अपना ऐप लॉन्च नहीं किया है। और एक्शन इवेंट – ganesh

+0

के द्वारा दृश्य को अभी ठीक करें, DjHacktor उत्तर स्वीकार कर सकते हैं इसलिए यह मेरी आवश्यकताओं के करीब है – ganesh

+0

धन्यवाद आप बहुत बहुत धन्यवाद! – kord

1

इस कार्य के लिए आपका दृष्टिकोण बहुत असामान्य है। बस एक नया दृश्य जोड़ना ठीक काम को संभालेगा।

यह कोड जोड़ें:

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); 

दृश्य छुपाने के लिए, तुम सिर्फ लेआउट से हटाने, या उसकी दृश्यता बदल सकते हैं।

जिस दृष्टिकोण पर आप काम कर रहे थे वह बहुत मुश्किल है, और दूसरों को छूने के साथ समस्याएं हैं। उदाहरणों में Android : Multi touch and TYPE_SYSTEM_OVERLAY और GestureDetector within a TYPE_SYSTEM_OVERLAY शामिल हैं। अधिक के लिए this google search आज़माएं।

1

कोड से दृश्य बनाना हमेशा व्यस्त और प्रबंधित करने में थोड़ा कठिन होता है। तो वैकल्पिक रूप से आप लेआउट में बटन जोड़ सकते हैं और इसे अपने स्वाइप के अनुसार दृश्यमान और अदृश्य बना सकते हैं।

और कोड नीचे का उपयोग करें, TYPE_SYSTEM_OVERLAY के स्थान पर इशारों

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

उपयोग खिड़की प्रकार TYPE_PHONE प्राप्त करने के लिए झंडा FLAG_NOT_FOCUSABLE के साथ।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^