2013-06-14 9 views
7

मैं एक आवेदन करने की कोशिश कर रहा हूं, जो दो लोगों के लिए है और दोनों इसमें से एक आधा देखते हैं, इसलिए मुझे एक आधे लंबवत फ्लिप करने की आवश्यकता है। मैं के साथ RelativeLayout एस के साथ LinearLayout का उपयोग कर रहा हूं।180 डिग्री से संबंधित रिलेटिवआउट को घुमाने के लिए कैसे?

बात यह है कि मुझे यकीन नहीं है कि यह फ्लिप कैसे करें। स्पष्ट रूप से android:rotate केवल संस्करण 11+ (3.0+) में उपलब्ध है, लेकिन मैं इसे कम से कम 2.2 का समर्थन करना चाहता हूं।

SO पर अन्य संबंधित प्रश्न पढ़ने के बाद, मैंने विभिन्न चीजों की कोशिश की, जिनमें से कोई भी काम नहीं कर रहा है। मैंने रिलेवेटिवआउट का विस्तार करने और onDraw फ़ंक्शन को ओवरराइड करने का प्रयास किया, लेकिन ऐसा कुछ नहीं लगता है। यहां मेरा कोड है:

public class FlippedRelativeLayout extends RelativeLayout 
{ 
    public FlippedRelativeLayout(Context context) 
    { 
     super(context); 
    } 

    public FlippedRelativeLayout(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
    } 

    public FlippedRelativeLayout(Context context, AttributeSet attrs, 
      int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) 
    { 
     canvas.save(); 
     canvas.rotate(180); 
     super.onDraw(canvas); 
     canvas.restore(); 
    } 
} 

मुझे किसी भी मदद के लिए खुशी होगी, धन्यवाद!

+0

एक RelativeLayout, अपनी मूल वर्ग ViewGroup के रूप में, OnDraw डिफ़ॉल्ट (http://stackoverflow.com/a/ द्वारा फोन नहीं करता है 13056400/1122966)। मैं एक समाधान की तलाश में हूँ। – j0n0

+0

ठीक है, मैं एंड्रॉइड के लिए काफी नया हूं, शायद रिलेवेटलाइट का उपयोग करना इन चीजों के लिए नहीं है? मैंने सोचा कि यह मुझे स्क्रीन पर अपने तत्वों को रखने में सबसे लचीलापन देता है – argoneus

उत्तर

9

इस प्रयास करें:

public class MyRelativeLayout extends RelativeLayout {  
    public MyRelativeLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public MyRelativeLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public MyRelativeLayout(Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     setStaticTransformationsEnabled(true); 
    } 

    @Override 
    protected boolean getChildStaticTransformation(View child, Transformation t) { 
     t.setTransformationType(Transformation.TYPE_MATRIX); 
     Matrix m = t.getMatrix(); 
     m.reset(); 
     m.postRotate(180, child.getWidth()/2.0f, child.getHeight()/2.0f); 
     return true; 
    } 
} 

परिणाम है: enter image description here

+0

+1 यह वास्तव में एक बहुत ही सुरुचिपूर्ण समाधान है ! – dbm

+0

यह काम करता है! लेकिन बच्चे के दृश्य पर क्लिक क्षेत्र घूर्णन के समान स्थान पर रहते हैं। मैं इसे कैसे ठीक करता हूं? –

1

बहुत ही रोचक सवाल!

आप शायद दो आंशिक रूप से ट्रांसपरेंट Activity -s बनाने की कोशिश कर सकते हैं, जो एक ही लेआउट xml की अपनी प्रति दिखा रहा है और उसके बाद सक्रिय Activity के "z-order" को स्विच कर रहा है, जिस पर यह एक चाल चलाना है।

Activity ए "आपकी अपनी" गतिविधि होगी और इसमें पारदर्शी शीर्ष आधा और RelativeLayout होगा क्योंकि यह नीचे आधा है। इसमें सामान्य स्क्रीन अभिविन्यास भी होगा, जैसे: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)

Activity बी "आपके विरोधियों की गतिविधि" होगी। इसमें एक पारदर्शी शीर्ष आधा और RelativeLayout की एक प्रति भी नीचे की हिस्से के रूप में होगी। हालांकि इसमें एक उलटा स्क्रीन अभिविन्यास होगा, जैसे: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT)। इसका मतलब यह होगा कि पारदर्शी हिस्सा Activity बी केActivity एक की RelativeLayout हिस्सा, और पारदर्शी हिस्सा Activity की एक RelativeLayout हिस्सा ओवरलैप होगा Activity की बी

तुम भी कर सकते थे ओवरलैप होगा संबंधित launch mode of the Activity-s to "single top" या कुछ अन्य उपयुक्त मान डालें, इसलिए आप अपने Activity का एक नया उदाहरण नहीं बनाते जब "इसे फिर से शुरू करें", यानी प्रतिद्वंद्वी को "मेक-ए-मूव-टिकट" पर गुजरना।

दुर्भाग्य

...REVERSE_PORTRAIT orientation wasn't added until API level 9 (एंड्रॉयड 2.3.something) और आप स्पष्ट रूप एपीआई स्तर का अनुरोध 8.

इस दृष्टिकोण के बारे में साफ हिस्सा होगा कि जब केवल एक ही गतिविधि ध्यान केंद्रित हो सकता है पर (और, इसलिए, इनपुट लेने के लिए) एक समय, आप उपयोगकर्ता इनपुट के लिए स्वचालित रूप से एक स्टेटमाचिन प्राप्त करेंगे: प्रतिद्वंद्वी को आपके बोर्ड के साथ बातचीत करने की संभावना नहीं होगी जब तक कि आप अपना कदम नहीं उठाते और इसके विपरीत।

आशा है कि यह आपको कम से कम कुछ विचार देता है।

चीयर्स!

+0

अरघ, इस मामले में "लाभ" भी एक नुकसान है ... दो लोग मोड़ नहीं लेते हैं, वे उपयुक्त होने पर बस उनके हिस्से पर क्लिक करते हैं>। > लेकिन यह एक दिलचस्प समाधान है, मैंने कभी फोन पर सीधे एक हिस्से को "फ़्लिपिंग" के बारे में सोचा नहीं था – argoneus

+0

अरग वास्तव में :-) फिर मेरा सुझाव बहुत मदद नहीं है ... – dbm

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