2016-03-08 9 views
12
Android Studio 2.0 beta 6 

मैं एक उपकरण पट्टी के अंदर एक ImageView (ivSettings) स्थानांतरित करने के लिए इतना है कि यह सही और ऊपर से 20dp से 20dp है ViewPropertyAnimator उपयोग करने के लिए कोशिश कर रहा हूँ की चौड़ाई जाओ, वर्तमान स्थान है। और बाएं और ऊपर से ImageView (ivSearch) 20dp को ले जाएं।माता पिता लेआउट

छवि दृश्य Toolbar में निहित हैं।

यह प्रारंभिक स्थिति है और मैं टूलबार के अंदर ऊपरी कोनों में आइकन को स्थानांतरित करना चाहता हूं।

enter image description here

कोड मैं उपयोग कर रहा हूँ इस चौड़ाई और फिर एक मूल्य घटाना ivSettings सही से 20dp होने के लिए प्राप्त करने के लिए है।

final DisplayMetrics displayMetrics = new DisplayMetrics(); 
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
final float widthPx = displayMetrics.widthPixels; 

ivSearch.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .x(20) 
    .y(20) 
    .setDuration(250) 
    .start(); 

ivSettings.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .x(widthPx - 160) 
    .y(20) 
    .setDuration(250) 
    .start(); 

हालांकि, विभिन्न स्क्रीन आकार पर यह कोशिश करने के बाद मुझे सटीक चौड़ाई की गणना नहीं मिल सकती है। क्या ऐसा करने का कोई बेहतर तरीका है?

किसी भी सुझाव

+0

इसके बजाय टूलबार से चौड़ाई का उपयोग करने का प्रयास करें। – Piyush

+0

मैंने चौड़ाई को 'match_parent' पर सेट किया है, इसलिए toolbar.getWidth() हमेशा 0 लौटाएगा। – ant2009

+0

क्या आप डीपी को पिक्सेल में परिवर्तित कर रहे हैं, या चौड़ाई PX-160 प्रत्येक डिवाइस पर चौड़ाई की गणना के लिए अभिव्यक्ति है? – Piyush

उत्तर

7

आपको इच्छित प्रभाव प्राप्त करने के लिए translationX और translationY गुणों का उपयोग करने में सक्षम होना चाहिए। ये गुण दृश्य के मूल एक्स और वाई निर्देशांक से ऑफ़सेट के रूप में कार्य करते हैं।

अनिवार्य रूप से translX एक सकारात्मक मूल्य के लिए दाईं ओर एक दृश्य को विस्थापित करेगा और इसके एक्स समन्वय से नकारात्मक मान के लिए छोड़ा जाएगा। इसी प्रकार अनुवाद वाई इसके समन्वय से सकारात्मक मूल्यों के लिए सकारात्मक और शीर्ष के लिए नीचे की ओर दृश्य को विस्थापित करता है।

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

खोज आइकन के लिए मेरा सुझाव है कि आप इसे टूलबार के ऊपरी बाएं कोने में रखकर शुरू करें। फिर अनुवाद और अनुवाद दोनों को 20p पर सेट करें। उस खोज आइकन को आपकी छवि के समान स्थान पर रखना चाहिए। अपने खोज आइकन को ऊपरी बाईं ओर ले जाने के लिए आपको केवल 20 डीपी से 0 डीपी तक अनुवाद 0xवाई एनिमेट करना है।

सेटिंग्स आइकन के लिए इसे दोहराएं, लेकिन अनुवाद एक्स को -20 डीपी और अनुवाद 20 डीपी पर सेट करें। इस तरह यह आपकी छवि के समान स्थिति में रखा जाएगा। अपनी वांछित एनीमेशन प्राप्त करने के लिए दोनों मानों को 0 पर एनिमेट करें।

यहां संदर्भ के लिए एनीमेशन कोड है।

ivSearch.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .translationX(0) // Takes value in pixels. From 20dp to 0dp 
    .translationY(0) // Takes value in pixels. From 20dp to 0dp 
    .setDuration(250) 
    .start(); 

ivSettings.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .translationX(0) // Takes value in pixels. From -20dp to 0dp 
    .translationY(0) // Takes value in pixels. From 20dp to 0dp 
    .setDuration(250) 
    .start(); 

// To get pixels from dp 
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()); 

इस दृष्टिकोण के बारे में सबसे अच्छी बात यह है कि अब आपको माता-पिता के आयामों को जानने की आवश्यकता नहीं है। आप जिस पर ध्यान रखते हैं वह ऑफसेट है जिसे आपने translationX और translationY के माध्यम से निर्दिष्ट किया है।

5

के लिए बहुत-बहुत धन्यवाद मेरा मानना ​​है कि समस्या यह है कि एनिमेटर तरीकों मूल्यों की उम्मीद कर रहे अपरिष्कृत पिक्सेल मूल्यों में हो रहा है। ऐसा लगता है कि कोड केवल तभी काम करेगा जब आप मध्यम घनत्व स्क्रीन पर आना चाहते हैं। जैसे एक एचडीपीआई स्क्रीन को उसी स्थान पर 20px के बजाय 30px की आवश्यकता होगी। उच्च घनत्व स्क्रीन पर कोड मौजूद होने पर आइकन को किनारों के करीब धक्का देगा ...

इसका मतलब है कि हमें अपेक्षित डीपी मान को कच्चे पिक्सेल मानों में अनुवाद करने और एनीमेशन के लिए उन लोगों का उपयोग करने की आवश्यकता है। डीपी को पीएक्स में परिवर्तित करने के लिए एक आसान तरीका है ताकि यह हर डिवाइस पर सही हो। मुझे लगता है कि आप गियर के बाईं तरफ दाएं से 160 डीपी होना चाहते हैं (नोट मैं विशेष रूप से गियर के बाईं ओर कह रहा हूं क्योंकि 160 डीपी मान में गियर छवि की चौड़ाई भी शामिल होनी चाहिए क्योंकि एक्स प्रॉपर्टी है छवि के बाईं ओर से)। तो 160 डीपी = गियर छवि चौड़ाई + वांछित सही मार्जिन दूरी। कहें कि आपके पास ic_gear नामक संसाधन है: ड्रायबल ड्रायबल = getResources()। GetDrawable (R.drawable.ic_gear); फ्लोट बिटमैपविड्थ = getIntrinsicWidth();

float rawPX20DPValue = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()); 

float rawPXLeftOffset = rawPX20DPValue + bitmapWidth; 

ivSearch.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .x(rawPX20DPValue) 
    .y(rawPX20DPValue) 
    .setDuration(250) 
    .start(); 


ivSettings.animate() 
    .setInterpolator(new AccelerateInterpolator()) 
    .x(widthPx - rawPXLeftOffset) 
    .y(rawPX20DPValue) 
    .setDuration(250) 
    .start(); 

इसके अलावा इस कदम से पहले गियर और खोजें आइकन की ऑफसेट (गद्दी) पर जांच के रूप में संभावना है कि अंतिम परिणाम के रूप में अच्छी तरह से प्रभावित करेगा।

+0

160 मूल्य कुछ ऐसा था जो मैं बस के साथ खेल रहा था। जो मैं करने की कोशिश कर रहा हूं वह दोनों छवियों को एनिमेट कर रहा है ताकि बाईं ओर से एक टूलबार के बाईं ओर से 20 डीपी होगा, और दाईं ओर से एक टूलबार के दाईं ओर से 20 डीपी होगा। दाईं ओर से, मैं जो करने की कोशिश कर रहा था वह टूलबार की कुल चौड़ाई की गणना करता है और फिर दाएं मार्जिन से 20 डीपी बनाने के लिए एक मान घटाता है। मुझे आशा है कि अब आप और समझेंगे। धन्यवाद। – ant2009

+0

@ ant2009 मैंने आपको छवि आकार के लिए गणना देने के लिए इसे अपडेट किया है। ध्यान दें कि यदि आपके पास ImageView पर पैडिंग है तो आपको इसे गणना में भी जोड़ना होगा। अगर आपको और मदद की ज़रूरत है तो मुझे बताएं :) –

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