2011-01-19 21 views
9

मैंएंड्रॉयड स्क्रीन अभिविन्यास सेंसर

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

यह ठीक काम करता है की स्थापना करके बटन पर क्लिक करने के लिए परिदृश्य स्क्रीन अभिविन्यास बाध्य करना चाहते हैं। अब मैं चाहता हूं कि एप्लिकेशन सेंसर का पालन करे ताकि पोर्ट्रेट पर वापस झुकाए जाने पर अभिविन्यास को पोर्ट्रेट पर वापस लाया जा सके। मुझे पता है कि यह setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); सेट करके संभव है लेकिन यह नहीं पता कि इसे कहां सेट करना है। यदि अभिविन्यास को परिदृश्य में मजबूर किया जाता है, तो अभिविन्यास परिदृश्य में रहेगा चाहे आप किसी भी दिशा में झुकाएं। क्या कोई निर्दिष्ट कर सकता है कि अभिविन्यास ध्वज को रीसेट कैसे करें?

उत्तर

1

यह इस बात पर निर्भर करता है कि जब आप सेंसर को फिर से घूर्णन का पता लगाना चाहते हैं।

कोई एप्लिकेशन मुझे लगता है मैं एक विशिष्ट गतिविधि है जहाँ मैं पोर्ट्रेट मोड में होने की जरूरत है, तो मैं इस गतिविधि का onResume() और onPause() में setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); में setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); का उपयोग करें और यह सिर्फ ठीक काम करता है developping कर रहा हूँ में व्यक्तिगत रूप से, जब मैं में प्रवेश गतिविधि यह पोर्ट्रेट पर सेट होती है अगर यह नहीं है और सेंसर को फिर से बाहर करने की अनुमति नहीं देता है ...

आप सेंसर को सक्षम और अक्षम करने का प्रयास कहां कर रहे हैं?

+0

मेरा आवेदन डिफ़ॉल्ट रूप से पोर्ट्रेट मोड में है। उपयोगकर्ता बटन पर क्लिक करके या डिवाइस को टिल्ट करके लैंडस्केप मोड पर स्विच कर सकता है। लेकिन लैंडस्केप मोड पर, गतिविधि को वापस पोर्ट्रेट मोड में लाने का कोई तरीका नहीं है। यदि पोर्ट्रेट पर अभिविन्यास को मजबूर करने के लिए एक और बटन प्रदान किया जाना है, तो यह अंतिम विकल्प होगा। मैं जानना चाहता था कि परिदृश्य को मजबूर करने के बाद सेंसर मोड में सेट करना संभव है। मैंने आपके विकल्प टी को विराम पर सेंसर मोड पर सेट करने का प्रयास किया है, लेकिन जब यह पोर्ट्रेट मोड में होता है तो मैं लैंडस्केप मोड पर बल देना चाहता हूं, लेकिन यह पोर्ट्रेट मोड पर वापस आ जाएगा। – Kulai

4

मैं यहाँ लगता है कि आप का उपयोग करना चाहिए setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)

7

वर्तमान YouTube ऐप्लिकेशन के लिए आप क्या कह रहे हैं नहीं करता है।
मैं वीडियो प्लेबैक के लिए अपने आवेदन में इस समस्या का एक ही तरह से निपटा गया है।

परिदृश्य के लिए उपयोगकर्ता बलों उन्मुखीकरण जब वह/वह चित्र में था, OrientationEventListener जो SensorManager जो 0 से 360

घड़ी के बीच है से पर डिवाइस अभिविन्यास आपको सूचित करता आरंभ तो उपकरण है जो चारों ओर (orientation >= 60 && orientation <= 120) || (orientation >= 240 && orientation <= 300) होगा लैंडस्केप ओरिएंटेशन श्रृंखला के लिए झुक जाता है, तो और इस स्थिति को एक enum या ध्वज में सहेजें और फिर यदि डिवाइस पोर्ट्रेट ओरिएंटेशन रेंज (orientation <= 40 || orientation >= 320) पर वापस जाता है, तो enum/flag को चेक करें और setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); पर कॉल करें, ध्वज/enum रीसेट करें और फिर से उपयोगकर्ता बल अभिविन्यास तक सेंसर को अक्षम करें।

यहाँ डेमो कोड है:

private enum SensorStateChangeActions { 
     WATCH_FOR_LANDSCAPE_CHANGES, SWITCH_FROM_LANDSCAPE_TO_STANDARD, WATCH_FOR_POTRAIT_CHANGES, SWITCH_FROM_POTRAIT_TO_STANDARD; 
} 

private SensorStateChangeActions mSensorStateChanges; 

public void goFullScreen() { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
     mSensorStateChanges = SensorStateChangeActions.WATCH_FOR_LANDSCAPE_CHANGES; 
     if (null == sensorEvent) 
      initialiseSensor(true); 
     else 
      sensorEvent.enable(); 
} 

public void shrinkToPotraitMode() { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     mSensorStateChanges = SensorStateChangeActions.WATCH_FOR_POTRAIT_CHANGES; 
     if (null == sensorEvent) 
      initialiseSensor(true); 
     else 
      sensorEvent.enable(); 
} 
/** 
* Initialises system sensor to detect device orientation for player changes. 
* Don't enable sensor until playback starts on player 
* 
* @param enable if set, sensor will be enabled. 
*/ 
private void initialiseSensor(boolean enable) { 
    sensorEvent = new OrientationEventListener(this, 
      SensorManager.SENSOR_DELAY_NORMAL) { 

     @Override 
     public void onOrientationChanged(int orientation) { 
      /* 
      * This logic is useful when user explicitly changes orientation using player controls, in which case orientation changes gives no callbacks. 
      * we use sensor angle to anticipate orientation and make changes accordingly. 
      */ 
      if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.WATCH_FOR_LANDSCAPE_CHANGES 
        && ((orientation >= 60 && orientation <= 120) || (orientation >= 240 && orientation <= 300))) { 
       mSensorStateChanges = SensorStateChangeActions.SWITCH_FROM_LANDSCAPE_TO_STANDARD; 
      } else if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.SWITCH_FROM_LANDSCAPE_TO_STANDARD 
        && (orientation <= 40 || orientation >= 320)) { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
       mSensorStateChanges = null; 
       sensorEvent.disable(); 
      } else if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.WATCH_FOR_POTRAIT_CHANGES 
        && ((orientation >= 300 && orientation <= 359) || (orientation >= 0 && orientation <= 45))) { 
       mSensorStateChanges = SensorStateChangeActions.SWITCH_FROM_POTRAIT_TO_STANDARD; 
      } else if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.SWITCH_FROM_POTRAIT_TO_STANDARD 
        && ((orientation <= 300 && orientation >= 240) || (orientation <= 130 && orientation >= 60))) { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
       mSensorStateChanges = null; 
       sensorEvent.disable(); 
      } 
     } 
    }; 
    if (enable) 
     sensorEvent.enable(); 
} 

यह YouTube कार्यक्षमता के समान काम किया, उम्मीद है कि इस मदद करता है।

+0

यह मैं वास्तव में क्या ढूंढ रहा था: एक तरह से अनुकरण करने के लिए क्या YouTube एप्लिकेशन कर रहा था! धन्यवाद :) – wblaschko

+0

इसका काम पूरी तरह से :) – Meenaxi

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