2010-10-07 12 views
10

मैं छवियों के साथ एक गैलरी बनाना चाहता था। गैलरी के भीतर छवियों को ज़ूम करने योग्य और पैनबल होना चाहिए। मैं एक छवि चुटकी-ज़ूम करने में सक्षम हो सकता था लेकिन ज़ूम सीमा निर्धारित करने में सक्षम नहीं था और छवि को स्क्रीन से पंसद होने से रोक नहीं पाया। http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5ImageView पिंच-ज़ूम स्केल सीमाएं और पैन सीमा

पहले दृष्टिकोण: मैं एक छवि ज़ूम करने के लिए निम्नलिखित कोड का इस्तेमाल किया मैं TouchImageView इस्तेमाल किया गैलरी में चित्र की आपूर्ति करने, यह मेरे ज़ूम पिंच करने के लिए लेकिन गैलरी स्क्रॉल नहीं कर सकते हैं अनुमति देता है। यानी मैं 'सिंगल टैब इवेंट' और 'टैब टू स्क्रॉल इवेंट' के बीच अंतर नहीं कर सकता।

दूसरा दृष्टिकोण: गैलरी में छवियों की आपूर्ति करने के लिए प्रयुक्त छवि दृश्य, और यदि उपयोगकर्ता किसी गैलरी आइटम पर क्लिक करता है तो चयनित छवि को TouchImageView में प्रदर्शित करें, जहां उपयोगकर्ता छवि को पिन-ज़ूम कर सकता है। लेकिन यह मुझे गैलरी दृश्य को स्क्रॉल करने से भी रोकता है। और चयनित छवि पर ज़ूम सीमाएं और पैन सीमाएं कैसे सेट करें?

उत्तर

3

आप ACTION_MOVE में ये पंक्तियां जोड़कर जूम सीमा निर्धारित कर सकते मोड == ज़ूम:

float[] f = new float[9]; 
matrix.getValues(f); 

float scaleX = f[Matrix.MSCALE_X]; 
float scaleY = f[Matrix.MSCALE_Y]; 
if (scaleX > MAX_SCALE || scaleY > MAX_SCALE) return true; 

इसी तरह, ACTION_MOVE को पंक्तियां जोड़ते हैं मोड == खींचें उस खाते में अपनी छवि का वास्तविक स्थान लेता है, अनुवादित लंबाई, और फिर उन्हें सीमाओं की तुलना करें।

+0

आप सही विचार है बुला 'matrix.getValues ​​(च);'। हालांकि, समाधान सही नहीं है, क्योंकि यह स्क्रीन को फ्रीज कर देगा। इसके बजाय यदि स्केलिंग मान MAX_SCALE को पार करने वाला है, तो MAX_SCALE के बराबर स्केलिंग मान सेट करें। इस विधि का उपयोग कर पूर्ण कार्यान्वयन के लिए नीचे मेरा उत्तर देखें। –

2

मैंने उत्तर here प्रदान किया जो छवि दृश्य में पैनिंग, ज़ूम और सीमा का पता लगाता है।

20

यह मेरे लिए ज़ूम-सीमा समस्या तय करता है। छवि को सीमा में ज़ूम आउट/आउट करने के बाद, यह आगे बढ़ने से रोकता है। यह भी चिकनी है और कोई लेट नहीं है। 0.7 और 2.0 न्यूनतम और अधिकतम ज़ूम स्तर हैं।

.... 
} else if (mode == ZOOM) { 
    float[] f = new float[9]; 

    float newDist = spacing(event); 
    if (newDist > 10f) { 
      matrix.set(savedMatrix); 
      float tScale = newDist/dist; 
      matrix.postScale(tScale, tScale, mid.x, mid.y); 
    } 

    matrix.getValues(f); 
    float scaleX = f[Matrix.MSCALE_X]; 
    float scaleY = f[Matrix.MSCALE_Y]; 

    if(scaleX <= 0.7f) { 
      matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); 
    } else if(scaleX >= 2.5f) { 
      matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 
    } 
} 
....   
+1

तुम मेरे दिन प्रिय बचाओ! जवाब स्वीकार किया जाना चाहिए! –

3

नीचे इस कोड का उपयोग करने की कोशिश की और हालांकि यह काम करता है मैंने पाया कि यह ट्रांस एक्स और ट्रांस Y चित्र के लिए अग्रणी धीरे-धीरे बंद स्क्रीन बढ़ने में जमा करने के लिए छोटे वृद्धिशील मान पैदा कर रहा था।

if(scaleX <= 0.7f) 
      matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); 
    else if(scaleX >= 2.5f) 
      matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 

मैं तय यह एक नाव [] (1,0,0,0,1,0,0,0,1) में एक मूल मैट्रिक्स भंडारण किया और मैट्रिक्स इन मूल्यों को वापस रीसेट करने के लिए जब भी scaleX < 1. आशा इस मदद करता है किसी और एक दिन :)

if(scaleX <= 1.0f) {         
    float[] originalmatrixvalues = new float[] {1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f}; 
    matrix.setValues(originalmatrixvalues); 
} else if(scaleX >= 2.5f) { 
    matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 
} 
संबंधित मुद्दे