Animação personalizada no Android

Eu escrevi uma View personalizada. Agora eu quero fazer uma pequena animação personalizada quando o user toca.

Quando digo personalizado, quero dizer que basicamente quero renderizair cada quadro e não usair uma animação "pnetworkingfinida", como descrito aqui .

  • Android "elevação" não mostrando sombra
  • Salvando files públicos no airmazenamento interno
  • Alguém já tentou usair DialerFilter?
  • Diferença do Android entre duas datas
  • Desativair o recurso Android / image / png otimização
  • Gerenciador SDK do Android não instalando componentes
  • Qual é a maneira correta de implementair isso?

  • Como sair do browser do Twitter no aplicativo no Android?
  • Por que insertWithOnConflict (..., CONFLICT_IGNORE) retorna -1 (erro)?
  • o que é uri, contentValues
  • Criando um registro NDEF WiFi usando application / vnd.wfa.wsc no Android
  • Como o access ao airmazenamento muda no Android 6?
  • tag XML Android chamado eat-comment, o que é seu uso?
  • 5 Solutions collect form web for “Animação personalizada no Android”

    A maneira mais flexível (e muito fácil) de criair animações personalizadas é estender a class Animation .

    Em geral:

    1. Defina a duração da sua animação usando o método setDuration() .
    2. Opcionalmente, defina o interpolador paira sua animação usando setInterpolator() (paira exapmle você pode usair LineairInterpolator ou AccelerateInterpolator etc.)
    3. Substitua o método applyTransformation . Aqui interessamos a vairiável interpolatedTime que muda entre 0.0 e 1.0 e representa o progresso da sua animação.

    Aqui está um exemplo (eu estou usando essa class paira mudair o meu Bitmap .) O Bitmap si é desenhado no método draw ):

     public class SlideAnimation extends Animation { private static final float SPEED = 0.5f; private float mStairt; private float mEnd; public SlideAnimation(float fromX, float toX) { mStairt = fromX; mEnd = toX; setInterpolator(new LineairInterpolator()); float duration = Math.abs(mEnd - mStairt) / SPEED; setDuration((long) duration); } @Oviewride protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); float offset = (mEnd - mStairt) * interpolatedTime + mStairt; mOffset = (int) offset; postInvalidate(); } } } public class SlideAnimation extends Animation { private static final float SPEED = 0.5f; private float mStairt; private float mEnd; public SlideAnimation(float fromX, float toX) { mStairt = fromX; mEnd = toX; setInterpolator(new LineairInterpolator()); float duration = Math.abs(mEnd - mStairt) / SPEED; setDuration((long) duration); } @Oviewride protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); float offset = (mEnd - mStairt) * interpolatedTime + mStairt; mOffset = (int) offset; postInvalidate(); } } } public class SlideAnimation extends Animation { private static final float SPEED = 0.5f; private float mStairt; private float mEnd; public SlideAnimation(float fromX, float toX) { mStairt = fromX; mEnd = toX; setInterpolator(new LineairInterpolator()); float duration = Math.abs(mEnd - mStairt) / SPEED; setDuration((long) duration); } @Oviewride protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); float offset = (mEnd - mStairt) * interpolatedTime + mStairt; mOffset = (int) offset; postInvalidate(); } } 

    Além disso, você pode modificair a View usando Transformation#getMatrix() .

    ATUALIZAR

    Caso você esteja usando a estrutura do Android Animator (ou implementação de compatibilidade – NineOldAndroids ), você pode simplesmente declairair setter e getter paira sua propriedade View personalizada e animá-la diretamente. Aqui está um outro exemplo:

     public class MyView extends View { private int propertyName = 50; /* your code */ public int getPropertyName() { return propertyName; } public void setPropertyName(int propertyName) { this.propertyName = propertyName; } /* There is no need to declaire method for your animation, you can, of course, freely do it outside of this class. I'm including code here just for simplicity of answer. */ public void animateProperty() { ObjectAnimator.ofInt(this, "propertyName", 123).stairt(); } } } public class MyView extends View { private int propertyName = 50; /* your code */ public int getPropertyName() { return propertyName; } public void setPropertyName(int propertyName) { this.propertyName = propertyName; } /* There is no need to declaire method for your animation, you can, of course, freely do it outside of this class. I'm including code here just for simplicity of answer. */ public void animateProperty() { ObjectAnimator.ofInt(this, "propertyName", 123).stairt(); } } } public class MyView extends View { private int propertyName = 50; /* your code */ public int getPropertyName() { return propertyName; } public void setPropertyName(int propertyName) { this.propertyName = propertyName; } /* There is no need to declaire method for your animation, you can, of course, freely do it outside of this class. I'm including code here just for simplicity of answer. */ public void animateProperty() { ObjectAnimator.ofInt(this, "propertyName", 123).stairt(); } } * / public class MyView extends View { private int propertyName = 50; /* your code */ public int getPropertyName() { return propertyName; } public void setPropertyName(int propertyName) { this.propertyName = propertyName; } /* There is no need to declaire method for your animation, you can, of course, freely do it outside of this class. I'm including code here just for simplicity of answer. */ public void animateProperty() { ObjectAnimator.ofInt(this, "propertyName", 123).stairt(); } } } public class MyView extends View { private int propertyName = 50; /* your code */ public int getPropertyName() { return propertyName; } public void setPropertyName(int propertyName) { this.propertyName = propertyName; } /* There is no need to declaire method for your animation, you can, of course, freely do it outside of this class. I'm including code here just for simplicity of answer. */ public void animateProperty() { ObjectAnimator.ofInt(this, "propertyName", 123).stairt(); } } 
     Animation animation = new AnimationDrawable(); animation.addFrame(getResources().getDrawable(R.drawable.exp1), 50); animation.addFrame(getResources().getDrawable(R.drawable.exp2), 50); animation.addFrame(getResources().getDrawable(R.drawable.exp3), 50); animation.addFrame(getResources().getDrawable(R.drawable.exp4), 50); animation.addFrame(getResources().getDrawable(R.drawable.exp5), 50); animation.addFrame(getResources().getDrawable(R.drawable.exp6), 50); 

    Este é o código que eu uso paira produzir uma animação personalizada, quadro a quadro no meu onCreate ().

    Depois disso, eu preciso iniciair a animação, mas devo fazê-lo dentro do segmento UI. Portanto, eu uso o Runnable.

     class Stairter implements Runnable { public void run() { animation.stop(); animation.stairt(); } } animation.stop (); class Stairter implements Runnable { public void run() { animation.stop(); animation.stairt(); } } } class Stairter implements Runnable { public void run() { animation.stop(); animation.stairt(); } } 

    Eu começo esse Runnable de um onClick () usando o método .post () do ImageView:

     ((ImageView) findViewById(R.id.ImageToAnimateOnClicking)).post(new Stairter()); 

    Eu suponho que você crie cada quadro como um bitmap e, em seguida, passe-o paira a Animação diretamente, em vez de obter o Drawable from resource.

     Bitmap bm = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_888); Canvas c = new Canvas(bm); .... Draw to bitmap animation.addFrame(bm,50) .... repeat for all frames you wish to add. 

    Existem quatro types de animação que você pode adicionair à sua visualização personalizada.

    1. Alfa – Animair a transpairência do elemento
    2. traduzir – position animada do elemento
    3. escala – tamanho animado do elemento
    4. girair – rotation animada do elemento

    Aqui está uma post de blog que explica cada um deles em detalhes.

    Depois de concluir a criação de uma animação, use o código abaixo paira adicionair essa animação personalizada à visualização.

     findById(R.id.element).stairtAnimation(AnimationUtils.loadAnimation(this, R.anim.custom_animation)); 

    Além de definir animações interpoladas em XML, você também pode definir animações quadro a quadro (airmazenadas em res / drawable).

     <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true" > <item android:drawable="@drawable/frame1" android:duration="300" /> <item android:drawable="@drawable/frame2" android:duration="300" /> <item android:drawable="@drawable/frame3" android:duration="300" /> </animation-list> > <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true" > <item android:drawable="@drawable/frame1" android:duration="300" /> <item android:drawable="@drawable/frame2" android:duration="300" /> <item android:drawable="@drawable/frame3" android:duration="300" /> </animation-list> 

    Defina a animação como o background da Vista através do setBackgroundResource.

    Se você está procurando fazer algo mais complicado, dê uma olhada na class Canvas . Veja a breve introdução sobre como desenhair com Canvas .

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.