@PK_D

Как сделать одинаковой скорость анимации на разных Android-устройствах?

Всем привет.

Подскажите, пожалуйста, как сделать анимацию одинаковой на разных Android-устройствах?

У меня есть TextView в форме круга, который надо плавно увеличить до определенного размера за 0.7 секунды.

Делаю следующим образом:

layout:

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical">

        <TextView
            android:id="@+id/oval_background"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:background="@drawable/shape_oval_background" />

    </RelativeLayout>


drawable:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <solid
        android:color="#B6CFF5"/>

</shape>


activity:

View ovalBackground = findViewById(R.id.oval_background);
ValueAnimator animator = ValueAnimator.ofFloat(0, 230);
animator.setDuration(700);

AnimatorUpdateListener animatorUpdateListener = new AnimatorUpdateListener(this);
animator.addUpdateListener(animatorUpdateListener);


AnimatorUpdateListener:

public class AnimatorUpdateListener implements ValueAnimator.AnimatorUpdateListener {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float animateValue = (float) valueAnimator.getAnimatedValue();

        final float scale = getResources().getDisplayMetrics().density;
        int widthPixels = (int)animateValue * scale + 0.5f);
        int heightPixels = (int)animateValue * scale + 0.5f);

        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(widthPixels, heightPixels);
        layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);

        ovalBackground.setLayoutParams(layoutParams);
    }
}


Этот код работает и делает, то что надо - круг увеличивается до заданных размеров.
Моя проблема заключается в том, что на эмуляторе и на устройстве анимация происходит с разной скоростью.

Мне кажется, дело в разной плотности пикселей.
Эмпирическим путём получил, что увеличение происходит с одинаковой скоростью как на устройстве, так и на эмуляторе при следующих параметрах:

  • animator.setDuration(347);
  • animator.setDuration(652);


Пробовал найти какое-то соотношение между этими значениями и соответствующими параметрами DisplayMetrics (density, scaledDensity) - безуспешно.

Подскажите, как решать подбного рода проблемы?
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы