`

使用Animation中的Camera构造伪3D动画效果(水平翻转 翻页)

 
阅读更多

使 Animation中的 Camera 构造伪 3D动画效果

 

水平翻转效果。

 

主要是想用于设计一个新的翻页方案。

或2个界面之间的切换方案

 

关键代码已标红

--------------

代码

 

package dk.demo.anim;

 

import android.app.Activity;

import android.os.Bundle;

import android.widget.ImageView;

 

public class TwoSidedViewActivity extends Activity {

    

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        

        ImageView img1=new ImageView(this);

        img1.setImageResource(R.drawable.img1);

        ImageView img2=new ImageView(this);

        img2.setImageResource(R.drawable.img2);

        TwoSidedView tsv=new TwoSidedView(this, img1, img2, 2500);

        

        setContentView(tsv);

    }

}

 

 

package dk.demo.anim;

 

import android.content.Context;

import android.graphics.Camera;

import android.graphics.Matrix;

import android.view.View;

import android.view.animation.Animation;

import android.view.animation.LinearInterpolator;

import android.view.animation.Transformation;

import android.widget.RelativeLayout;

 

public class TwoSidedView extends RelativeLayout{

 

private View frontView;

private View backView;

private int duration;

ViewAnimation animFront;

ViewAnimation animBack;

public TwoSidedView(Context context,View frontView,View backView,int duration) {

super(context);

this.frontView=frontView;

this.backView=backView;

animFront=new ViewAnimation();

animFront.flag=ViewAnimation.FRONT_ANIM;

animFront.setFillAfter(true);

animBack=new ViewAnimation();

animBack.flag=ViewAnimation.BACK_ANIM;

animBack.setFillAfter(true);

this.duration=duration;

this.addView(frontView);

this.addView(backView);

 

frontView.setOnClickListener(mOnclickListener);

backView.setOnClickListener(mOnclickListener);

this.removeAllViews();

this.addView(backView);

this.addView(frontView);

}

 

View.OnClickListener mOnclickListener=new View.OnClickListener() {

 

@Override

public void onClick(View v) {

if(v.equals(frontView))

{

frontView.startAnimation(animFront);

backView.startAnimation(animBack);

 

 

}

// else

// {

// frontView.startAnimation(animBack);

// backView.startAnimation(animFront);

// }

//

}

};

 

  class ViewAnimation extends Animation {  

   private static final int FRONT_ANIM=0;

   private static final int BACK_ANIM=1;

        int mCenterX;//记录 View 的中间坐标  

        int mCenterY;  

        Camera camera = new Camera(); 

        int flag;

        public ViewAnimation() {  

        }  

    

        @Override  

        public void initialize(int width, int height, int parentWidth,  

               int parentHeight) {  

            super.initialize(width, height, parentWidth, parentHeight);  

            //初始化中间坐标值  

            mCenterX = width/2;   

            mCenterY = height/2;  

            setDuration(duration);  

            setFillAfter(true);  

            setInterpolator(new LinearInterpolator());  

        }  

    

        @Override  

        protected void applyTransformation(float interpolatedTime,  

               Transformation t) {  

            final Matrix matrix = t.getMatrix();  

         camera.save();

           if(flag==FRONT_ANIM )

           {

            if(interpolatedTime<=(0.5))

            {

            camera.rotateY( interpolatedTime*2*90);

           //第一个view 在动画时间的前半段旋转90° 和屏幕垂直(不可见)

           //System.out.println("time:"+interpolatedTime*2*90);

            }

            else

            {

            camera.rotateY(90);

            }

           }

           else  if(flag==BACK_ANIM )

           {

            if(interpolatedTime>=0.5)

            {

            camera.rotateY((float)(270+ (interpolatedTime-0.5)*90*2));

          //第二个view 在动画时间的后半段从270°旋转至360°

         //即从垂直于屏幕 旋转到与屏幕平行

         //由不可见变为可见

            }

            else

            {

            camera.rotateY(270);

            }

          

           }

            camera.getMatrix(matrix);  

            camera.restore();

            matrix.preTranslate(-mCenterX, -mCenterY);  

            matrix.postTranslate(mCenterX, mCenterY);  

           

        }  

     }  

}

分享到:
评论
1 楼 nuannuandetaiyang 2012-07-19  
挺不错的~~~~

相关推荐

    Android 利用Camera实现中轴3D卡牌翻转效果

    3. **创建动画**:为了实现翻转效果,我们需要创建一个动画,这可以通过使用`Animation`类的子类,如`CardFlipAnimation`。这个动画会改变Camera的旋转角度,模拟卡片沿着中轴线翻转。可以使用`ObjectAnimator`或者...

    Android利用Camera实现中轴3D卡牌翻转效果

    在Android开发中,实现视觉效果丰富且引人入胜的用户界面是提升用户体验的重要手段之一。...总之,利用`Camera`类结合自定义动画,可以轻松地在Android应用中实现中轴3D卡牌翻转效果,增强用户体验。

    安卓 3D 翻转效果 demo

    在安卓开发中,为了增强用户体验,开发者经常使用各种动画效果,3D翻转效果就是其中一种常见且引人注目的视觉技巧。这个“安卓3D翻转效果demo”旨在教你如何通过自定义控件来实现这种效果,包括百叶窗和魔方等多种...

    一个的图片3d旋转方法

    2. Camera类的使用:Camera类是Android中的一种用于实现3D动画的类。通过Camera类,我们可以实现图片的旋转、平移等动画效果。在Rotate3d类中,我们使用Camera类来实现图片的旋转动画。 3. Matrix类的使用:Matrix...

    android ApiDemos里的Transition3d翻转修复完善

    总之,修复和完善`ApiDemos`中的`Transition3d`翻转效果,需要对Android的动画机制有深入理解,包括视图动画和属性动画,以及`Camera`的使用。通过细致的代码审查、合理的参数设置和适配性处理,可以创建出流畅、...

    Android实现dialog的3D翻转示例

    要将这个3D翻转效果应用于Dialog,首先确保你已经在项目中设置了对硬件加速的支持,因为3D动画通常需要硬件加速。然后,你需要创建一个自定义Dialog类,重写`show()` 方法,在显示Dialog之前启动`Rotate3dAnimation`...

    网页模板——Three.js实现3D翻转的祝贺语生成器心形巧克力动画效果源码.zip

    此源码的核心在于利用Three.js来实现3D动画效果,尤其是心形巧克力的翻转和祝贺语的动态展示。在网页中,3D元素的创建、渲染和交互通常涉及到复杂的数学和图形学原理,如向量运算、矩阵变换、光照模型等。Three.js...

    Three.js实现3D翻转的祝贺语生成器心形巧克力动画效果源码.zip

    【标题】中的“Three.js实现3D翻转的祝贺语生成器心形巧克力动画效果源码”表明这是一个基于Three.js库开发的项目,用于创建3D动态效果,特别是...通过研究源码,可以深入理解Three.js的使用方法和3D动画的实现技巧。

    android翻转效果(诚信工作室)[借鉴].pdf

    这里介绍的是一种基于自定义`Animation`类`Rotate3d`实现的二维翻转效果,而非直接使用`Matrix`进行图像变换。 `Rotate3d`类继承自`Animation`,它通过操控`Camera`对象来模拟3D旋转,从而达到翻转的效果。`Rotate...

    Android的3D旋转

    在Android中,我们可以使用`android.view.animation`包下的`RotateAnimation`类来创建2D旋转动画,但若要实现3D旋转,则需要利用到`android.graphics.Matrix`类和`Camera`类。 `Matrix`类是Android图形系统的基础,...

    模拟立体翻转效果,非Gallery实现.zip

    首先,我们要了解Gallery组件在早期的Android版本中是用于展示一系列横向滑动的图片或视图,它具有3D翻转的效果。然而,随着Android版本的更新,Gallery组件在API Level 17(Android 4.2)后被弃用,开发者需要寻找...

    Android实现3D翻转动画效果

    总的来说,实现3D翻转动画的关键在于理解`Animation`和`Transformation`的工作原理,并利用`Camera`对象来创建3D空间中的旋转效果。通过自定义`Animation`类,我们可以精确控制动画的每一个细节,从而在Android应用...

    Android动画之3D翻转效果实现函数分析

    总之,Android中实现3D翻转动画需要对`Animation`和`Transformation`有深入理解,通过自定义动画类并利用`Camera`对象来操纵视图的3D变换。这样的自定义动画可以为用户界面带来丰富的动态效果,提升用户体验。

    Android应用源码模拟立体翻转效果,非Gallery实现.zip

    由于此项目没有使用`Gallery`,我们可以推测它可能使用了`Property Animation`,因为这种动画系统更适合处理复杂的3D转换和动画效果。 1. **Property Animation**:Android 3.0(API级别11)引入了`Property ...

    android-flip 类似Flipboard翻转动画的实现.zip源码资源下载

    3. **相机设置**:`Camera`对象用于在3D空间中创建深度感,使得翻转效果更加逼真。通过调整相机的位置和视角,可以控制翻转时的透视效果。 4. **视图变换**:在动画过程中,需要对视图进行变换操作,包括旋转、平移...

    Unity3D中使用uGUI实现3D旋转特效(简单,好用)

    我们可以设置Canvas的Render Mode为Screen Space - Camera或World Space,前者将UI绘制在屏幕空间上,而后者则将其放置在3D世界中,允许UI元素与3D对象交互。 接下来,我们关注 RectTransform组件。RectTransform...

    android flipborad 效果

    2. **3D变换**:为了模拟真实的翻页效果,我们需要使用`Camera`类来实现3D空间中的视图变换。通过调整相机的位置和角度,可以创建出物体翻转的效果。`View.setLayerType(View.LAYER_TYPE_HARDWARE, null)`可以使视图...

    类Flipboard效果的Android源码

    标题中的“类Flipboard效果”指的是在Android平台上实现的一种翻页动画效果,灵感来源于流行的新闻阅读应用Flipboard。Flipboard以其独特的翻书式用户体验而闻名,使得用户在浏览信息时仿佛在翻阅一本真实的杂志。在...

Global site tag (gtag.js) - Google Analytics