मैं कोड के माध्यम से देखने की स्थिति कैसे बदल सकता हूं? जैसे इसकी X, Y स्थिति बदलना। क्या यह संभव है?
मैं कोड के माध्यम से देखने की स्थिति कैसे बदल सकता हूं? जैसे इसकी X, Y स्थिति बदलना। क्या यह संभव है?
जवाबों:
हनीकॉम्ब (एपीआई स्तर 11) से नीचे की किसी भी चीज़ के लिए आपको उपयोग करना होगा setLayoutParams(...)
।
यदि आप Honeycomb करने के लिए अपने समर्थन की सीमा और कर सकते हैं आप उपयोग कर सकते हैं setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
, आदि
हां, आप Android में देखने की स्थिति को गतिशील रूप से सेट कर सकते हैं। इसी तरह आपके पास अपनी xml फ़ाइल का एक है ImageView
। तो LinearLayout
आप इसके माध्यम से अपनी स्थिति निर्धारित कर सकते हैं। LayoutParams
लेकिन LayoutParams
अपने xml फ़ाइल में लिए गए लेआउट के अनुसार लेना सुनिश्चित करें LayoutParams
। लिया गया लेआउट के अनुसार अलग-अलग हैं ।
यहाँ सेट करने के लिए कोड है:
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
मुझे उम्मीद है कि यह आपको स्थिति निर्धारित करने में मददगार होगा।
अलग-अलग मान्य उत्तर पहले से ही हैं, लेकिन कोई भी ठीक से सुझाव नहीं देता है कि कौन सी विधि का उपयोग करें, किस मामले में, इसी एपीआई स्तर प्रतिबंधों को छोड़कर
यदि आप एक लेआउट चक्र की प्रतीक्षा कर सकते हैं और अभिभावक दृश्य समूह MarginLayoutParams
(या उपवर्ग) का समर्थन करता है , तो सेट marginLeft
/ marginTop
तदनुसार।
यदि आपको तुरंत और दृढ़ता से स्थिति को बदलने की आवश्यकता है (उदाहरण के लिए एक पॉपअपमेनू एंकर के लिए), इसके अलावा layout(l, t, r, b)
उसी निर्देशांक के साथ कॉल करें । यह पूर्वसूचना देता है कि लेआउट सिस्टम बाद में क्या पुष्टि करेगा।
तात्कालिक (अस्थायी) परिवर्तनों (जैसे एनिमेशन) के लिए, इसके बजाय setX()
/ का उपयोग करें setY()
। ऐसे मामलों में जहां मूल आकार WRAP_CHILDREN पर निर्भर नहीं करता है, यह उपयोग करने के लिए ठीक हो सकता है setX()
/ setY()
विशेष रूप से।
कभी उपयोग setLeft()
/ setRight()
/ setBottom()
/ setTop()
, नीचे देखें।
पृष्ठभूमि : mLeft
/ mTop
/ mBottom
/ mRight
फ़ील्ड लेआउट में संबंधित लेआउटप्रैम से भरे हुए हैं ()। एंड्रॉइड व्यू लेआउट सिस्टम द्वारा लेआउट को अंतर्निहित और अतुल्यकालिक रूप से कहा जाता है। इस प्रकार, MarginLayoutParams
स्थिति स्थायी रूप से सेट करने के लिए सबसे सुरक्षित और साफ तरीका प्रतीत होता है। हालाँकि, अतुल्यकालिक लेआउट लैग कुछ मामलों में एक समस्या हो सकती है, उदाहरण के लिए जब किसी कर्सर को रेंडर करने के लिए एक दृश्य का उपयोग किया जाता है, और यह एक ही समय में पॉपअपमेनू एंकर के रूप में फिर से तैनात और सेवा करने वाला होता है। इस मामले में, कॉलिंग layout()
ने मेरे लिए ठीक काम किया।
समस्याओं setLeft()
और साथ setTop()
हैं:
उन्हें अकेले कॉल करना पर्याप्त नहीं है - आपको कॉल करने setRight()
और setBottom()
दृश्य को फैलाने या सिकोड़ने से बचने की भी आवश्यकता है ।
इन विधियों का कार्यान्वयन अपेक्षाकृत जटिल दिखता है (= उनमें से प्रत्येक के कारण हुए दृश्य आकार में परिवर्तन के लिए कुछ काम करना)
वे इनपुट क्षेत्रों के साथ अजीब मुद्दों का कारण बनते हैं: EditText सॉफ्ट न्यूमेरिक कीबोर्ड कभी-कभी अंकों की अनुमति नहीं देता है
setX()
और setY()
लेआउट सिस्टम के बाहर काम करते हैं, और इसी मान को लेआउट सिस्टम द्वारा निर्धारित बाएं / टॉप / बॉटम / राइट मानों के लिए एक अतिरिक्त ऑफसेट के रूप में माना जाता है, तदनुसार दृश्य को स्थानांतरित करना। वे एनिमेशन के लिए जोड़े गए हैं (जहां एक लेआउट चक्र के माध्यम से जाने के बिना तत्काल प्रभाव की आवश्यकता होती है)।
marginLeft
का उपयोग करके सेट किया जा सकता setLayoutParams
के साथ एक new FrameLayout.LayoutParams(width, height)
है जिस पर आप सेटmarginLeft
NineOldAndroids नाम की एक लाइब्रेरी है , जो आपको वर्जन एक के बाद एक सभी तरह से हनीकॉम्ब एनीमेशन लाइब्रेरी का उपयोग करने की अनुमति देती है।
इसका मतलब है कि आप बाएं, दाएं, ट्रांसलेशनएक्स / वाई को थोड़ा अलग इंटरफेस के साथ परिभाषित कर सकते हैं।
यहाँ दिया गया है कि यह कैसे काम करता है:
ViewHelper.setTranslationX(view, 50f);
आप व्यूहेल्पर क्लास से सिर्फ स्टैटिक मेथड का इस्तेमाल करते हैं, व्यू पास करते हैं और कभी भी जिस वैल्यू के लिए आप इसे सेट करना चाहते हैं।
मैं का उपयोग कर की सिफारिश करेंगे setTranslationX
और setTranslationY
। मैं केवल इस पर खुद को शुरू कर रहा हूं, लेकिन ये एक दृश्य को स्थानांतरित करने का सबसे सुरक्षित और पसंदीदा तरीका है। मुझे लगता है कि यह बहुत कुछ इस पर निर्भर करता है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं, लेकिन यह मेरे लिए 2 डी एनीमेशन के लिए अच्छा काम कर रहा है।
यदि आप HoneyComb Sdk (API Level 11) का उपयोग कर रहे हैं, तो आप निम्न विधियों का उपयोग करने का प्रयास कर सकते हैं।
view.setX(float x);
पैरामीटर x इस दृश्य की दृश्य x स्थिति है।
view.setY(float y);
पैरामीटर y इस दृश्य की दृश्य y स्थिति है।
मुझे उम्मीद है कि यह आपके लिए उपयोगी होगा। :)
सभी एपीआई स्तरों के समर्थन के लिए आप इसे इस तरह से उपयोग कर सकते हैं :
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
अपने माता-पिता के सापेक्ष इस दृश्य की बाईं स्थिति सेट करें:
view.setLeft(int leftPosition);
अपने माता-पिता के सापेक्ष इस दृश्य की सही स्थिति निर्धारित करें:
view.setRight(int rightPosition);
अपने माता-पिता के सापेक्ष इस दृश्य की शीर्ष स्थिति निर्धारित करें:
view.setTop(int topPosition);
इस दृश्य की निचली स्थिति को इसके माता-पिता के सापेक्ष सेट करें:
view.setBottom(int bottomPositon);
उपरोक्त विधियों का उपयोग इसके माता-पिता से संबंधित दृश्य को निर्धारित करने के लिए किया जाता है।
लेआउटपार्म्स का उपयोग करें। आप एक LinearLayout उपयोग कर रहे हैं यदि आप आयात android.widget.LinearLayout.LayoutParams, और आयात करने के लिए लेआउट के लिए LayoutParams की उचित संस्करण है आप उपयोग कर रहे हैं, या यह एक कारण होगा ClassCastException तो,:
LayoutParams layoutParams = new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
NB: ध्यान दें कि आप भी imageView.setLeft (int dim) का उपयोग कर सकते हैं, लेकिन इस घटक की स्थिति सेट नहीं करें, यह केवल घटक की बाईं सीमा की स्थिति निर्धारित करेगा, शेष उसी स्थिति में रहेगा ।
मैंने पाया कि @Stefan Haustein मेरे अनुभव के बहुत करीब आता है, लेकिन निश्चित रूप से 100% नहीं। मेरा सुझाव है:
setLeft()
/ setRight()
/ setBottom()
/ setTop()
कभी कभी काम नहीं करेगा।setX()
/setY()
इसके बजाय। (आप अंतर में setLeft()
औरsetX()
अधिक खोज कर सकते हैं )पोजिशनिंग को ध्यान में रखने वाली एक बात यह है कि प्रत्येक दृश्य के मूल दृश्य के सापेक्ष एक सूचकांक होता है। इसलिए यदि आपके पास तीन उप-साक्षात्कारों के साथ एक रेखीय लेआउट है, तो प्रत्येक उपर्युक्त मामले में प्रत्येक में एक सूचकांक होगा: 0, 1, 2।
यह आपको कुछ ऐसा करके माता-पिता के विचार में अंतिम स्थिति (या अंत) में एक दृश्य जोड़ने की अनुमति देता है:
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
वैकल्पिक रूप से आप निम्नलिखित की तरह कुछ का उपयोग कर एक दृश्य बदल सकते हैं:
int childIndex = parentView.indexOfChild(childView);
childView.setVisibility(View.GONE);
parentView.addView(newView, childIndex);
sets the top position of this view relative to its parent. This method is meant to be called by the layout system and should not generally be called otherwise, because the property may be changed at any time by the layout.
- तो शायद यही कारण है कि एक अच्छा विचार नहीं है;)