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>
分享到:
相关推荐
360度3D旋转动画是提升用户体验的一种有效方式,通过理解并实践"RotateDemo",你将能够自如地在Android应用中实现各种旋转效果。记得灵活运用,根据实际需求调整旋转轴、速度和中心点,以达到最佳视觉效果。
要实现3D旋转效果,我们首先需要创建一个`RotateAnimation`对象。`RotateAnimation`类允许我们指定起始角度和结束角度,以及旋转轴。例如,如果我们希望一个视图沿X轴进行3D旋转,可以这样创建动画: ```java ...
在Android应用开发中,创建一个类似华为相机的旋转动画并实现界面随重力360度旋转是一项技术挑战。这个项目"Android-仿华为相机旋转动画配置界面支持随重力360度旋转"旨在模拟华为相机的高级功能,允许用户在不同...
这个动画会让当前视图绕其自身中心点旋转360度,然后显示下一个视图。通过调整参数,如旋转角度、旋转中心和动画持续时间,你可以定制你想要的旋转效果。 为了使引导页更加生动,还可以添加其他的动画效果,比如...
接下来,我们关注按钮的360度旋转效果。这可以通过`ObjectAnimator`或者自定义动画实现。使用`ObjectAnimator`的示例如下: ```java ObjectAnimator rotationAnimation = ObjectAnimator.ofFloat(button, "rotation...
本项目名为"Android360全景视图源码",很显然,它提供了一个实现360度全景视图的Android应用程序实例。 首先,我们来了解一下360全景图的基本概念。360全景图是一种特殊的图像格式,它通过拼接多张照片来创建一个...
`0f`和`360f`分别是动画的起始值和结束值,表示从0度旋转到360度,完成一次完整的旋转。`setDuration()`方法用来设置动画的持续时间。 3. **交换布局**:如果要实现整个布局的旋转,我们需要将动画应用到父布局上。...
在360度全景展示中,我们会利用OpenGL ES创建一个可旋转的全景视图,用户可以通过滑动屏幕来改变视角。 为了在OpenGL ES中渲染全景图片,我们需要执行以下步骤: 1. **加载全景图像**:通常,全景图像是一个单行或...
例如,使用CSS3的transform属性来实现图片的360度旋转,通过JavaScript处理用户的交互事件,以及利用CSS的box-shadow来制作倒影效果。同时,HTML结构的设计也是关键,确保图片和其倒影在页面上的正确布局和交互。 ...
- `toDegrees`是动画结束时的角度,这里设置为360度,表示完整旋转一圈。 - `pivotX`和`pivotY`分别指定旋转中心点的X和Y坐标,百分比值表示相对于视图宽度和高度的比例,50%意味着中心点。 - `duration`是动画的...
本篇文章将详细讲解如何在Android应用中实现常见手势,包括滑动(支持单指和双指切换)、缩放以及360度无死角的旋转。 首先,滑动手势是移动设备中最基础的手势之一。在Android中,我们可以通过自定义`...
视图动画包括补间动画(Tween Animation)和帧动画(Frame Animation),其中补间动画常用于实现旋转、移动、缩放和透明度变化等效果。 1. 创建旋转动画: 要创建旋转动画,我们需要创建一个XML文件放在res/anim...
对于按钮旋转效果,我们通常会使用 RotateAnimation 类,它可以实现一个对象围绕其轴线进行旋转。以下是一个简单的示例代码: ```java RotateAnimation rotateAnim = new RotateAnimation( 0f, 360f, // 旋转起始...
标题中的“一个Flutter包,可提供360度图像视图以及旋转和手势自定义”表明这是一款专为Flutter框架设计的插件,用于展示360度全景图像。Flutter是Google开发的一个开源UI工具包,它允许开发者使用Dart语言构建高...
// 顺时针旋转360度,围绕中心点 rotateAnim.setDuration(2000); ``` 三、应用动画 将创建好的动画应用到视图上,可以使用`startAnimation()`方法。 ```java myView.startAnimation(alphaAnim); ``` 四、动画监听...
本文将深入探讨在Android中实现的各种动画效果,包括旋转动画、折叠翻转、点赞动画、折叠书架、按钮切换动画以及模糊动画等。 1. **旋转动画**: 旋转动画在Android中可以通过` RotateAnimation `类来实现。开发者...
这将使两个球各自旋转360度。 2. **使用ValueAnimator**: 如果需要更复杂的控制,例如同步旋转或特定时间间隔的旋转,可以使用ValueAnimator。在onAnimatorUpdate()回调中更新球的旋转角度。 3. **使用动画集...
例如,`lefttoright.xml`文件中的代码展示了如何创建一个从0度到360度的无限重复旋转动画: ```xml xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:...
Android提供了`Canvas`对象,我们可以使用它的`rotate()`方法来实现旋转效果。为了实现动画,可以使用`ObjectAnimator`或`ValueAnimator`来改变角度值,并在每次动画更新时调用`invalidate()`方法强制重新绘制。 ``...