दिलचस्प पोस्ट
कैसे स्क्रॉल दिशा का पता लगाने के लिए इवेंट हैंडलर्स के नाम के लिए रीशरपर सम्मेलनों .htaccess पुनर्निर्देशित http को https पर डबल से int को कनवर्ट करें Matplotlib – लॉगरिदमिक स्केल, लेकिन गैर-लॉगरिदमिक लेबल की आवश्यकता होती है JQuery में टेक्स्ट स्ट्रिंग खोजें और इसे बोल्ड करें पायथन में ओएससिस्टम () कॉल से बचने के लिए कैसे? जावा: मैं कैसे जांच करूं कि कोई दिनांक एक निश्चित सीमा के भीतर है? केवल सूत्रों का उपयोग करके Excel में अनन्य मान प्राप्त करना बेस 64 के लिए बाइनरी (डेल्फी) pod install -bash: pod: कमांड नहीं मिला पायथन पर कीबोर्ड और माउस अनुकरण करने का सबसे आसान तरीका कौन सा है? अजाक्स एक http पृष्ठ पर https का उपयोग करते हुए आप ASP.NET MVC में अधिभार नियंत्रक विधियों कर सकते हैं? JQuery का उपयोग करने वाले तत्वों में आप छद्म वर्ग कैसे जोड़ सकते हैं?

रनटाइम पर एंड्रॉइड व्यू के आकार का निर्धारण करना

मेरी गतिविधि बनने के बाद मैं अपने एंड्रॉइड ऐप में एनीमेशन को देखने के लिए कोशिश कर रहा हूं। ऐसा करने के लिए, मुझे दृश्य के वर्तमान आकार को निर्धारित करने की आवश्यकता है, और फिर मौजूदा आकार से नए आकार में स्केल करने के लिए एनीमेशन सेट अप करें। यह भाग रनटाइम पर किया जाना चाहिए, क्योंकि उपयोगकर्ता के इनपुट के आधार पर दृश्य अलग-अलग आकारों में तराजू है। मेरे लेआउट को XML में परिभाषित किया गया है

यह एक आसान काम की तरह लगता है, और इसके बारे में बहुत सारे सवाल हैं, हालांकि कोई भी मेरी समस्या का समाधान नहीं करता है, जाहिर है तो शायद मैं कुछ स्पष्ट लापता हूँ मैं अपने विचारों को संभालता हूं:

ImageView myView = (ImageView)getWindow().findViewById(R.id.MyViewID); 

यह काम ठीक है, लेकिन जब getWidth() , getHeight() , getMeasuredWidth() , getLayoutParams().width , आदि, वे सभी वापसी 0 पर कॉल करते समय। getMeasuredWidth() , लेकिन इसका कोई प्रभाव नहीं है।

मैंने इन विधियों को कॉल करने और ऑब्जेक्ट को डिबगर में मेरी गतिविधि के onPostCreate() में और onPostCreate() का onPostCreate() । रनटाइम पर इस दृश्य के सटीक आयामों को मैं कैसे समझ सकता हूँ?

वेब के समाधान से एकत्रित समाधान "रनटाइम पर एंड्रॉइड व्यू के आकार का निर्धारण करना"

प्रथम लेआउट की प्रतीक्षा करने के लिए ViewTreeObserver का उपयोग करें। केवल पहले लेआउट के बाद मिलेगा Width () / getHeight () / getMeasuredWidth () / getMeasuredHeight () काम

 ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); if (viewTreeObserver.isAlive()) { viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); viewWidth = view.getWidth(); viewHeight = view.getHeight(); } }); } 

परिदृश्य पर निर्भर करते हुए वास्तव में कई समाधान होते हैं:

  1. लेआउट चरण समाप्त होने के बाद, सुरक्षित तरीके से, दृश्य खींचने से पहले ही काम करेगा:
 public static void runJustBeforeBeingDrawn(final View view, final Runnable runnable) { final OnPreDrawListener preDrawListener = new OnPreDrawListener() { @Override public boolean onPreDraw() { view.getViewTreeObserver().removeOnPreDrawListener(this); runnable.run(); return true; } }; view.getViewTreeObserver().addOnPreDrawListener(preDrawListener); } 
  1. कुछ मामलों में, दृश्य के आकार को मैन्युअल रूप से मापने के लिए पर्याप्त है:
 view.measure(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); int width=view.getMeasuredWidth(); int height=view.getMeasuredHeight(); 
  1. अगर आपके पास एक कस्टम दृश्य है जिसे आपने बढ़ाया है, तो आप "मापन" विधि पर अपना आकार प्राप्त कर सकते हैं, लेकिन मुझे लगता है कि यह केवल कुछ मामलों पर अच्छा काम करता है:
 protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { final int newHeight= MeasureSpec.getSize(heightMeasureSpec); final int newWidth= MeasureSpec.getSize(widthMeasureSpec); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } 

क्या आपको वास्तव में स्क्रीन पर दृश्य दिखाई देने से पहले getWidth() बुला रहे हैं?

नए एंड्रॉइड डेवलपर्स द्वारा बनाई गई एक आम गलती है कि उसके निर्माता के अंदर एक दृश्य की चौड़ाई और ऊंचाई का उपयोग करना। जब किसी व्यू के कन्स्ट्रक्टर को फोन किया जाता है, तो एंड्रॉइड अभी तक नहीं जानता कि दृश्य कितना बड़ा होगा, इसलिए आकार शून्य पर सेट किया गया है। असली आकार लेआउट चरण के दौरान गिना जाता है, जो निर्माण के बाद होता है लेकिन कुछ भी तैयार होने से पहले। जब आप ज्ञात होते हैं, तो आप मूल्यों के बारे में सूचित करने के लिए onSizeChanged() विधि का उपयोग कर सकते हैं, या आप बाद में getWidth() और getHeight() तरीकों का उपयोग कर सकते हैं, जैसे कि onDraw() विधि में

@ एमबीएर्ड की सलाह के आधार पर, मुझे ImageView onLayout() क्लास उप- onLayout() और onLayout() द्वारा एक व्यावहारिक समाधान मिला। मैंने तब एक पर्यवेक्षक इंटरफ़ेस बनाया जो मेरी गतिविधि को लागू किया और कक्षा में खुद के संदर्भ को पारित कर दिया, जिसने इसे गतिविधि को बताने की इजाजत दी, जब यह वास्तव में आकार बदल गया था।

मैं 100% आश्वस्त नहीं हूं कि यह सबसे अच्छा समाधान है (इसलिए मैं अभी तक यह उत्तर सही नहीं बता रहा हूं), लेकिन यह काम करता है और दस्तावेज़ीकरण के अनुसार पहली बार जब कोई दृश्य का वास्तविक आकार पा सकता है।

एपीआई <11 (एपीआई 11 में व्यू। ओनलेआउट चेंगल लिस्टनर सुविधा शामिल है) दृश्य को ओवरराइड करने के माध्यम से लेआउट प्राप्त करने के लिए कोड है:

 public class CustomListView extends ListView { private OnLayoutChangedListener layoutChangedListener; public CustomListView(Context context) { super(context); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (layoutChangedListener != null) { layoutChangedListener.onLayout(changed, l, t, r, b); } super.onLayout(changed, l, t, r, b); } public void setLayoutChangedListener( OnLayoutChangedListener layoutChangedListener) { this.layoutChangedListener = layoutChangedListener; } } public interface OnLayoutChangedListener { void onLayout(boolean changed, int l, int t, int r, int b); } 

आप इस सवाल को देख सकते हैं आप View की पोस्ट () विधि का उपयोग कर सकते हैं।

यह मेरे लिए onClickListener में काम करता है:

 yourView.postDelayed(new Runnable() { @Override public void run() { yourView.invalidate(); System.out.println("Height yourView: " + yourView.getHeight()); System.out.println("Width yourView: " + yourView.getWidth()); } }, 1); 

मैं भी आसपास getMeasuredWidth() गया था getMeasuredWidth() और getMeasuredHeight() getHeight() और लंबे समय के लिए getWidth() प्राप्त करें ………. बाद में मैंने पाया कि दृश्य की चौड़ाई और ऊँचाई onSizeChanged() पर प्राप्त करना सबसे अच्छा है ऐसा करने का तरीका …….. आप गतिशील रूप से onSizeChanged( ) विधि को ओवरराइड करते onSizeChanged( अपने वर्तमान चौड़ाई और वर्तमान दृश्य प्राप्त कर सकते हैं।

शायद उस पर एक नज़र रखना चाहें, जिसमें एक विस्तृत कोड स्निपेट है नया ब्लॉग पोस्ट: एंड्रॉइड में कस्टम व्यू (विस्तारित व्यू) की चौड़ाई और ऊंचाई आयाम कैसे प्राप्त करें http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html

कोड के नीचे का प्रयोग करें, यह दृश्य का आकार दे रहा है।

 @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); Log.e("WIDTH",""+view.getWidth()); Log.e("HEIGHT",""+view.getHeight()); } 

मेरे लिए perfekt काम करता है:

  protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) { base.OnElementPropertyChanged(sender, e); CTEditor ctEdit = Element as CTEditor; if (ctEdit == null) return; if (e.PropertyName == "Text") { double xHeight = Element.Height; double aHaight = Control.Height; double height; Control.Measure(LayoutParams.MatchParent,LayoutParams.WrapContent); height = Control.MeasuredHeight; height = xHeight / aHaight * height; if (Element.HeightRequest != height) Element.HeightRequest = height; } }