3D翻转实现

对于转动的效果 安卓本身有了旋转,可是翻转怎么实现呢?

先看效果图

申明 :翻转源码来源于Andbase


首先,看下来看下项目的布局文件 (一个帧布局中放了两个ImageButton,这里注意第二个ImageButoon是要给他设置消失的)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.drotate.MainActivity" >

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >


            <ImageButton
                android:id="@+id/right_image_one"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_gravity="center"
                android:background="@drawable/yuan1_f"
                />
            <ImageButton
                android:id="@+id/right_image_one_ed"
                android:visibility="gone"
                android:layout_width="100dp"
                 android:layout_gravity="center"
                android:layout_height="100dp"
                android:background="@drawable/yuan1_z"
                 />
    </FrameLayout>

</RelativeLayout>

其次Activity的代码:

public class MainActivity extends Activity {
	private ViewGroup mContainer;
	private ImageView right_image_one, right_image_one_ed;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mContainer = (ViewGroup) findViewById(R.id.container);
		right_image_one = (ImageView) findViewById(R.id.right_image_one);
		right_image_one_ed = (ImageView) findViewById(R.id.right_image_one_ed);
		
		right_image_one.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				new Start3DUtil(0,0,90,mContainer,right_image_one,right_image_one_ed);
			}
		});
		right_image_one_ed.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				new Start3DUtil(-1, 180, 90,mContainer,right_image_one,right_image_one_ed);
			}
		});

就是这么简单就能够实现 ,相信大家都能够看懂,

最后我们看下Start3DUtil的方法

它实现的翻转中两段动画中的第一段翻转,

public Start3DUtil(int position, float start, float end, View mContainer,View view1, View view2) {
		// 找翻转的中心点
		final float centerX = mContainer.getWidth() / 2.0f;
		final float centerY = mContainer.getHeight() / 2.0f;

		// Create a new 3D rotation with the supplied parameter
		// The animation listener is used to trigger the next animation
		final AbRotate3dAnimation rotation = new AbRotate3dAnimation(start,end, centerX, centerY, 310.0f, true);
		rotation.setDuration(500);
		rotation.setFillAfter(true);
		rotation.setInterpolator(new AccelerateInterpolator());//插值器
		rotation.setAnimationListener(new DisplayNextView(position, mContainer,view1, view2));

		mContainer.startAnimation(rotation);
	}

这里的 AbRotate3dAnimation就是翻转的具体实现的方法,我们来看下最主要的实现方法是

 @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);
    }
用到的类Camera(android.graphics.Camera 包名不要搞错) 和 Matrix (android.graphics.Matrix;)


DisplayNextView自定义的动画监听,实现在动画技术是对容器翻转完成的第二段动画,做到两个View的调换

public void onAnimationEnd(Animation animation) {
			mContainer.post(new SwapViews(mPosition, mContainer, view1, view2));
		}


private final class SwapViews implements Runnable {
		private final int mPosition;
		private final View mContainer, view1, view2;

		public SwapViews(int position, View container, View view1, View view2) {
			mPosition = position;
			this.view1 = view1;
			mContainer = container;
			this.view2 = view2;
		}

		public void run() {
			final float centerX = mContainer.getWidth() / 2.0f;
			final float centerY = mContainer.getHeight() / 2.0f;
			AbRotate3dAnimation rotation;

			if (mPosition > -1) {
				view1.setVisibility(View.GONE);
				view2.setVisibility(View.VISIBLE);

				rotation = new AbRotate3dAnimation(90, 180, centerX, centerY,310.0f, false);
			} else {
				view1.setVisibility(View.VISIBLE);
				view2.setVisibility(View.GONE);
				rotation = new AbRotate3dAnimation(90, 0, centerX, centerY,310.0f, false);
			}

			rotation.setDuration(500);
			rotation.setFillAfter(true);
			rotation.setInterpolator(new DecelerateInterpolator());

			mContainer.startAnimation(rotation);
		}
	}

}


最后demo的下载地址:http://www.oschina.net/code/snippet_2702417_56319

注,这里有一个bug,就是第二张ImageButton显示的图片在手机上翻转后的左右方向是反的大哭

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用CSS3的transform和transition属性来实现导航条的3D翻转效果,同时结合伪类:hover来实现鼠标悬停时的颜色变化。 下面是一个简单的示例代码: HTML: ``` <nav> <ul> <li><a href="#">Home</a></li> <li><a href="#">About</a></li> <li><a href="#">Services</a></li> <li><a href="#">Contact</a></li> </ul> </nav> ``` CSS: ``` nav ul { list-style: none; margin: 0; padding: 0; display: flex; } nav li { width: 100px; height: 50px; margin: 10px; position: relative; perspective: 1000px; } nav a { display: block; width: 100%; height: 100%; position: absolute; top: 0; left: 0; transform-style: preserve-3d; transition: all 0.5s; } nav a:before { content: ''; display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: #333; transform: rotateY(0deg); transform-origin: left; transition: all 0.5s; } nav a:after { content: ''; display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: #fff; transform: rotateY(-90deg); transform-origin: right; transition: all 0.5s; } nav li:hover a:before { transform: rotateY(90deg); background-color: #f00; } nav li:hover a:after { transform: rotateY(0deg); background-color: #f00; } ``` 解析: - 给ul标签设置display: flex;,让li标签排列为一行。 - 给li标签设置宽高、margin等样式,并设置perspective属性来产生3D视觉效果。 - 给a标签设置display: block;、宽高100%、position: absolute;等样式,并设置transform-style: preserve-3d;来启用3D变换。 - 使用:before和:after伪类来制作导航条的不同面,同时设置背景色和transform属性来实现3D翻转效果。 - 使用:hover伪类来监听鼠标悬停事件,并设置对应的transform值和背景色来实现颜色变化。 ### 回答2: 要实现导航条的3D翻转变色效果,可以采用CSS中的transform属性和transition属性。 首先,确保导航条的HTML结构已经创建好,例如使用一个ul元素和若干li元素来表示导航菜单。 然后,在CSS中为导航条添加以下样式: ```css .navbar { perspective: 1000px; /* 设置视角距离 */ } .navbar li { transform-style: preserve-3d; /* 设置3D效果保留 */ transition: transform 0.5s; /* 设置过渡效果时间 */ } .navbar:hover li { transform: rotateY(180deg); /* 鼠标悬停时翻转180度 */ } .navbar li:nth-child(even) { background-color: #ffcc00; /* 偶数位置的li元素背景色 */ } .navbar li:nth-child(odd) { background-color: #ff9900; /* 奇数位置的li元素背景色 */ } ``` 以上代码中: `.navbar` 类选择器用于选择导航条容器元素,并通过 `perspective` 属性设置视角距离,达到3D效果。 `.navbar li` 选择器用于选择导航条中的 li 元素,并通过 `transform-style` 属性设置3D效果保留。接着使用 `transition` 属性设置过渡效果时间,使翻转过程具有平滑的动画效果。 `.navbar:hover li` 选择器用于在鼠标悬停时,对导航条中的所有 li 元素应用翻转效果。 `.navbar li:nth-child(even)` 和 `.navbar li:nth-child(odd)` 选择器用于为导航条中的偶数位置和奇数位置的 li 元素设置不同的背景色。 这样,当鼠标悬停在导航条上时,导航条会以3D翻转的效果展示,并且偶数位置的 li 元素背景色为黄色,奇数位置的 li 元素背景色为橙色。 ### 回答3: 要实现导航条的3D翻转效果并能够改变颜色,可以使用CSS的transform属性结合动画效果以及透明度属性。下面是一种实现方式: HTML部分: ```html <nav> <ul> <li><a href="#">首页</a></li> <li><a href="#">产品</a></li> <li><a href="#">服务</a></li> <li><a href="#">关于我们</a></li> </ul> </nav> ``` CSS部分: ```css nav ul { list-style: none; margin: 0; padding: 0; display: flex; } nav li { margin: 10px; padding: 10px; background-color: #ccc; transform-style: preserve-3d; /* 开启3D翻转效果 */ transition: transform 0.5s, background-color 0.5s; /* 添加动画效果 */ } nav li:hover { transform: rotateY(180deg); /* 使元素沿Y轴翻转180度 */ background-color: #ff0000; /* 鼠标悬停时改变背景颜色 */ } nav a { text-decoration: none; color: #000; } nav a:hover { text-decoration: underline; } ``` 通过上述CSS代码,实现了导航条每个选项的3D翻转效果以及鼠标悬停时的背景颜色改变。当鼠标悬停于导航选项上时,该选项会以Y轴为轴心进行180度翻转,并且背景颜色会从原来的灰色变为红色;当鼠标离开时,选项会恢复原来的状态。其中,transition属性用于添加翻转效果的动画,transform属性用于实现3D翻转效果,background-color属性用于改变背景颜色,而a标签则用于设置文字样式。这样就实现了一个带有3D翻转和背景色变化效果的导航条。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值