2012-04-02 20 views
10

Potrzebuję utworzyć kompas w aplikacji, nad którą pracuję. Tak więc próbowałem stworzyć nowy widok o nazwie CompassView, który zasadniczo rozszerza widok obrazu, pokazuje mapę bitową, która wskazuje na wschód zachód na północy wskazał na nią, wykorzystuje czujniki, aby znaleźć stopnie wskazane przez telefon, i obrócić obraz odpowiednio, aby utworzyć rzeczywisty kompas. Ale problem polega na tym, że jeśli próbuję obrócić obraz pod pewnymi kątami, na przykład pod kątem 45 stopni, kurczy się. Oto kilka obrazków, aby lepiej to wyjaśnić.Obracanie obrazu bez obkurczania w systemie Android

This is normal

This is shrinked

Jak widać, drugi obraz jest shrinked dół gdy próbuję obrócić Co chcę to zrobić około 45. to: this

Oto kod, którego aktualnie używam:

 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); 

Każda pomoc będzie doceniona zmiażdżony. THanks

EDIT: (roztwór) I wreszcie to działa dzięki przyjętym odpowiedź. Oto kod używam dla każdego, kto chce wiedzieć, jak to działa:

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); 

Odpowiedz

4

Możesz użyć alternatywnej sztuczki, która działa tak samo, jak obracanie i nie zmienia rozmiaru obrazu. Obracam obraz z kątem 45 stopni i pozostawiam zmiany po animacji.

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

dziękuję, nie wiedziałem, że to może być acheived od rotateanimation. musiałem tylko zmodyfikować niektóre części kodu, aby działało – KSubedi

3

Problem jest, że nowy obraz jest rzeczywiście większa, ze względu na rogach źródła „wystających”, a więc Widok polega na skalowaniu go do rozmiaru.

kilka możliwych podejść:

  1. Po powyższym kodzie, nazywają Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height), kopiowanie środkowym obszarze właściwej wielkości. Łatwy ze względu na kod, ale tworzy bezużyteczną pośrednią bitmapę.

  2. Zamiast podawać obraz transformacji i obrazu źródłowego w celu utworzenia mapy Bitmap, wystarczy utworzyć zmienną mapę bitową o prawidłowym rozmiarze, zawinąć ją w płótno i powiedzieć płótnie, aby wyrenderować obrócone zdjęcie.

    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. przechowywać kodu masz, ale powiedz pogląd przyciąć zamiast skali podczas renderowania.

+0

dzięki za poinformowanie mnie sposoby .. Wiedziałem, że mój alternatyw, ale po prostu nie wiedziała, jak je realizować, ponieważ jestem nowy na płótnie i widoków niestandardowych – KSubedi

Powiązane problemy