2013-07-19 16 views
10

मैं एक साधारण लेआउट:अजीब View.getHitRect() व्यवहार

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Button" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:onClick="animate" 
    android:text="animate" /> 

</LinearLayout> 

और मेरी गतिविधि में मैं बटन के हिट रेक्ट मुद्रण कर रहा हूँ अपने y स्थान बदलने के बाद:

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

public void animate(View view) { 
    printHitRect(); 
    findViewById(R.id.button1).setY(50); 
    printHitRect(); 
} 
private void printHitRect() { 
    Rect rect = new Rect(); 
    findViewById(R.id.button1).getHitRect(rect); 
    Log.d(">>button1 hit rect", rect.flattenToString()); 
} 
} 

अपेक्षित आउटपुट

Button1 हिट रेक्ट: 0 0 116 72

Button1 मारा रेक्ट: 0 50 116 122

वास्तविक आउटपुट

Button1 रेक्ट मारा: 0 0 116 72

Button1 हिट रेक्ट: -58 14 58 86

कोई इस उत्पादन, मैंने कुछ गलत कर रहा हूँ या यह एक बग है व्याख्या कर सकते हैं? मूल रूप से मैं यह पता लगाने के लिए कि कौन सा बच्चा उपयोगकर्ता छू गया है, मेरे कस्टम ViewGroup में इस getHitRect() का उपयोग कर रहा हूं। क्या किसी विशेष बिंदु पर बच्चे को पाने का कोई बेहतर तरीका है, getChildAt(x, y) जैसे फ़ंक्शन हो सकता है?

setY() के बजाय, मैंने setTranslateY() की कोशिश की है। मैंने नाइनऑल्ड एंड्रॉइड लाइब्रेरी के साथ-साथ एनीमेशन फ्रेमवर्क में भी बनाया है। अगर मैं setY() के बजाय findViewById(R.id.button1).animate().y(50) का उपयोग करता हूं तो वही व्यवहार देखा जा सकता है।

अद्यतन:

मैं nineoldandroid पुस्तकालय है कि अब काम कर रहा है का उपयोग कर उपयोगिता विधि लेखन समाप्त हो गया:

private static void getHitRect(View v, Rect rect) { 
    rect.left = (int) com.nineoldandroids.view.ViewHelper.getX(v); 
    rect.top = (int) com.nineoldandroids.view.ViewHelper.getY(v); 
    rect.right = rect.left + v.getWidth(); 
    rect.bottom = rect.top + v.getHeight(); 
} 

उत्तर

8

getHitRect() एक बग था और रूपांतरण ठीक से लागू नहीं होगा। हमने आंतरिक रूप से इस बग को ठीक किया है और फिक्स एंड्रॉइड की अगली सार्वजनिक रिलीज में उपलब्ध कराया जाएगा।

+8

के बाद से इस सवाल का जवाब 19 जुलाई 2013 को बनाया गया था, मैं यह सोचते हैं रहा है कि आप एंड्रॉयड की चर्चा करते हुए किया गया 4.3 "अगली रिलीज" के रूप में। क्या इसका मतलब यह है कि getHitRect() इससे पहले संस्करणों पर अविश्वसनीय है? – Saket

+0

@ साकेत मैं कहूंगा कि यह एक उचित धारणा है क्योंकि मेरे पास एक फोन है जो 4.1.2 (एक्सपीरिया एस) पर अटक गया है और वाई निर्देशांक मुझे बहुत अधिक समझ नहीं आ रहा है, यानि नीचे और शीर्ष - बमर क्योंकि वह रेक्ट फ़ंक्शन मुझे बहुत दर्द बचाया होगा ... – AgentKnopf

+0

@Zainodis ओपी के अपडेट देखें। उस विधि को अच्छी तरह से काम करना चाहिए :) – Saket

2

आप इस तरह से रेक्ट हिट कर सकते हैं:

public Rect getHitRect(View child){ 
    Rect frame = new Rect(); 
    frame.left = child.getLeft(); 
    frame.right = child.getRight(); 
    frame.top = child.getTop(); 
    frame.bottom = child.getBottom(); 
    return frame; 
} 
+0

यह बच्चे के रूप में काम नहीं करता है .getLeft() गलत मान देता है, प्रश्नकर्ता ने नौल्डेंड्रॉइड कामों का उपयोग करके लिखा है समाधान – 2cupsOfTech

1

यहाँ एक समाधान है कि NineOldAndroids पर निर्भर नहीं करता है।

आप NineOldAndroids कोड पथ के लिए कोड मार्ग का अनुसरण यदि आप अंत में पद मधुकोश उपकरणों पर यहाँ प्राप्त: Github

private static void getHitRect(View v, Rect rect) { 
    rect.left = (int) (v.getLeft() + v.getTranslationX()); 
    rect.top = (int) (v.getTop() + v.getTranslationY()); 
    rect.right = rect.left + v.getWidth(); 
    rect.bottom = rect.top + v.getHeight(); 
} 
+0

अच्छा समाधान, मुझे बस छोटे अंशांकन 'rect.top - = dividerValue/2; rect.bottom + = dividerValue/2; 'सूचीदृश्य में वस्तुओं के बीच व्यापक विभक्त का उपयोग करते समय, स्पर्शों के बहुत सारे मिस्ड डिटेक्शन थे। – LadyWoodi

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