Android-анимация камеры по оси Z
Несколько дней я застрял в проблеме, и едва ли могу найти кого-то, говорящего о чем-то подобном. На самом деле, я довольно смущен даже после долгого чтения книг и статей, так что, возможно, я просто пытаюсь убить комара с помощью Базуки:-), но я не могу найти никакого решения вокруг.
Вот что я хочу получить в конце:
У меня есть список значков, таких как в laucher, скажем, расположенных в матрице 2 строки-16 столбцов. Когда я нажимаю на один из значков, анимация должна начать масштабировать нажатый значок до полного экрана. На самом деле не требуется, чтобы графика значков поддерживалась во время анимации, это может быть даже поле, увеличивающееся от размера значков до полного экрана.
Я попытался сделать работу, поместив значки таким образом (это всего лишь матрица 2х4, достаточно, чтобы увидеть проблему)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:paddingTop="50dp">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/scrollView">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_gravity="center_horizontal"
android:gravity="center_horizontal" android:layout_margin="5dp">
<package.libraries.BoxX
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/boxX"
android:src="@drawable/icon1"
android:focusableInTouchMode="false" android:layout_weight="1" android:layout_gravity="center"
android:clickable="false" android:longClickable="false"
android:layout_alignParentLeft="false" android:layout_alignWithParentIfMissing="false"
android:layout_margin="10dp"/>
<package.libraries.BoxX
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/boxX2"
android:src="@drawable/icon2"
android:focusableInTouchMode="false" android:layout_gravity="center" android:layout_weight="1"
android:longClickable="false" android:layout_alignParentRight="false"
android:layout_alignParentBottom="false" android:layout_alignParentLeft="false"
android:layout_alignParentTop="false"
android:adjustViewBounds="false" android:layout_toRightOf="@+id/boxX"
android:baselineAlignBottom="false"
android:layout_margin="10dp"/>
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_gravity="center_horizontal"
android:gravity="center_horizontal" android:layout_margin="5dp">
<view android:layout_width="wrap_content"
android:layout_height="wrap_content"
class="package.libraries.BoxX" android:id="@+id/boxX3" android:src="@drawable/icon3"
android:layout_margin="10dp"/>
<view android:layout_width="wrap_content"
android:layout_height="wrap_content"
class="package.libraries.BoxX" android:id="@+id/BoxX4" android:focusableInTouchMode="false"
android:src="@drawable/icon4" android:layout_toRightOf="@+id/boxX3" android:layout_margin="10dp"/>
</RelativeLayout>
</LinearLayout>
</ScrollView>
где package.libraries.BoxX - мой пользовательский вид, расширяющий ImageView и запускающий анимацию. Вот как я создаю и запускаю анимацию:
@Override
public void onClick(View view) {
XxFlipAnimator animator = new XxFlipAnimator(BoxX.this, strDrw, endDrw,
BoxX.this.getWidth() / 2, BoxX.this.getHeight() / 2, true);
animator.setFillAfter(true);
animator.setFillEnabled(true);
animator.setDuration(500);
BoxX.this.startAnimation(animator);
mStatus = status.CLICKED;
}
И XxFlipAnimator - мой класс анимации, полученный из этого, который имеет этот метод ApplyTrasformation:
protected void applyTransformation(float interpolatedTime, Transformation t) {
final Matrix matrix = t.getMatrix();
camera.save();
camera.translate(0.0f, 0.0f, (float) (1100.0 * (0.5f - interpolatedTime)));
if ((interpolatedTime < 0.5f) || !(zoom))
camera.rotateY(degrees);
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
Zoom получается отрицательным по оси Z, и здесь возникает первый вопрос: это правильно? если это правильный способ иметь иконку "растущий", то какой реальный диапазон по оси Z? Я нашел экспериментальную константу 1100, но я бы предпочел иметь некоторые спецификации.
Между прочим, настоящая проблема заключается в следующем: когда я нажимаю на иконку, анимация запускается хорошо, размеры значков начинают расти, но когда они достигают родительского относительного расположения, они зажимаются. Разве это не связано с относительным макетом, так как я попытался изменить его на Linear, и результат тот же... так что суть в том, возможно ли, чтобы анимация выходила за пределы размера родительского макета анимационного представления?
Большое спасибо всем, кто поможет,
Cristiano