Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Inclinar un mapa de bits sólo en la dirección vertical

Quiero desviar (corregirme si esta no es la palabra correcta) un mapa de bits para que aparezca tener profundidad. Una buena manera de visualizar lo que estoy pidiendo es cómo los créditos de Star Wars están en ángulo para mostrar profundidad.

He intentado lo siguiente:

canvas.getMatrix().postSkew(kx,ky,px,py); 

y

 canvas.skew(sx,sy); 

Pero no he tenido mucho éxito. Los métodos anteriores parecen transformar siempre el mapa de bits en un paralelogramo. ¿Hay una manera de transformar el mapa de bits en un trapezoide en su lugar?

He aquí un fragmento de código que tomé de los ejemplos que Romain me señaló.

 canvas.rotate(-mOrientation[0] + mHeading, mCenterX, mCenterY); camera.save(); if (mReverse) { camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime); } else { camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime)); } camera.rotateX(mOrientation[1]); camera.applyToCanvas(canvas); canvas.drawPath(mPath, mPaint); canvas.drawCircle(mCenterX, mCenterY, mRadius - 37, mPaint); camera.restore(); 

3 Solutions collect form web for “Inclinar un mapa de bits sólo en la dirección vertical”

No se puede lograr el efecto deseado con sesgo (). Sin embargo, puede utilizar un objeto Cámara y rotaciones 3D para lograr este efecto. La cámara generará una matriz para usted que puede aplicar en la lona. Tenga en cuenta que el resultado no será la perspectiva correcta, pero lo suficientemente bueno para su propósito. Así se hacen las rotaciones 3D en Honeycomb's Launcher, por ejemplo (y muchas otras aplicaciones).

Pasé mucho tiempo trabajando en esto hoy (corrió en el mismo problema) y subió con el código de abajo.

Clave a tener en cuenta, es necesario establecer preTranslate () y postTranslate () en el centro (o en otro lugar) de su área de la lona. Parece significar que utiliza el centro de la imagen para aplicar la transformación de, en lugar de la esquina superior izquierda (x = 0, y = 0) de forma predeterminada. Esta es la razón por la que obtendría un paralelogramo en lugar de lo que cabría esperar, un trapezoidal (Gracias por enseñarme los nombres de esos).

La otra cosa importante que he recogido es el Save / Restore funciones en la lona / cámara. Básicamente, si llama a las funciones Rotar consecutivamente tres veces sin restaurar el estado cada vez, mantendrá girando el objeto alrededor y alrededor cada vez que dibuje. Eso podría ser lo que quieres, pero no lo hice en mi caso. Lo mismo se aplica al lienzo, ya que básicamente se aplica la matriz desde el objeto de la cámara a la lona y necesita ser restablecido de lo contrario ocurre lo mismo.

Espero que esto ayude a alguien, esto no está bien documentado para principiantes. Consejo a cualquiera que lea esto, echa un vistazo a la carpeta APIDemos en las muestras de SDK. Hay un archivo Rotate3dAnimation.java que demuestra esto también.

 //Snippet from a function used to handle a draw mCanvas.save(); //save a 'clean' matrix that doesn't have any camera rotation in it's matrix ApplyMatrix(); //apply rotated matrix to canvas Draw(); //Does drawing mCanvas.restore(); //restore clean matrix // public void ApplyMatrix() { mCamera.save(); mCamera.rotateX(-66); mCamera.rotateY(0); mCamera.rotateZ(0); mCamera.getMatrix(mMatrix); int CenterX = mWidth / 2; int CenterY = mHeight / 2; mMatrix.preTranslate(-CenterX, -CenterY); //This is the key to getting the correct viewing perspective mMatrix.postTranslate(CenterX, CenterY); mCanvas.concat(mMatrix); mCamera.restore(); } 

No creo que el "efecto Star Wars" sea una transformación afín , que creo que son las únicas operaciones soportadas por Matrix .

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.