2012-05-04 10 views
5

में बिटमैप के साथ-साथ घूर्णन, अनुवाद, और स्केलिंग मैं एक तस्वीर दिखाने की कोशिश कर रहा हूं, जिसे ज़ूम और पैन किया जा सकता है, और यह एक कंपास पढ़ने के साथ घूमता है। नीचे दिए गए कोड के साथ, सभी तीन कार्य एक तरह का काम करते हैं, लेकिन वे एक-दूसरे को प्रभावित करते हैं।
1. घुमाएँ स्क्रीन के केंद्र के चारों ओर
2. स्केल केंद्र में चित्र के एक ही हिस्से छोड़ने
3. पैन चित्र में वांछित जगह पर:एंड्रॉइड कैनवास

यहाँ मैं क्या हासिल करना चाहते है

यहाँ क्या वास्तव में नीचे दिए गए कोड के साथ हो रहा है: के रूप में इरादा
1. रोटेशन काम करता है, स्क्रीन
2. स्केलिंग कार्यों के केंद्र के चारों ओर है, लेकिन यह तस्वीर का केंद्र के चारों ओर मापता
3. अनुवाद केवल तभी angle शून्य है इरादा के रूप में है, अन्यथा यह एक गलत दिशा

// the center of the view port 
float centerX = screen.right/2; 
float centerY = screen.bottom/2; 

Matrix m = new Matrix(); 
m.preRotate(angle, centerX, centerY); 
m.preScale(mScaleFactor, mScaleFactor, centerX, centerY); 

// scaling the amount of translation, 
// rotating the translation here gave crazy results 
float x = mPosX/mScaleFactor; 
float y = mPosY/mScaleFactor; 
m.preTranslate(x, y); 

canvas.drawBitmap(pic, m, null); 

में आगे बढ़ रहा है, तो मैं पहली बार का अनुवाद, और बाद में बारी बारी से काम करता है, अनुवाद के रूप में इरादा काम करता है लेकिन रोटेशन के केंद्र के चारों ओर नहीं है दृश्य पोर्ट अब और।

मैं तीनों परिवर्तनों को कैसे लागू कर सकता हूं, उनके बिना एक दूसरे को प्रभावित कर सकता हूं?

उत्तर

1

मुझे छवि के केंद्र के चारों ओर स्केलिंग के बारे में निश्चित नहीं है, लेकिन अनुवाद के लिए गलत दिशा में होने के कारण यह छवि को घूर्णन करने के परिणामस्वरूप नहीं बल्कि अनुवादों के परिणामस्वरूप है?

float x = (mPosX*(cos(angle) + sin(angle))/mScaleFactor; 
float y = (mPosY*(cos(angle) - sin(angle))/mScaleFactor; 
m.preTranslate(x, y); 

इसके अलावा मैट्रिक्स वस्तु सीधे एक affine transformation लागू करने के लिए एक विधि है करता है: हो सकता है कुछ इस तरह की कोशिश? क्योंकि तब आपको संचालन के आदेश के बारे में सोचना नहीं होगा।

affine परिवर्तन कुछ इस तरह दिख सकता है:

M = |mScaleFactor*cos(angle)  sin(angle)   x| 
    |  -sin(angle)   mScaleFactor*cos(angle) y| 
    |   0       0    1| 

लेकिन इस छवि के कोने के चारों ओर घूमने ताकि आप तो जैसे पहले preTranslate() फ़ंक्शन का उपयोग करने की आवश्यकता होगी:

Mt.preTranslate(-centerX,-centerY); 

और एम को लागू करने से पहले तस्वीर को लागू करने के लिए लागू करें और उसके बाद आपको आवेदन करने की आवश्यकता के बाद -0t

+0

अनुवाद घूर्णन केवल घूर्णन को ऑफ़सेट करने के लिए प्रतीत होता है, लेकिन मुझे यह भी महसूस होता है कि मैं यही हूं घ। एंड्रॉइड मैट्रिस 3x3 हैं, तो मुझे लगता है कि वे पहले से ही एफ़िन ट्रांसफॉर्मेशन हैं? – modemuser

+0

तो शायद उन प्रीरोटेट, प्रीस्केल विधियों का उपयोग करने के बजाय मैट्रिक्स को सीधे सेट करने का प्रयास करें? तो आपका मैट्रिक्स – Dan

+0

से ऊपर की पोस्ट में संपादन जैसा कुछ होना चाहिए, इस मैट्रिक्स के साथ, पैनिंग काम करता है, लेकिन स्केलिंग भी तस्वीर को घुमाता है, रोटेशन तस्वीर को भी स्केल करता है, और रोटेशन तस्वीर के कोने के आसपास होता है। यह व्हाक-ए-मोल की तरह है, लेकिन आपके इनपुट के लिए धन्यवाद। – modemuser

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

  • कोई संबंधित समस्या नहीं^_^