MainActivity

package org.wp.activity;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.Canvas;import android.graphics.LinearGradient;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PorterDuff.Mode;import android.graphics.PorterDuffXfermode;import android.graphics.Shader.TileMode;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.view.animation.AccelerateInterpolator;import android.view.animation.Animation;import android.view.animation.DecelerateInterpolator;import android.widget.ImageView;public class MainActivity extends Activity {private ViewGroup mContainer;private ImageView myFrontIv;private ImageView myBackIv;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mContainer = (ViewGroup) this.findViewById(R.id.mContainer);myFrontIv = (ImageView) this.findViewById(R.id.myFrontIv);myBackIv = (ImageView) this.findViewById(R.id.myBackIv);// 因为要旋转所以我们需要保存视图的缓存信息mContainer.setPersistentDrawingCache(ViewGroup.PERSISTENT_ANIMATION_CACHE);myFrontIv.setImageBitmap(createReflectedImage(((BitmapDrawable) getResources().getDrawable(R.drawable.picture1)).getBitmap()));myBackIv.setImageBitmap(createReflectedImage(((BitmapDrawable) getResources().getDrawable(R.drawable.picture2)).getBitmap()));}public void showBack(View view) {applyRotation(1, 0, 90);}public void showFront(View view) {applyRotation(-1, 0, -90);}private void applyRotation(int 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, 310.0f, true);rotation.setDuration(500);rotation.setFillAfter(true);// 动画插入器 加速rotation.setInterpolator(new AccelerateInterpolator());rotation.setAnimationListener(new DisplayNextView(position));mContainer.startAnimation(rotation);}private final class DisplayNextView implements Animation.AnimationListener {private final int mPosition;private DisplayNextView(int position) {mPosition = position;}@Overridepublic void onAnimationStart(Animation arg0) {}@Overridepublic void onAnimationEnd(Animation arg0) {mContainer.post(new SwapViews(mPosition));}@Overridepublic void onAnimationRepeat(Animation arg0) {}}private final class SwapViews implements Runnable {private final int mPosition;public SwapViews(int position) {mPosition = position;}@Overridepublic void run() {final float centerX = mContainer.getWidth() / 2.0f;final float centerY = mContainer.getHeight() / 2.0f;Rotate3dAnimation rotation = null;if (mPosition > -1) {myFrontIv.setVisibility(View.GONE);myBackIv.setVisibility(View.VISIBLE);myBackIv.requestFocus();rotation = new Rotate3dAnimation(-90, 0, centerX, centerY,310.0f, false);} else {myFrontIv.setVisibility(View.VISIBLE);myBackIv.setVisibility(View.GONE);myFrontIv.requestFocus();rotation = new Rotate3dAnimation(90, 0, centerX, centerY,310.0f, false);}rotation.setDuration(500);rotation.setFillAfter(true);// 动画插入器 减速rotation.setInterpolator(new DecelerateInterpolator());mContainer.startAnimation(rotation);}}private Bitmap createReflectedImage(Bitmap originalBitmap) {final int reflectionGap = 4;int width = originalBitmap.getWidth();int height = originalBitmap.getHeight();Matrix matrix = new Matrix();matrix.preScale(1, -1);Bitmap reflectionBitmap = Bitmap.createBitmap(originalBitmap, 0,height / 2, width, height / 2, matrix, false);Bitmap withReflectionBitmap = Bitmap.createBitmap(width, (height+ height / 2 + reflectionGap), Config.ARGB_8888);Canvas canvas = new Canvas(withReflectionBitmap);canvas.drawBitmap(originalBitmap, 0, 0, null);Paint defaultPaint = new Paint();canvas.drawRect(0, height, width, height + reflectionGap, defaultPaint);canvas.drawBitmap(reflectionBitmap, 0, height + reflectionGap, null);Paint paint = new Paint();LinearGradient shader = new LinearGradient(0, originalBitmap.getHeight(), 0,withReflectionBitmap.getHeight(), 0x70ffffff, 0x00ffffff,TileMode.MIRROR);paint.setShader(shader);paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));canvas.drawRect(0, height, width, withReflectionBitmap.getHeight(), paint);return withReflectionBitmap;}}

Rotate3dAnimation

package org.wp.activity;import android.view.animation.Animation;import android.view.animation.Transformation;import android.graphics.Camera;import android.graphics.Matrix;public class Rotate3dAnimation extends Animation {/** 开始旋转的角度 **/private final float mFromDegrees;/** 旋转结束的角度 **/private final float mToDegrees;/** 图片中心X坐标 **/private final float mCenterX;/** 图片中心Y坐标 **/private final float mCenterY;/** Z轴上的距离 **/private final float mDepthZ;/** 缩放效果 **/private final boolean mReverse;/** 视角 **/private Camera mCamera;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;}@Overridepublic void initialize(int width, int height, int parentWidth,int parentHeight) {super.initialize(width, height, parentWidth, parentHeight);mCamera = new Camera();}@Overrideprotected 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();// x轴 正值向右// y轴 正值向上// z轴 正值缩小if (mReverse) {// 由大变小camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);} else {// 由小变大camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));}// 围绕Y轴进行旋转camera.rotateY(degrees);camera.getMatrix(matrix);camera.restore();// 旋转矩阵运算会以图像的原点为变换中心点,如果想要以图片中心点为旋转的中心点// 就需要首先把整个View的中心移动到原点,矩阵运算完成后再把View移回原来的位置matrix.preTranslate(-centerX, -centerY);matrix.postTranslate(centerX, centerY);}}

main.xml

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent"       android:layout_height="fill_parent">      <LinearLayout android:layout_width="fill_parent"          android:layout_height="fill_parent"          android:id="@+id/mContainer">          <ImageView android:layout_width="fill_parent"              android:layout_height="fill_parent"              android:onClick="showBack"              android:id="@+id/myFrontIv" />          <ImageView android:layout_width="fill_parent"              android:layout_height="fill_parent"              android:onClick="showFront"              android:visibility="gone"              android:id="@+id/myBackIv" />          </LinearLayout>     </LinearLayout>  

更多相关文章

  1. Android旋转动画
  2. Android旋转动画
  3. OpenGL ES教程III之移动变换(原文对照)
  4. Android中imageView图片放大缩小及旋转功能示例代码
  5. android 细节之 旋转动画
  6. Android(安卓)拍照 录音 拍视频 旋转 裁剪 压缩图片
  7. Android(安卓)电子罗盘 --指南针(方向传感器的应用)
  8. Android处理Bitmap的一些方法
  9. Android(安卓)屏幕旋转时保存状态

随机推荐

  1. 第七天android:弹球1
  2. 下载安装sdk-tools配置Android(安卓)SDK
  3. 打开eclipse的opens the android sdk and
  4. 检测android app是否第一次启动
  5. Android之Gradle的理解
  6. 【Android】高仿大众点评中的范围选择控
  7. Android中Handler的正确使用
  8. AES在Android、JAVA端正常加密解密
  9. android studio使用volley发送post和get
  10. Android从外部API获取json数据并以listvi