2012-04-02 10 views
10

पर सिकुड़ने के बिना छवि को घुमाएं मुझे एक ऐप पर एक कंपास बनाने की ज़रूरत है जिस पर मैं काम कर रहा हूं। इसलिए मैंने कम्पासव्यू नामक एक नया दृश्य बनाने की कोशिश की जो मूल रूप से छविदृश्य को बढ़ाता है, एक बिटमैप दिखाता है जिसमें पूर्व पश्चिम उत्तर दक्षिण की ओर इशारा किया गया है, फोन की डिग्री की डिग्री खोजने के लिए सेंसर का उपयोग करता है, और तदनुसार छवि को घुमाता है ताकि वह बना सके एक वास्तविक कंपास। लेकिन समस्या यह है कि अगर मैं छवि को 45 डिग्री की तरह कुछ कोणों में घूमने की कोशिश करता हूं, तो यह नीचे गिर जाता है। यहां कुछ छवियां हैं जो इसे बेहतर समझाने के लिए हैं। thisएंड्रॉइड

यहाँ है:

This is normal

This is shrinked

आप देख सकते हैं, दूसरी छवि नीचे shrinked है जब मैं बारी बारी से करने की कोशिश के आसपास 45 क्या मैं इसे क्या करना चाहते हैं यह है कोड जो मैं वर्तमान में उपयोग कर रहा हूं:

 Bitmap bMap = BitmapFactory.decodeResource(getResources(), 
       R.drawable.compass); 
     Matrix xMatrix = new Matrix(); 
     xMatrix.reset(); 
     xMatrix.postRotate(360-mValue, 75, 75); //This is 75 because 150 is the image width 
     Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0, 
       bMap.getWidth(), bMap.getHeight(), xMatrix, true); 
     setImageBitmap(bMapRotate); 

किसी भी मदद की सराहना की जाएगी पैदा। धन्यवाद

संपादित करें: (समाधान) मुझे अंत में स्वीकार्य उत्तर के लिए धन्यवाद मिल रहा है।

RotateAnimation rAnimAntiClockWise = new RotateAnimation(
        360 - mValue, 360 - event.values[0], 
        Animation.RELATIVE_TO_SELF, 0.5f, 
        Animation.RELATIVE_TO_SELF, 0.5f); 
//mValue is the angle in degrees and i subtracted it from 360 to make it anticlockwise, and event.values[0] is the same thing as mValue 
rAnimAntiClockWise.setFillAfter(true); 
rAnimAntiClockWise.setInterpolator(new LinearInterpolator()); 
rAnimAntiClockWise.setDuration(0); 
startAnimation(rAnimAntiClockWise); 

उत्तर

4

आप एक वैकल्पिक चाल का उपयोग कर सकते हैं जो घुमाने के समान काम करेगा और छवि का आकार बदल नहीं पाएगा। मैं वास्तव में 45 डिग्री कोण के साथ छवि घुमाता हूं और एनीमेशन के बाद परिवर्तन करता हूं। दे मुझे तरीके पता के लिए

rAnimAntiClockWise = new RotateAnimation(0.0f, 45.0f, 
       Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 
       0.5f); 
     rAnimAntiClockWise.setFillAfter(true); 
     rAnimAntiClockWise.setInterpolator(new LinearInterpolator());  
      bitmap = BitmapFactory.decodeResource(getResources(), 
        R.drawable.rotate);  
     rAnimAntiClockWise.setDuration(100); 
     img_rotate.startAnimation(rAnimAntiClockWise); 
+0

बहुत बहुत शुक्रिया, मुझे नहीं पता था कि यह प्राप्त किया जा सकता है कैनवास और कस्टम दृश्य करने के लिए नया हूँ rotateanimation से। मुझे इसे काम करने के लिए कोड के कुछ हिस्सों को संशोधित करना पड़ा – KSubedi

3

मुद्दा यह है कि अपनी नई छवि स्रोत के कोनों "बाहर चिपके हुए" की वजह से, वास्तव में बड़ा है है, और इसलिए: यहाँ कोड मैं किसी को जो पता करने के लिए कि यह कैसे काम करना चाहता है के लिए उपयोग कर रहा हूँ है दृश्य फिट करने के लिए इसे नीचे स्केल कर रहा है।

कुछ संभव दृष्टिकोण:

  1. ऊपर कोड के बाद, फोन Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height), सही आकार के केंद्र क्षेत्र को कॉपी। आपके पास कोड दिया गया आसान है, लेकिन एक बेकार इंटरमीडिएट बिटमैप बनाता है।

  2. बिल्डमैप बनाने के लिए ट्रांसफॉर्म और स्रोत छवि देने के बजाय, सही आकार का एक म्यूटेबल बिटमैप बनाएं, इसे कैनवास में लपेटें, और कैनवास को घुमाए गए चित्र को प्रस्तुत करने के लिए कहें।

    bMapRotate = Bitmap.createBitmap(
        bMap.getWidth(), bMap.getHeight(), bMap.getConfig()); 
    Canvas canvasRotate = new Canvas(bMap); 
    canvasRotate.drawBitmap(bMap, xMatrix, paint); // any opaque Paint should do 
    
  3. कोड आपके पास रखें, लेकिन पैमाने बजाय क्रॉप करने के लिए जब प्रतिपादन दृश्य बताओ।

+0

धन्यवाद .. मैं अपने विकल्पों को पता था, लेकिन मैं सिर्फ पता था उन्हें लागू करने के बाद से मैं – KSubedi