2010-11-15 3 views
1

Надеюсь, это непросто, потому что я старался изо всех сил избавиться от этого.Проблема с Android с поворотом изображения и матрицей

Я делаю приложение для Android, которое включает в себя анимацию часов. У меня все хорошо работает, кроме одного очень раздражающего.

У меня есть секундная стрелка на часах, и я использую следующий код, чтобы повернуть его вокруг центральной точки второй руки. Как вы, вероятно, заметите, что я пытаюсь сделать это похожим на аналоговую секундную стрелку, поэтому он подметает вместо того, чтобы просто тикать.

 public float secdegrees, secondwidth, secondheight; 

     secondMatrix = new Matrix(); 
     secondwidth = secondHand.getWidth(); 
     secondheight = secondHand.getHeight(); 
     secdegrees = anglepersec * secnow; 
     secdegrees += anglepluspermilli * millis; 
     secondMatrix.setRotate(secdegrees, secondwidth/2, secondheight/2); 
     newSecond = Bitmap.createBitmap(secondHand, 0, 0, 
       (int) secondwidth, (int) secondheight, secondMatrix, true); 
     c.drawBitmap(newSecond, (centrex - newSecond.getWidth()/2), 
       ((face.getHeight()/2) - newSecond.getHeight()/2), null); 

На самом деле это действительно то, что я хочу ... почти.

Проблема заключается в том, что рука слегка дрожит вокруг центральной точки, но она действительно заметна и действительно портит эстетику.

Я почти подозреваю, что это так, что он округляет значение поплавка, но я надеялся, что кто-то испытал это раньше и имел какие-то идеи о том, как избавиться от него.

Для справки изображение второй руки первоначально было 74 px x 28 px и является (в настоящее время) 74 x 74 пикселя .png с серединой второй руки, точно пересекающей точку пересечения. Я также попытался сделать это 75 х 75, так что на самом деле есть центральный пиксель, но не повезло.

Любая помощь вообще будет оценена по достоинству.

** UPDATE

Я попытался изменить код в случае десятые не становились упал, но все-таки не повезло, я боюсь. Вот вариант 2, с которым я пытался и не смог;

 secondMatrix = new Matrix(); 
     secondwidth = secondHand.getWidth(); 
     secondheight = secondHand.getHeight(); 
     secdegrees = anglepersec * secnow; 
     secdegrees += anglepluspermilli * millis; 
     secondMatrix.setRotate(secdegrees, secondwidth/2, secondheight/2); 
     newSecond = Bitmap.createBitmap(secondHand, 0, 0, (int) secondwidth, 
       (int) secondheight, secondMatrix, true); 
     float secW = newSecond.getWidth()/2; 
     float secH = newSecond.getHeight()/2; 

     // NEW CODE HERE 
     float calcdeg = secdegrees % 90; 
     calcdeg = (float) Math.toRadians(calcdeg); 
     float NegY = (float) ((secondwidth*Math.cos(calcdeg)) + 
      (secondwidth * Math.sin(calcdeg))); 
     c.drawBitmap(newSecond, centrex - NegY/2, 
       ((face.getHeight()/2) - NegY/2), null); 
+0

Являются ли secondwidth и secondhight плавает или ints? –

+0

Они плавают. Я обновил код выше. – Dean

+0

Я думаю, что этот вопрос является дубликатом http://stackoverflow.com/q/3603646/94363 – rds

ответ

-1

Я понимаю вашу проблему, я никогда не сталкивался с ней mysleft, но это звучит довольно очевидно для меня. Поскольку вращения изменяют ширину и высоту изображения, ваша Неточность приходит от centrex - NegX/2

Я не проверял, но я предлагаю вам попробовать:

Matrix matrix=new Matrix() 
//first translate to place the center of the hand at Point(0,0) 
matrix.setTranslate(-secondWidth/2,-secondHeight/2); 
matrix.setRotate(secdegrees); 
//now place the pivot Point(0,0) at its expected location 
matrix.setTranslate(centreX,centreY); 
newSecond = Bitmap.createBitmap(secondHand, 0, 0, secondWidth, secondHeight, matrix, false); 
c.drawBitmap(newSecond,0,0,null); 

Конечно, это не является оптимальным, так как растровые newSecond намного больше, чем нужно на самом деле. Поэтому, если ваши centrex и centrey большие, вы можете перевести меньше, чем это, а затем рисовать с переводом разницы.

//now place the pivot to a position where the hand can be fully drawn without imprecion on the future location of Point(0,0) 
matrix.setTranslate(secondWith,secondHeight); 
newSecond = Bitmap.createBitmap(secondHand, 0, 0, secondWidth, secondHeight, matrix, false); 
c.drawBitmap(newSecond,centrex-secondWidth,centrey-secondHeight,null); 

Надеюсь, это поможет.

+0

Спасибо за подробную обратную связь. Я попробую это решение и вернусь к вам. – Dean