时间:2021-05-20
在Android系统API中,有两个Camera类:
第二个应用于手机硬件中的相机相关的操作,本文讲述的是利用第一个Camera类实现中轴3D转换的卡牌翻转效果,开始之前,先看一下Android系统中的坐标系:
对应于三维坐标系中的三个方向,Camera提供了三种旋转方法:
调用这三种方法,传入旋转角度参数,即可实现视图沿着坐标轴旋转的功能。本文的中轴3D旋转效果就是让视图沿着Y轴旋转的。
系统API Demos中已经为我们提供了一个非常好用的3D旋转动画的工具类:
Rotate3dAnimation.java:
可以看出, Rotate3dAnimation 总共做了两件事:在构造函数中赋值了旋转动画所需要的参数,以及重写(override)父类Animation中的applyTransformation()方法,下面分类阐述一下:
activity_main.xml布局文件:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/white" > <Button android:id="@+id/btn_open" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" android:onClick="onClickView" android:text="打开" android:textColor="@android:color/black" android:textSize="16sp" /> <RelativeLayout android:id="@+id/rl_content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/btn_open" android:layout_marginTop="16dp" android:background="@android:color/black"> <ImageView android:id="@+id/iv_logo" android:layout_width="match_parent" android:layout_height="match_parent" android:contentDescription="@null" android:src="@drawable/ic_qrcode" android:scaleType="centerInside"/> <TextView android:id="@+id/tv_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="16dp" android:text="。" android:textColor="@android:color/white" android:textSize="18sp" android:visibility="gone"/> </RelativeLayout></RelativeLayout>布局中配置了卡牌正面的图片控件,卡牌背面的文本控件,以及他们的parent容器,也就是本文中的旋转动画的执行对象。
MainActivity.java文件:
package com.feng.androidtest;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.animation.AccelerateInterpolator;import android.view.animation.Animation;import android.view.animation.Animation.AnimationListener;import android.view.animation.DecelerateInterpolator;import android.widget.Button;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;import com.example.androidtest.R;public class MainActivity extends Activity { private RelativeLayout mContentRl; private ImageView mLogoIv; private TextView mDescTv; private Button mOpenBtn; private int centerX; private int centerY; private int depthZ = 400; private int duration = 600; private Rotate3dAnimation openAnimation; private Rotate3dAnimation closeAnimation; private boolean isOpen = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContentRl = (RelativeLayout) findViewById(R.id.rl_content); mLogoIv = (ImageView) findViewById(R.id.iv_logo); mDescTv = (TextView) findViewById(R.id.tv_desc); mOpenBtn = (Button) findViewById(R.id.btn_open); } /** * 卡牌文本介绍打开效果:注意旋转角度 */ private void initOpenAnim() { //从0到90度,顺时针旋转视图,此时reverse参数为true,达到90度时动画结束时视图变得不可见, openAnimation = new Rotate3dAnimation(0, 90, centerX, centerY, depthZ, true); openAnimation.setDuration(duration); openAnimation.setFillAfter(true); openAnimation.setInterpolator(new AccelerateInterpolator()); openAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { mLogoIv.setVisibility(View.GONE); mDescTv.setVisibility(View.VISIBLE); //从270到360度,顺时针旋转视图,此时reverse参数为false,达到360度动画结束时视图变得可见 Rotate3dAnimation rotateAnimation = new Rotate3dAnimation(270, 360, centerX, centerY, depthZ, false); rotateAnimation.setDuration(duration); rotateAnimation.setFillAfter(true); rotateAnimation.setInterpolator(new DecelerateInterpolator()); mContentRl.startAnimation(rotateAnimation); } }); } /** * 卡牌文本介绍关闭效果:旋转角度与打开时逆行即可 */ private void initCloseAnim() { closeAnimation = new Rotate3dAnimation(360, 270, centerX, centerY, depthZ, true); closeAnimation.setDuration(duration); closeAnimation.setFillAfter(true); closeAnimation.setInterpolator(new AccelerateInterpolator()); closeAnimation.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { mLogoIv.setVisibility(View.VISIBLE); mDescTv.setVisibility(View.GONE); Rotate3dAnimation rotateAnimation = new Rotate3dAnimation(90, 0, centerX, centerY, depthZ, false); rotateAnimation.setDuration(duration); rotateAnimation.setFillAfter(true); rotateAnimation.setInterpolator(new DecelerateInterpolator()); mContentRl.startAnimation(rotateAnimation); } }); } public void onClickView(View v) { //以旋转对象的中心点为旋转中心点,这里主要不要再onCreate方法中获取,因为视图初始绘制时,获取的宽高为0 centerX = mContentRl.getWidth()/2; centerY = mContentRl.getHeight()/2; if (openAnimation == null) { initOpenAnim(); initCloseAnim(); } //用作判断当前点击事件发生时动画是否正在执行 if (openAnimation.hasStarted() && !openAnimation.hasEnded()) { return; } if (closeAnimation.hasStarted() && !closeAnimation.hasEnded()) { return; } //判断动画执行 if (isOpen) { mContentRl.startAnimation(closeAnimation); }else { mContentRl.startAnimation(openAnimation); } isOpen = !isOpen; mOpenBtn.setText(isOpen ? "关闭" : "打开"); }}代码中已对核心的地方做了注释解释,主要弄清楚 rotate3dAnimation构造参数中的 fromDegrees和toDegrees、depthZ、reverse参数,同时在动画中设置了速度插播器,如动画的前半程使用加速器 AccelerateInterpolator,后半程使用减速器 DecelerateInterpolator,使动画体验更加人性化。
以上就是本文的全部内容,希望对大家的学习Android软件编程有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
利用Unity的UGUI制作了2D卡牌翻转的效果,如果是sprite对象的话,原理应该也是一样的,以下是效果图图1卡牌翻转效果关于DoTweenDoTween是
本文实例讲述了Android编程实现3D旋转效果的方法。分享给大家供大家参考,具体如下:下面的示例是在Android中实现图片3D旋转的效果。实现3D效果一般使
引言最近在研究Android的变形,Android的2D变形(包括缩放,扭曲,平移,旋转等)可以通过Matrix来实现,3D变形可以通过Camera来实现。接下
本文实现了Android中dialog的3D翻转效果。这里通过一个简单的应用场景记录下。效果图起初自己的思路是Activity进行界面跳转实现旋转效果,网上看了
本文实例为大家分享了Android实现3D标签云效果展示的具体代码,供大家参考,具体内容如下一、关于3D标签云TagCloudView是一个完全基于Androi