android एक दृश्य के पूर्ण निर्देशांक कैसे प्राप्त करें




android-tablelayout (6)

रोमैन गाय की टिप्पणी के बाद, यहां मैंने इसे कैसे तय किया है। उम्मीद है कि यह किसी और की मदद करेगा जिसकी समस्या भी थी।

मैं वास्तव में स्क्रीन पर रखे जाने से पहले विचारों की स्थिति पाने की कोशिश कर रहा था लेकिन यह बिल्कुल स्पष्ट नहीं था कि यह हो रहा था। इन लाइनों को initilisation कोड चलाने के बाद रखा गया था, तो मुझे लगता है कि सब कुछ तैयार था। हालांकि, यह कोड अभी भी क्रेट () पर था; Thread.sleep () के साथ प्रयोग करके मैंने पाया कि लेआउट वास्तव में अंतिम रूप से अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप में अंतिम रूप दिया गया था तो वास्तव में, कोड स्क्रीन पर तैनात होने से पहले कोड चलाने की कोशिश कर रहा था। ऑनक्लिक लिस्टनर (या कुछ अन्य श्रोता) को कोड जोड़कर सही मान प्राप्त किए गए थे क्योंकि इसे लेआउट समाप्त होने के बाद ही निकाल दिया जा सकता था।

नीचे दी गई रेखा को समुदाय संपादन के रूप में सुझाया गया था:

कृपया onWindowfocuschanged(boolean hasFocus) उपयोग करें

मैं दृश्य के ऊपरी बाएं कोने के पूर्ण स्क्रीन पिक्सेल निर्देशांक प्राप्त करने का प्रयास कर रहा हूं। हालांकि, मुझे लगता है कि getLeft() और getRight() जैसी सभी विधियां काम नहीं करती हैं क्योंकि वे सभी दृश्य के माता-पिता के सापेक्ष प्रतीत होते हैं, इस प्रकार मुझे 0 । ऐसा करने का सही तरीका क्या है?

अगर यह मदद करता है, तो यह 'चित्र को वापस क्रम में रखें' गेम के लिए है। मैं चाहता हूं कि उपयोगकर्ता एकाधिक टुकड़ों का चयन करने के लिए एक बॉक्स खींचने में सक्षम हो। मेरी धारणा यह है कि ऐसा करने का सबसे आसान तरीका है getRawX() से getRawX() और getRawY() प्राप्त करना और फिर टुकड़ों को रखने वाले लेआउट के ऊपरी बाएं कोने के विरुद्ध उन मानों की तुलना करना। टुकड़ों के आकार को जानना, मैं तब निर्धारित कर सकता हूं कि कितने टुकड़े चुने गए हैं। मुझे एहसास है कि मैं getY() पर getY() getX() और getY() उपयोग कर सकता हूं, लेकिन यह एक सापेक्ष स्थिति देता है जो यह निर्धारित करता है कि कौन से टुकड़े अधिक कठिन चुने गए थे। (असंभव नहीं, मुझे पता है, लेकिन यह अनावश्यक रूप से जटिल लगता है)।

संपादित करें: यह वह कोड है जिसका उपयोग मैं किसी एक प्रश्न के अनुसार होल्डिंग कंटेनर के आकार को प्राप्त करने का प्रयास करता था। TableLayout टेबल है जिसमें सभी पहेली टुकड़े हैं।

TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());

संपादित करें 2: सुझाए गए उत्तरों के बाद, मैंने जो कोड आजमाया है, वह है।

public int[] tableLayoutCorners = new int[2];
(...)

TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
tableLayout.requestLayout();
Rect corners = new Rect();
tableLayout.getLocalVisibleRect(corners);
Log.d(LOG_TAG, "Top left " + corners.top + ", " + corners.left + ", " + corners.right
            + ", " + corners.bottom);

cells[4].getLocationOnScreen(tableLayoutCorners);
Log.d(LOG_TAG, "Values " + tableLayoutCorners[0] + ", " + tableLayoutCorners[1]);

सभी प्रारंभिकरण के बाद यह कोड जोड़ा गया था। छवि को TableLayout निहित ImageViews (कक्ष [] सरणी) की एक सरणी में विभाजित किया गया है। कोशिकाएं [0] शीर्ष बाएं ImageView , और मैंने कोशिकाओं को चुना [4] क्योंकि यह कहीं बीच में है और निश्चित रूप से (0,0) के निर्देशांक नहीं होना चाहिए।

ऊपर दिखाया गया कोड अभी भी मुझे लॉग में सभी 0s देता है, जो मैं वास्तव में समझ में नहीं आता क्योंकि विभिन्न पहेली टुकड़े सही तरीके से प्रदर्शित होते हैं। (मैंने टेबल लयआउट कॉर्नर और डिफ़ॉल्ट दृश्यता के लिए सार्वजनिक int की कोशिश की, दोनों एक ही परिणाम दे रहे हैं।)

मुझे नहीं पता कि यह महत्वपूर्ण है, लेकिन ImageView को मूल रूप से आकार नहीं दिया गया है। ImageView s का आकार प्रारंभिक रूप से प्रारंभ के दौरान निर्धारित होता है जब मैं इसे प्रदर्शित करने के लिए एक छवि देता हूं। क्या यह उनके मानों को 0 में योगदान दे सकता है, भले ही लॉगिंग कोड उन्हें एक छवि दी जाने के बाद है और स्वचालित रूप से स्वयं का आकार बदल चुका है? संभावित रूप से इसका मुकाबला करने के लिए, मैंने उपरोक्त दिखाए गए कोड tableLayout.requestLayout() को जोड़ा, लेकिन इससे मदद नहीं मिली।


स्वीकृत उत्तर वास्तव में यह नहीं बताता कि स्थान कैसे प्राप्त करें, इसलिए यहां थोड़ा और विवरण दिया गया है। आप लंबाई 2 की एक int सरणी में गुजरते हैं और मानों को दृश्य (x, y) निर्देशांक (शीर्ष, बाएं कोने में) के साथ प्रतिस्थापित किया जाता है।

int[] location = new int[2];
myView.getLocationOnScreen(location);
int x = location[0];
int y = location[1];

टिप्पणियाँ

  • View.getLocationOnScreen() साथ getLocationInWindow() को प्रतिस्थापित करना अधिकांश मामलों में समान परिणाम देना चाहिए ( यह उत्तर देखें)। हालांकि, यदि आप एक संवाद या कस्टम कीबोर्ड जैसी छोटी विंडो में हैं, तो इसका उपयोग करने के लिए आपको यह चुनने की आवश्यकता होगी कि आपकी आवश्यकताओं के अनुरूप कौन सा बेहतर है।
  • यदि आप इस विधि को onCreate में कॉल करते हैं तो आपको (0,0) मिलेगा क्योंकि दृश्य अभी तक निर्धारित नहीं किया गया है। लेआउट पूरा होने पर सुनने के लिए आप ViewTreeObserver का उपयोग कर सकते हैं और आप मापा निर्देशांक प्राप्त कर सकते हैं। ( यह जवाब देखें।)

मेरा उपयोग दृश्य स्थान प्राप्त करने के लिए कार्य करता है, यह x value और y value साथ एक Point ऑब्जेक्ट वापस करेगा

public static Point getLocationOnScreen(View view){
    int[] location = new int[2];
    view.getLocationOnScreen(location);
    return new Point(location[0], location[1]);
}

का उपयोग करते हुए

Point viewALocation = getLocationOnScreen(viewA);

सबसे पहले आपको दृश्य के स्थानीय दृश्य आयत प्राप्त करना होगा

उदाहरण के लिए:

Rect rectf = new Rect();

//For coordinates location relative to the parent
anyView.getLocalVisibleRect(rectf);

//For coordinates location relative to the screen/display
anyView.getGlobalVisibleRect(rectf);

Log.d("WIDTH        :", String.valueOf(rectf.width()));
Log.d("HEIGHT       :", String.valueOf(rectf.height()));
Log.d("left         :", String.valueOf(rectf.left));
Log.d("right        :", String.valueOf(rectf.right));
Log.d("top          :", String.valueOf(rectf.top));
Log.d("bottom       :", String.valueOf(rectf.bottom));

उम्मीद है कि यह मदद करेगा



सटीक एक्स और वाई कॉर्डिनेट्स को खोजने के लिए इस कोड का उपयोग करें:

int[] array = new int[2];
ViewForWhichLocationIsToBeFound.getLocationOnScreen(array);
if (AppConstants.DEBUG)
    Log.d(AppConstants.TAG, "array  X = " + array[0] + ", Y = " + array[1]);
ViewWhichToBeMovedOnFoundLocation.setTranslationX(array[0] + 21);
ViewWhichToBeMovedOnFoundLocation.setTranslationY(array[1] - 165);

मैंने अपने दृश्य को समायोजित करने के लिए कुछ मूल्यों को जोड़ा / घटाया है। पूरा दृश्य बढ़ने के बाद ही इन पंक्तियों को करें।







android-tablelayout