Применить анимацию к Drawable в Android

Я добавляю эффект анимации свечения к логотипу. До сих пор мне удавалось получить изображение свечения за логотипом с помощью LayeredDrawable, но я не могу понять, как его анимировать. Я обнаружил, что AlphaAnimation может достичь желаемого эффекта, но, к сожалению, я могу применить его только к Views, а не к Drawables. Как я могу добиться этого эффекта?


person Casebash    schedule 25.05.2010    source источник


Ответы (4)


В Android 3.0 появилась анимация свойств.

К сожалению, это ограничено Android 3.0 и более поздними версиями, которые не появятся на телефонах в ближайшее время.

person Jeremy Edwards    schedule 22.05.2011

Простой пример

final ImageView imageView = (ImageView) findViewById(R.id.animatedImage);
final Button animated = (Button) findViewById(R.id.animated);
animated.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Drawable drawable = imageView.getDrawable();
        if (drawable.getAlpha() == 0) {
            ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(drawable, PropertyValuesHolder.ofInt("alpha", 255));
            animator.setTarget(drawable);
            animator.setDuration(2000);
            animator.start();
        } else {
            ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(drawable, PropertyValuesHolder.ofInt("alpha", 0));
            animator.setTarget(drawable);
            animator.setDuration(2000);
            animator.start();
        }
    }
});

Метод getAlpha() добавить в апи 19. Но это не большое ограничение, можно сохранять статус в локальную переменную. ObjectAnimator добавить в Android 3.0 (api 11), возможно, старую версию Android можно использовать nineoldandroids. Я не тестировал с девятью андроидами.

person AndreyNik    schedule 11.11.2014
comment
Это превосходно! Мне нужно анимировать только альфа-цвет фона, но не отображаемый значок на поверхности ImageView. Этот метод определенно помог. Спасибо. - person Nezneika; 14.04.2020

Спасибо @AndreyNick, это работает как шарм! Я также использовал его для LayerDrawable для анимации только одного Drawable (слоя). Вот код, может кому пригодится:

Drawable[] layers = new Drawable[2];
layers[0] = new ColorDrawable(Color.RED);
BitmapDrawable bd = new BitmapDrawable(activity.getResources(), bitmap);
bd.setGravity(Gravity.CENTER);
Drawable drawLogo = bd;
layers[1] = drawLogo;
LayerDrawable layerDrawable = new LayerDrawable(layers);

layers[1].setAlpha(0);

((AppCompatActivity) activity).getSupportActionBar().setBackgroundDrawable(layerDrawable);

ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(layers[1], PropertyValuesHolder.ofInt("alpha", 255));
animator.setTarget(layers[1]);
animator.setDuration(2000);
animator.start();

Мне нужно было создать рисунок для панели действий с помощью:

  • слой (0), который является фоновым цветом и
  • слой (1) с логотипом посередине (с анимацией затухания)

Я загружаю логотип с помощью Picasso, и мне нравится анимировать его, когда он загружен (обратный вызов растрового изображения onBitmapLoaded).

Я надеюсь, что это может помочь!

person Spettacolo83    schedule 17.04.2018

Я использую анимацию в ImageView, отображающую рисуемый объект. Я думаю, что это должно быть возможно и в вашем случае.

person Janusz    schedule 25.05.2010
comment
К сожалению, многоуровневое рисование, похоже, создает один ImageView. Итак, если бы я применил альфа-анимацию, то она бы применялась как к логотипу, так и к свечению. - person Casebash; 26.05.2010