`
thunder_yan
  • 浏览: 109092 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android 3D图片切换

阅读更多

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;

	@Override
	public 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;
		}

		@Override
		public void onAnimationStart(Animation arg0) {
		}

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

		@Override
		public void onAnimationRepeat(Animation arg0) {
		}
	}

	private final class SwapViews implements Runnable {
		private final int mPosition;

		public SwapViews(int position) {
			mPosition = position;
		}

		@Override
		public 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;
	}

	@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();
		// 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>  
 
分享到:
评论

相关推荐

    3D切换动画效果

    实现三维切换动画效果,通过滑动触发切换动画,基于Android平台实现

    android 超炫图片游览器

    超炫的图片游览器,超炫的3D图片浏览可切换图片的效果! 触摸可拖拉效果!

    实现图片3d翻转效果

    android本身没有提供3d的图片翻转效果,为了实现3d的图片翻转,本示例通过使用camera类对图片从不同的角度的透视模拟了图片的3d翻转

    图片的切换效果

    用android相机类实现的图片的3D切换效果

    android开发揭秘PDF

    4.2.16 切换图片(hmgeSwilcher) 4.2.17 网格视图(GridView) 4.2.18 卷轴视图(ScrollView) 4.2.19 进度条(ProgressBar) 4.2.20 拖动条(SeekBar) 4.2.21 状态栏提示(Notification、NotificationManager) 4.2.22 对话框...

    Unity3D 超级宝库]Unity滑动切换效果插件

    在Unity3D中模拟Android系统左右划屏切换页面的效果

    android开发资料大全

    Android3D游戏开发付费视频教程共享(更新第四集) 史上最全示例Android教学视频,非常值得观看 Android游戏开发系列源码+CHM+书籍截图+目录】 Android developer guide中文翻译文档 Android开发开发技巧之 EditText...

    Android应用开发揭秘pdf高清版

    4.2.16 切换图片(hmgeSwilcher) 4.2.17 网格视图(GridView) 4.2.18 卷轴视图(ScrollView) 4.2.19 进度条(ProgressBar) 4.2.20 拖动条(SeekBar) 4.2.21 状态栏提示(Notification、NotificationManager) 4.2.22 对话框...

    android 仿照ios相册 滑动+倒影+3D+倾斜+放大

    像iphone相册那样的炫,立体,滑动切换图片。直接导入就可运行

    《Android应用开发揭秘》附带光盘代码.

     4.2.16 切换图片(hmgeSwilcher)  4.2.17 网格视图(GridView)  4.2.18 卷轴视图(ScrollView)  4.2.19 进度条(ProgressBar)  4.2.20 拖动条(SeekBar)  4.2.21 状态栏提示(Notification、NotificationManager) ...

    新版Android开发教程.rar

    ----------------------------...• 优化的图形库 包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 (硬件加速可选) • SQLite SQLite SQLite SQLite 用作结构化的数据存储 • 多媒体支持 包括常见的音频、视频和...

    《Android应用开发揭秘》源码

     4.2.16 切换图片(hmgeSwilcher)  4.2.17 网格视图(GridView)  4.2.18 卷轴视图(ScrollView)  4.2.19 进度条(ProgressBar)  4.2.20 拖动条(SeekBar)  4.2.21 状态栏提示(Notification、NotificationManager) ...

    android图片浏览器,没有内存溢出

    android图片浏览器,采用3D效果切换页面,需要在sd卡上创建welllmay\lanucher文件夹,在此文件夹中放置任意多个文件进去 执行程序就可以了

    3D旋转图片立体展示jquery幻灯片插件源码

    此Jquery插件实现了3D旋转图片立体展示幻灯片插件,功能非常酷。有兴趣的同学可以试着做一下。  包括了以下功能:  1、可支持鼠标滚轮控制图片360度旋转  2、鼠标支持左右方向控制按钮来控制图片旋转的方向  3、...

    疯狂Android讲义源码

     图像切换器(ImageSwitcher)  功能和用法 104  2.4.12 画廊视图(Gallery)的功能和  用法 107  2.5 对话框 110  2.5.1 使用AlertDialog创建简单  对话框 110  2.5.2 使用AlertDialog创建列表  对话框 ...

    android百度api2.1

    Android SDKv2.1.0是适用于Android系统移动设备的矢量地图开发包,也是v2.0.0的升级版本。 v2.1.0,功能介绍: 地图展示:包括2D图、卫星图、3D图地图展示。 地图操作:提供平移、缩放、双指手势操作、底图旋转等...

    scene-recon-android:适用于Android的3D场景重建助手应用程序

    场景侦察Scene Recon 旨在引导用户在场景中拍摄一组合适的图片,以便可以重建该场景的 3D 模型。 原作者( )已经登录了他的发现。 要构建此 gradle 项目,请按照以下说明进行操作。 克隆这个存储库并切换到克隆的...

    android开发demo集合

    41、AIDL Service android中的跨进程调用 客户端,服务端见AidlService 42、BroadcastReceiver 接收广播消息 43、非UI线程中不能操作UI线程中的View测试 44、ImageSwitcher animation gesture实现可以滑动的跑马灯...

Global site tag (gtag.js) - Google Analytics