मैं एक साधारण लेआउट:अजीब 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();
}
के बाद से इस सवाल का जवाब 19 जुलाई 2013 को बनाया गया था, मैं यह सोचते हैं रहा है कि आप एंड्रॉयड की चर्चा करते हुए किया गया 4.3 "अगली रिलीज" के रूप में। क्या इसका मतलब यह है कि getHitRect() इससे पहले संस्करणों पर अविश्वसनीय है? – Saket
@ साकेत मैं कहूंगा कि यह एक उचित धारणा है क्योंकि मेरे पास एक फोन है जो 4.1.2 (एक्सपीरिया एस) पर अटक गया है और वाई निर्देशांक मुझे बहुत अधिक समझ नहीं आ रहा है, यानि नीचे और शीर्ष - बमर क्योंकि वह रेक्ट फ़ंक्शन मुझे बहुत दर्द बचाया होगा ... – AgentKnopf
@Zainodis ओपी के अपडेट देखें। उस विधि को अच्छी तरह से काम करना चाहिए :) – Saket