La réponse à votre question n'est pas vraiment spécifique à Android, c'est un des graphiques et mathématiques question. Il y a beaucoup de théorie dans cette réponse: vous avez été averti! Pour un superficiel réponse à votre question, passez à la partie inférieure. Aussi, parce que c'est un de longue haleine tirade, je pourrais avoir une faute de frappe ou deux de faire des choses pas claires. Je m'excuse d'avance si c'est le cas.
En infographie, on peut représenter les pixels (ou en 3D, des sommets) en tant que vecteurs. Si votre écran est de 640 x 480, voici un vecteur 2D pour le moment dans le milieu de votre écran (pardonnez ma mauvaise qualité de la majoration):
[320]
[240]
[ 1]
Je vais vous expliquer pourquoi le 1 est important plus tard. Les Transformations sont souvent représentés à l'aide de matrices , car il est alors très simple (et très efficace) à la chaîne d'ensemble, comme vous l'avez mentionné. À l'échelle du point ci-dessus par un facteur de 1,5, vous pouvez gauche de la multiplier par la matrice suivante:
[1.5 0 0]
[ 0 1.5 0]
[ 0 0 1]
Vous en recevrez un nouveau point:
[480]
[360]
[ 1]
Qui représente le point d'origine, mis à l'échelle par 1,5 par rapport à la coin de votre écran (0, 0). Ceci est important: mise à l'échelle est toujours fait dans le respect de l'origine. Si vous souhaitez mettre à l'échelle avec un autre point de votre centre (comme au milieu d'un sprite), vous devez "envelopper" l'ampleur dans les traductions vers et à partir de l'origine. Voici la matrice de traduire notre point d'origine à l'origine:
[1 0 -320]
[0 1 -240]
[0 0 1]
Ce qui donne:
[320*1 + 1*-320] [0]
[240*1 + 1*-240] = [0]
[ 1*1 ] [1]
Vous allez reconnaître ce qui précède que l' identité de la matrice avec le déplacement des coordonnées des claques dans le coin supérieur droit. C'est pourquoi le 1 (le "coordonnées homogènes") est nécessaire: pour faire de la place pour ces coordonnées, rendant ainsi possible de traduire à l'aide de la multiplication. Sinon il faudrait être représentée par la matrice de plus, ce qui est plus intuitif pour les humains, mais ferait cartes graphiques encore plus compliquées qu'elles ne le sont déjà.
Maintenant, la multiplication de matrice, généralement, n'est pas commutative, donc quand ", ajoutant que" d'une transformation (par multiplication de matrice), vous devez indiquer si vous êtes à multiplier à gauche ou à droite-se multiplient. La différence qu'il fait est ce que l'ordre de vos transformations sont enchaînés dans. Droit-en multipliant la matrice (à l'aide d' preRotate()
) vous êtes en indiquant que l'étape de rotation doit se passer avant toutes les autres transformations que vous avez simplement demandé. Cela pourrait être ce que vous voulez, mais il n'est généralement pas le cas.
Souvent, il n'a pas d'importance. Si vous avez seulement une transformation, par exemple, il n'a jamais de questions :) Parfois, votre transformations peut se produire dans l'ordre avec le même effet, comme le redimensionnement et la rotation--mon algèbre linéaire est rouillé, mais je crois que dans ce cas, la multiplication de matrice de la réalité est commutative, car l'ampleur de la matrice est symétrique, qui est, elle reflète elle-même sur la diagonale. Mais vraiment, il suffit de penser à ce sujet: Si je tourne une image de 10 degrés dans le sens horaire, puis une échelle de 200%, il semble le même que si je l'échelle d'abord, puis de tourner.
Si vous faisiez quelques plus étrange composé de transformations, vous feriez commencer à remarquer une différence. Mon conseil est de rester avec des postRotate()
.