Переход на 3D-куб в Android

Я хочу, чтобы экран (или часть экрана) переключился на другую часть в 3D-подобном кубе. Я говорю о 2 обычных элементах пользовательского интерфейса Android, а не о грубой графике, сделанной на холсте.

Как вы подходите к этому?

Спасибо

UPDATE

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

Ответ 1

Предположим, вам нужна транзакция вроде this

Хорошо, скажем, у вас есть viewswitcher с 2 детьми. Вам необходимо получить доступ к каждому ребенку отдельно, когда они рисуют. Вы можете это сделать, расширив класс ViewSwicher до своего MyViewSwitcher и включив статические преобразования

public class MyViewSwitcher extends ViewSwitcher {


//DO THAT FOR ALL CONSTRUCTORS
    public PViewSwitcher(Context context) {
        super(context);
               setStaticTransformationsEnabled(true); 
               ....
    }



        //Now you have to override getChildStaticTransformation
            @Override
            protected boolean getChildStaticTransformation(View child, Transformation t) {

   //enable drawing cache to each child to get  smoother transactions
  child.setDrawingCacheEnabled(true);

        //To identify if the child is the first or the second of the viewSwitcher do that
       if (child == getChildAt(0)) {
                //Here i will transform the first child


             }
       if (child == getChildAt(1)) {
                //Here i will transform the second child

             }   


    return true;
        }

**

Теперь позиция.

** То, что вам нужно знать, - это положение каждого ребенка. Вы можете это сделать, получив положение каждого ребенка относительно его родителя. child.getLeft() делает это для вас. и float centerChild = child.getLeft()+(child.getWidth()/2f). Какую бы анимацию вы ни делали должен иметь centerChild как ссылку.

Таким образом, вы можете определить поворот дочернего элемента по оси x в зависимости от расстояния, на котором центр (centerChild) имеет расстояние от родителей (getWidth()/2f).

So

float distanceFromCenter = getWidth() -centerChild;

Теперь у вас есть свои контрольные точки.

**

Теперь к части преобразований.

**

Вам нужно изменить преобразование. Для этого вам нужно получить доступ к его матрице.

//Setup the matrix and alter it
 Matrix matrix = t.getMatrix();
 t.clear();
 t.setTransformationType(Transformation.TYPE_MATRIX);

//Здесь вы можете играть с матрицей. поэтому, делая

matrix.postTranslate(-distance, 0);

вы уже получаете забавную анимацию.

Затем поверните изображение на основе его положения.

matrix.postRotate(distance /40f);
matrix.preTranslate(-child.getWidth()/2f , -child.getHeight()/2f);
matrix.postTranslate(child.getWidth()/2f , child.getHeight()/2f);

Вы получаете забавную ротацию, когда анимация анимации отображается.

**

Теперь в 3D-часть!

**

Android предоставляет доступ к классу камеры . android.graphics.Camera

Что делает класс камеры, он изменяет матрицу 3x3 и обеспечивает 3D-преобразования.

Внутри getChildStaticTransformation()...

    Camera mCamera;
    mCamera.save();
    mCamera.rotateY(distance/40f); //you should divide by the parent width so your       rotation values are 0>=rotation >= MAX_ROTATION
    mCamera.getMatrix(matrix);
   mCamera.restore();

Итак, теперь, чтобы получить анимацию 3D-анимации, просто нарисуйте значения вращения на основе родительского расстояния и примените их к каждому ребенку с помощью

mCamera.rotateX(град).

Ответ 2

Анимация между Inter-activity переходами может быть выполнена с помощью overridePendingTransition().

Вот довольно хороший учебник для начала.


Jelly beans имеет поддержку LayoutTransistion и ViewPropertyAnimator, но я не думаю, что даже вооруженный этим, вы будете иметь возможность снимать трехмерные кубические транзисторы.