Android TextView редактирование Marquee speed
Есть ли возможность переопределить в TextView, внутренний объект private static final class Marquee? Если быть точнее, то мне нужно изменить параметр MARQUEE_DP_PER_SECOND или конечный вариант, поле mPixelsPerSecond или mPixelsPerMs.
Я пробовал написать свою реализацию Marquee или использовать библиотеки, но итоговое поведение несоответствовало оригинальному.
Самый подходящим вариантом были:
https://stackoverflow.com/a/26906775/21419775
https://stackoverflow.com/a/37570455/21419775
Мой вариант реализации
public static void setMarqueeSpeed(TextView tv, float speed) {
tv.post(new Runnable() {
@Override
public void run() {
try {
Field f;
if (tv instanceof AppCompatTextView) {
f = tv.getClass().getSuperclass().getDeclaredField("mMarquee");
} else {
f = tv.getClass().getDeclaredField("mMarquee");
}
f.setAccessible(true);
Object marquee = f.get(tv);
if (marquee != null) {
String scrollSpeedFieldName = "mPixelsPerMs";
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
scrollSpeedFieldName = "mPixelsPerSecond";
}
Log.d("TEST-MARQUEE", scrollSpeedFieldName);
Field mf = marquee.getClass().getDeclaredField(scrollSpeedFieldName);
mf.setAccessible(true);
mf.setFloat(marquee, mf.getFloat(marquee) * speed);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
Но у меня не удалось получить доступ к данному полю
Accessing hidden field Landroid/widget/TextView$Marquee;->mPixelsPerMs:F (greylist-max-o, reflection, denied)
Что самое смешное в этой ситуации, так это то что в самом Marquee есть TODO который, а чего писать, приведу цитату из файла TextView.java строка 13977
// TODO: Add an option to configure this
Буду благодарен, если существует библиотека которая и дает точь-в-точь такое же поведение и обратно совместима с тегами из xml. Если найду, то отпишусь в вопрос.