Всем привет.
Подскажите, пожалуйста, как сделать анимацию одинаковой на разных 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) - безуспешно.
Подскажите, как решать подбного рода проблемы?