0

Je suis un débutant à ce sujet, alors ours avec moi.Comment créer une animation impressionnante bitmap sur Android

J'ai une image bitmap, et je veux l'animer par programme.

Je veux avoir l'animation du logo dans la vidéo "Nation Indie"

https://www.youtube.com/watch?v=yRU2rU2k_NI

Passer à aimer 00:20 voir.

De toute façon, voici ce que je comprends que je dois faire. Corrigez-moi si je me trompe.

  1. Appliquer mise à l'échelle pour le zoom avant et arrière
  2. Appliquer des transformations pour déplacer légèrement autour

Je prévois de faire un objet, une méthode

public void draw(Canvas canvas) 

qui jouer avec le bitmap.

De même, ai-je besoin d'utiliser une matrice, ou est-ce suffisant pour modifier le canevas directement?

Merci d'avance!

Répondre

1
  1. Appliquer échelle pour agrandir et réduire
  2. Appliquer des transformations pour déplacer légèrement autour

Oui, votre interprétation est correcte.

Vous pouvez utiliser une matrice pour obtenir le résultat attendu comme indiqué ci-dessous.

public class LogoView extends View { 
    public LogoView(Context context) { 
     super(context); 
     init(); 
    } 

    public LogoView(Context context, @Nullable AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public LogoView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    private void init() { 
     logo = BitmapFactory.decodeResource(getResources(), R.drawable.logo); 
     logoLeft = -logo.getWidth() >> 1; 
     logTop = -logo.getHeight() >> 1; 
     matrix = new Matrix(); 
    } 

    private Bitmap logo; 
    private Matrix matrix; 
    private float logoLeft, logTop; 

    private float SCALE_FACTOR = 0.07f; 
    private float TRANSLATE_FACTOR = 0.03f; 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     matrix.reset(); 
     matrix.setTranslate(getWidth() >> 1, getHeight() >> 1); 
     canvas.setMatrix(matrix); 
     float scaleFactor = (float) (Math.random() * SCALE_FACTOR) + 1.f; 
     canvas.scale(scaleFactor, scaleFactor); 
     float dx = (float) ((Math.random() - 0.5) * TRANSLATE_FACTOR) * logo.getWidth(); 
     float dy = (float) ((Math.random() - 0.5) * TRANSLATE_FACTOR) * logo.getHeight(); 
     canvas.translate(dx, dy); 
     canvas.drawBitmap(logo, logoLeft, logTop, null); 
     postInvalidateDelayed(150); 
    } 
}