#android #animation #android-view #skew #objectanimator
#Android #Анимация #android-просмотр #перекос #objectanimator
Вопрос:
Я хочу создать косую анимацию для представления в Android. Итак, у меня прямоугольный вид (это нормальное / начальное состояние), в конце он должен выглядеть так:
Я могу сделать такую вещь с android.view.animation
помощью package, используя Transformation of TYPE_MATRIX
. Итак, я могу создать Matrix
и использовать preSkew
метод, применить это Matrix
к моей пользовательской анимации, а затем запустить эту анимацию в представлении. Так что все в порядке.
НО
Проблема в том, что я хочу сделать это с. ObjectAnimator
Потому что использование android.view.animation
пакета не рекомендуется использовать. Но я не могу найти решение этой проблемы с ObjectAnimator
помощью class.
Если у меня есть ImageView
, я могу использовать метод setImageMatrix
для ObjectAnimator
(а также создать пользовательский MatrixEvaluator
для оценки соответствующих матриц для каждого фактора), но я хочу получить решение этой проблемы с View
помощью класса, а не для какого-либо его подкласса. И основная причина в том, что TextView
, например, у него нет общедоступного метода like setMatrix
, и я тоже хочу получить решение TextView
. Итак, получить решение для базового класса View — это главное желание.
Существует другое решение: создайте пользовательский, например, SkewTextView
, в каком onDraw
методе мы используем canvas.skew
метод.
Но это даже худшее решение, чем использование android.view.animation
package, потому что вам нужно создавать оболочки для любого View
подкласса, который вы хотите исказить.
Итак, я не знаю, как я могу перекос View
с помощью a ObjectAnimator
(поскольку View
класс не имеет общедоступных методов, таких как setSkew
or setMatrix
).
Как бы вы решили эту проблему?
Есть ли у вас какие-либо идеи о том, как решить эту проблему?
Есть ли решение этой проблемы с ObjectAnimator
помощью?
Любая помощь (или даже мысли)
с благодарностью
Комментарии:
1. На самом деле, почему вы думаете, что для этого не рекомендуется использовать анимацию? Аниматоры лучше, когда вам также нужно обновить положение представления (или его свойства), но если вам нужно только внести некоторые видимые, но не осязаемые изменения, почему бы не использовать анимацию?
2. Спасибо за ваш комментарий. Хорошо, анимации из пакета android.view.animation на данный момент не являются устаревшими, и я могу их использовать, но, похоже, они устареют позже (это мое мнение). Итак, из-за этого я стараюсь избегать использования анимации из пакета android.view.animation. Итак, мой вопрос касается исследований: что мне делать, если анимации из android.view.animation устарели.
Ответ №1:
Ну, без подклассов это может быть немного сложнее. Моя основная идея — использовать TimeAnimator, который предоставит вам обратные вызовы по времени в сочетании с камерой (которая может использовать матричные преобразования). Или вы можете использовать TimeAnimator и создать растровое изображение из представления, которое вы хотите исказить, сделать исходный вид невидимым и рисовать растровое изображение на каждом шаге TimeAnimator, применяя к нему матрицу. Но я не уверен, что это оптимальный способ сделать это, поскольку вам придется создавать новое растровое изображение для каждого кадра
РЕДАКТИРОВАТЬ: Нет, подход камеры — это не способ сделать это, как указано в комментариях ниже
Комментарии:
1. С этим связаны некоторые проблемы: 1) Камера не предоставляет ни методов для искажения матрицы преобразования, ни для установки уже искаженного экземпляра матрицы 2) даже если эти методы предоставлены, не будет способа применить эту камеру для просмотра, кроме применения к экземпляру canvas в методе onDraw, но если я предоставлюдоступ туда, я могу вызвать postSkew () и т. Д. Методы На холсте напрямую без камеры. И изменение метода onDraw() не является способом искажения представления извне. Но в любом случае, спасибо за ваши мысли)
2. Да, извините, я виноват. Подход камеры определенно не будет работать, могут быть некоторые проблемы и со вторым, но, по крайней мере, я совершенно уверен, что он будет работать, однако я на самом деле не ожидаю, что класс анимации устареет
Ответ №2:
Я создал косую анимацию, используя API анимации свойств Android в моем проекте (ссылка на GitHub).
Что я сделал:
- Создал пользовательский вид (SkewView) и добавил
SKEW_X
к нему свойство.
public class SkewView extends ImageView {
private static final String TAG = "SkewView";
public static final Property SKEW_X
= new FloatProperty("skewX") {
@Override
public void setValue(SkewView object, float value) {
object.setSkewX(value);
}
@Override
public Float get(SkewView object) {
return object.getSkewX();
}
};
private float mSkewX;
// ...
public float getSkewX() {
return mSkewX;
}
public void setSkewX(float skewX) {
mSkewX = skewX;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
if (mSkewX != 0) {
canvas.skew((float) (mSkewX * Math.PI / 180.0f), 0);
}
super.onDraw(canvas);
}
}
- Используется
ObjectAnimator
для анимации этого свойства.
ObjectAnimator skewAnimator = ObjectAnimator.ofFloat(mTarget, SkewView.SKEW_X, 30);