`
xuehaipeng
  • 浏览: 52566 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

android视图360度旋转效果

阅读更多
1.重写Animation动画类,定义360度旋转
package com.test.animation;

import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.graphics.Camera;
import android.graphics.Matrix;

/**
 * An animation that rotates the view on the Y axis between two specified angles.
 * This animation also adds a translation on the Z axis (depth) to improve the effect.
 */
public class Rotate3dAnimation extends Animation {
    private final float mFromDegrees;
    private final float mToDegrees;
    private final float mCenterX;
    private final float mCenterY;
    private final float mDepthZ;
    private final boolean mReverse;
    private Camera mCamera;

    /**
     * Creates a new 3D rotation on the Y axis. The rotation is defined by its
     * start angle and its end angle. Both angles are in degrees. The rotation
     * is performed around a center point on the 2D space, definied by a pair
     * of X and Y coordinates, called centerX and centerY. When the animation
     * starts, a translation on the Z axis (depth) is performed. The length
     * of the translation can be specified, as well as whether the translation
     * should be reversed in time.
     *
     * @param fromDegrees the start angle of the 3D rotation
     * @param toDegrees the end angle of the 3D rotation
     * @param centerX the X center of the 3D rotation
     * @param centerY the Y center of the 3D rotation
     * @param reverse true if the translation should be reversed, false otherwise
     */
    public Rotate3dAnimation(float fromDegrees, float toDegrees,
            float centerX, float centerY, float depthZ, boolean reverse) {
        mFromDegrees = fromDegrees;
        mToDegrees = toDegrees;
        mCenterX = centerX;
        mCenterY = centerY;
        mDepthZ = depthZ;
        mReverse = reverse;
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        mCamera = new Camera();
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
    	final float fromDegrees = mFromDegrees;
        float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);

        final float centerX = mCenterX;
        final float centerY = mCenterY;
        final Camera camera = mCamera;

        final Matrix matrix = t.getMatrix();

        camera.save();
        if (mReverse) {
            camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
        } else {
            camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
        }
        camera.rotateY(degrees);
        camera.getMatrix(matrix);
        camera.restore();

        matrix.preTranslate(-centerX, -centerY);
        matrix.postTranslate(centerX, centerY);
    }
}

2.主方法:
首先定义一个layout,然后在该layout中定义两个layout,分别为旋转效果的正反面,
然后进行动画,在第一次的动画后放入监听事件,监听事件是第一次旋转90度,再触发监听事件执行Runnable触发第二次旋转。
package com.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Animation.AnimationListener;
import android.widget.Button;
import android.widget.RelativeLayout;

import com.test.animation.Rotate3dAnimation;

public class Main extends Activity {
    private Button testButton;
	private RelativeLayout animation_layout,animation_layout_temp;
	private ViewGroup mContainer;
    private boolean isAnswer;
    public static int screenWidth,screenHeight;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        testButton = (Button) findViewById(R.id.testButton);
        animation_layout = (RelativeLayout) findViewById(R.id.animation_layout);
        animation_layout_temp = (RelativeLayout) findViewById(R.id.animation_layout_temp);
        mContainer = (ViewGroup) findViewById(R.id.layout_main);
        mContainer.setPersistentDrawingCache(ViewGroup.PERSISTENT_ANIMATION_CACHE);
        Display display = getWindowManager().getDefaultDisplay();
		screenWidth = display.getWidth();
		screenHeight = display.getHeight();
        testButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (isAnswer) {
					testButton.setText("Answer");
					applyRotation(isAnswer, 0, 90);
				} else {
					testButton.setText("Question");
					applyRotation(isAnswer, 0, 90);
				}
			}
		});
    }
    private void applyRotation(boolean position,float start,float end) {
    	final float centerX = mContainer.getWidth() / 2.0f;
    	final float centerY = mContainer.getHeight() / 2.0f;
    	final Rotate3dAnimation rotation = new Rotate3dAnimation(start, end, centerX, centerY, screenWidth, true);
    	rotation.setDuration(500);
    	rotation.setFillAfter(true);
    	rotation.setInterpolator(new AccelerateInterpolator());
    	rotation.setAnimationListener(new DisplayNextView(position));
    	mContainer.startAnimation(rotation);
    }
    
    
    private final class DisplayNextView implements AnimationListener {
    	private final boolean mPosition;
    	
		private DisplayNextView(boolean position) {
			mPosition = position;
		}

		@Override
		public void onAnimationEnd(Animation animation) {
			mContainer.post(new SwapViews(mPosition));
		}

		@Override
		public void onAnimationRepeat(Animation animation) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void onAnimationStart(Animation animation) {
			// TODO Auto-generated method stub
			
		}
    }
    
    private final class SwapViews implements Runnable {
    	private final boolean mPosition;
    	
		public SwapViews(boolean position) {
			mPosition = position;
		}

		@Override
		public void run() {
			final float centerX = mContainer.getWidth() / 2.0f;
            final float centerY = mContainer.getHeight() / 2.0f;
            Rotate3dAnimation rotation;
			if (mPosition) {
				animation_layout_temp.setVisibility(View.VISIBLE);
				animation_layout.setVisibility(View.GONE);
				rotation = new Rotate3dAnimation(-90, 0, centerX, centerY, screenWidth-10.0f, false);
			} else {
				animation_layout_temp.setVisibility(View.GONE);
				animation_layout.setVisibility(View.VISIBLE);
				rotation = new Rotate3dAnimation(-90, 0, centerX, centerY, screenWidth-10.0f, false);
			}
			rotation.setDuration(500);
            rotation.setFillAfter(true);
            rotation.setInterpolator(new DecelerateInterpolator());
            isAnswer = !mPosition;
            mContainer.startAnimation(rotation);
		}
    }
}

视图配置文件,需要定义视图的正反面以及包含这两个正反面的视图:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:background="#FFFFFF"
    android:layout_height="fill_parent">
    
    <RelativeLayout android:id="@+id/layout_main" android:layout_width="fill_parent"
    	android:layout_height="300px" android:background="#AC4F3F">
	    <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content"
	    	android:id="@+id/animation_layout">
	    	<LinearLayout android:layout_width="wrap_content" android:orientation="vertical"
	    		android:layout_centerInParent="true"
	    		android:layout_height="wrap_content" android:id="@+id/layout1">
				<TextView
				    android:layout_width="fill_parent"
				    android:layout_height="wrap_content" 
				    android:text="@string/hello"/>
	   	 	</LinearLayout>
	    </RelativeLayout>
	    <RelativeLayout android:layout_width="fill_parent" android:layout_height="300px"
	    	android:id="@+id/animation_layout_temp" android:visibility="invisible">
	    	<LinearLayout android:layout_width="wrap_content" android:orientation="vertical"
	    		android:layout_centerInParent="true"
	    		android:layout_height="wrap_content" android:id="@+id/layout1">
				<TextView
				    android:layout_width="fill_parent"
				    android:layout_height="wrap_content" 
				    android:text="@string/app_name"/>
	   	 	</LinearLayout>
	    </RelativeLayout>
    </RelativeLayout>
    
    <RelativeLayout android:layout_below="@id/layout_main" android:layout_width="fill_parent"
    	android:layout_height="40px" android:background="#000">
    	<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
    		android:text="Question" android:layout_centerInParent="true"
    		android:id="@+id/testButton"></Button>
    </RelativeLayout>
</RelativeLayout>

0
3
分享到:
评论
1 楼 gundumw100 2012-08-03  
如何反过来旋转?
比如按一下顺时针旋转,在按一下逆时针旋转。

相关推荐

    android360度3D旋转动画

    360度3D旋转动画是提升用户体验的一种有效方式,通过理解并实践"RotateDemo",你将能够自如地在Android应用中实现各种旋转效果。记得灵活运用,根据实际需求调整旋转轴、速度和中心点,以达到最佳视觉效果。

    Android 滑动效果 3D旋转

    要实现3D旋转效果,我们首先需要创建一个`RotateAnimation`对象。`RotateAnimation`类允许我们指定起始角度和结束角度,以及旋转轴。例如,如果我们希望一个视图沿X轴进行3D旋转,可以这样创建动画: ```java ...

    Android-仿华为相机旋转动画配置界面支持随重力360度旋转

    在Android应用开发中,创建一个类似华为相机的旋转动画并实现界面随重力360度旋转是一项技术挑战。这个项目"Android-仿华为相机旋转动画配置界面支持随重力360度旋转"旨在模拟华为相机的高级功能,允许用户在不同...

    Android绕球心旋转引导页效果

    这个动画会让当前视图绕其自身中心点旋转360度,然后显示下一个视图。通过调整参数,如旋转角度、旋转中心和动画持续时间,你可以定制你想要的旋转效果。 为了使引导页更加生动,还可以添加其他的动画效果,比如...

    android圆形360旋转按钮

    接下来,我们关注按钮的360度旋转效果。这可以通过`ObjectAnimator`或者自定义动画实现。使用`ObjectAnimator`的示例如下: ```java ObjectAnimator rotationAnimation = ObjectAnimator.ofFloat(button, "rotation...

    Android360全景视图源码

    本项目名为"Android360全景视图源码",很显然,它提供了一个实现360度全景视图的Android应用程序实例。 首先,我们来了解一下360全景图的基本概念。360全景图是一种特殊的图像格式,它通过拼接多张照片来创建一个...

    android的绕Y轴旋转动画

    `0f`和`360f`分别是动画的起始值和结束值,表示从0度旋转到360度,完成一次完整的旋转。`setDuration()`方法用来设置动画的持续时间。 3. **交换布局**:如果要实现整个布局的旋转,我们需要将动画应用到父布局上。...

    Android 360度全景照片展示

    在360度全景展示中,我们会利用OpenGL ES创建一个可旋转的全景视图,用户可以通过滑动屏幕来改变视角。 为了在OpenGL ES中渲染全景图片,我们需要执行以下步骤: 1. **加载全景图像**:通常,全景图像是一个单行或...

    图片带倒影360度立体滚动效果(四合一)

    例如,使用CSS3的transform属性来实现图片的360度旋转,通过JavaScript处理用户的交互事件,以及利用CSS的box-shadow来制作倒影效果。同时,HTML结构的设计也是关键,确保图片和其倒影在页面上的正确布局和交互。 ...

    Android中用xml配置旋转动画项目的要求说明.pdf

    - `toDegrees`是动画结束时的角度,这里设置为360度,表示完整旋转一圈。 - `pivotX`和`pivotY`分别指定旋转中心点的X和Y坐标,百分比值表示相对于视图宽度和高度的比例,50%意味着中心点。 - `duration`是动画的...

    Android-常用手势识别滑动(单指双指切换不跳动)缩放旋转(360度无死角)

    本篇文章将详细讲解如何在Android应用中实现常见手势,包括滑动(支持单指和双指切换)、缩放以及360度无死角的旋转。 首先,滑动手势是移动设备中最基础的手势之一。在Android中,我们可以通过自定义`...

    android简单旋转菜单

    视图动画包括补间动画(Tween Animation)和帧动画(Frame Animation),其中补间动画常用于实现旋转、移动、缩放和透明度变化等效果。 1. 创建旋转动画: 要创建旋转动画,我们需要创建一个XML文件放在res/anim...

    Android例子源码按钮旋转和动态上推menu效果

    对于按钮旋转效果,我们通常会使用 RotateAnimation 类,它可以实现一个对象围绕其轴线进行旋转。以下是一个简单的示例代码: ```java RotateAnimation rotateAnim = new RotateAnimation( 0f, 360f, // 旋转起始...

    一个Flutter包,可提供360度图像视图以及旋转和手势自定义_Dart_Kotlin_下载.zip

    标题中的“一个Flutter包,可提供360度图像视图以及旋转和手势自定义”表明这是一款专为Flutter框架设计的插件,用于展示360度全景图像。Flutter是Google开发的一个开源UI工具包,它允许开发者使用Dart语言构建高...

    Android 动画之视图动画

    // 顺时针旋转360度,围绕中心点 rotateAnim.setDuration(2000); ``` 三、应用动画 将创建好的动画应用到视图上,可以使用`startAnimation()`方法。 ```java myView.startAnimation(alphaAnim); ``` 四、动画监听...

    Android各种动画效果集合(旋转动画+折叠翻转+点赞动画+折叠书架+按钮切换动画+模糊动画等等)

    本文将深入探讨在Android中实现的各种动画效果,包括旋转动画、折叠翻转、点赞动画、折叠书架、按钮切换动画以及模糊动画等。 1. **旋转动画**: 旋转动画在Android中可以通过` RotateAnimation `类来实现。开发者...

    两球旋转动画效果

    这将使两个球各自旋转360度。 2. **使用ValueAnimator**: 如果需要更复杂的控制,例如同步旋转或特定时间间隔的旋转,可以使用ValueAnimator。在onAnimatorUpdate()回调中更新球的旋转角度。 3. **使用动画集...

    Android中用xml配置旋转动画的代码清单.pdf

    例如,`lefttoright.xml`文件中的代码展示了如何创建一个从0度到360度的无限重复旋转动画: ```xml xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:...

    Android 自定义View-旋转小按钮(修复bug)

    Android提供了`Canvas`对象,我们可以使用它的`rotate()`方法来实现旋转效果。为了实现动画,可以使用`ObjectAnimator`或`ValueAnimator`来改变角度值,并在每次动画更新时调用`invalidate()`方法强制重新绘制。 ``...

Global site tag (gtag.js) - Google Analytics