`

图片3D浏览的Demo

阅读更多
这是个图片浏览的例子;

刚在群里一个家伙给提供的思路:
1.Activity类Rotate.java文件
package cn.com;

import android.app.Activity;
import android.os.Bundle;

import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ImageView;

public class Rotate extends Activity {
	GestureDetector gesture;

	int mCenterX = 160;
	int mCenterY = 0;

	ImageView mImageView1;
	ImageView mImageView2;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		FlingGuest sg = new FlingGuest(this);
		gesture = new GestureDetector(sg);

		mImageView1 = (ImageView) findViewById(R.id.image1);
		mImageView2 = (ImageView) findViewById(R.id.image2);
	}

	public void leftMoveHandle() {
		Rotate3d leftAnimation = new Rotate3d(0, -90, 0, 0, mCenterX, mCenterY);
		Rotate3d rightAnimation = new Rotate3d(90, 0, 0.0f, 0.0f, mCenterX,
				mCenterY);

		leftAnimation.setFillAfter(true);
		leftAnimation.setDuration(1000);
		rightAnimation.setFillAfter(true);
		rightAnimation.setDuration(1000);

		mImageView1.startAnimation(leftAnimation);
		mImageView2.startAnimation(rightAnimation);
	}

	public void rightMoveHandle() {
		Rotate3d leftAnimation = new Rotate3d(0, 90, 0, 0, mCenterX, mCenterY);
		Rotate3d rightAnimation = new Rotate3d(-90, 0, 0.0f, 0.0f, mCenterX,
				mCenterY);

		leftAnimation.setFillAfter(true);
		leftAnimation.setDuration(1000);
		rightAnimation.setFillAfter(true);
		rightAnimation.setDuration(1000);

		mImageView1.startAnimation(rightAnimation);
		mImageView2.startAnimation(leftAnimation);
	}

	// called automatically, any screen action will Triggered it
	public boolean onTouchEvent(MotionEvent me) {
		return gesture.onTouchEvent(me);
	}
}


2.手势监听类
package cn.com;

import android.app.Activity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;

public class FlingGuest implements OnGestureListener {
	Activity activity;

	int VALUE_DISTANCE = 100;
	int VALUE_SPEED = 20;

	public FlingGuest(Activity a) {
		activity = a;
	}

	// 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
	public boolean onDown(MotionEvent e) {
		Log.d("TAG", "[+++++++++++][onDown]");
		return true;
	}

	// e1, the begin of ACTION_DOWN MotionEvent
	// e2, the end of ACTION_DOWN MotionEvent
	// velocityX, the motion speed in X
	// velocityY:the motion speed in y
	// 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN,
	// 多个ACTION_MOVE, 1个ACTION_UP触发
	// e1:第1个ACTION_DOWN MotionEvent
	// e2:最后一个ACTION_MOVE MotionEvent
	// velocityX:X轴上的移动速度,像素/秒
	// velocityY:Y轴上的移动速度,像素/秒
	// 触发条件 :
	// X轴的坐标位移大于VALUE_DISTANCE,且移动速度大于VALUE_SPEED个像素/秒
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		if ((e1.getX() - e2.getX() > VALUE_DISTANCE)
				&& Math.abs(velocityX) > VALUE_SPEED) {
			Log.d("TAG", "[+++++++++++][onFling][Fling left]");
			((Rotate)activity).leftMoveHandle();
			
		} else if ((e2.getX() - e1.getX() > VALUE_DISTANCE)
				&& Math.abs(velocityX) > VALUE_SPEED) {
			Log.d("TAG", "[+++++++++++][onDown][Fling right]");
			((Rotate)activity).rightMoveHandle();
		}
		return true;
	}

	// 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
	public void onLongPress(MotionEvent e) {
		Log.d("TAG", "[+++++++++++][onLongPress]");
	}

	// 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		Log.d("TAG", "[+++++++++++][onScroll]");
		return true;
	}

	// 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
	// 注意和onDown()的区别,强调的是没有松开或者拖动的状态
	public void onShowPress(MotionEvent e) {
		Log.d("TAG", "[+++++++++++][onShowPress]");
	}

	// 用户(轻触触摸屏后)松开,由一个MotionEvent ACTION_UP触发
	public boolean onSingleTapUp(MotionEvent e) {
		Log.d("TAG", "[+++++++++++][onSingleTapUp]");
		return true;
	}

}



3.Rotate3d.java动画辅助类
package cn.com;

import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.Transformation;

public class Rotate3d extends Animation {
	private float mFromDegree;
	private float mToDegree;
	private float mCenterX;
	private float mCenterY;
	private float mLeft;
	private float mTop;
	private Camera mCamera;
	private static final String TAG = "Rotate3d";

	public Rotate3d(float fromDegree, float toDegree, float left, float top,
			float centerX, float centerY) {
		this.mFromDegree = fromDegree;
		this.mToDegree = toDegree;
		this.mLeft = left;
		this.mTop = top;
		this.mCenterX = centerX;
		this.mCenterY = centerY;

	}

	@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 FromDegree = mFromDegree;
		float degrees = FromDegree + (mToDegree - mFromDegree)
				* interpolatedTime;
		final float centerX = mCenterX;
		final float centerY = mCenterY;
		final Matrix matrix = t.getMatrix();

		if (degrees <= -76.0f) {
			degrees = -90.0f;
			mCamera.save();
			mCamera.rotateY(degrees);
			mCamera.getMatrix(matrix);
			mCamera.restore();
		} else if (degrees >= 76.0f) {
			degrees = 90.0f;
			mCamera.save();
			mCamera.rotateY(degrees);
			mCamera.getMatrix(matrix);
			mCamera.restore();
		} else {
			mCamera.save();
			//
			mCamera.translate(0, 0, centerX);
			mCamera.rotateY(degrees);
			mCamera.translate(0, 0, -centerX);
			mCamera.getMatrix(matrix);
			mCamera.restore();
		}

		matrix.preTranslate(-centerX, -centerY);
		matrix.postTranslate(centerX, centerY);
	}
}




4.main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="wrap_content">
	<ImageView android:id="@+id/image2" android:layout_width="fill_parent"
		android:layout_height="fill_parent" android:background="@drawable/two" />
	<ImageView android:id="@+id/image1" android:layout_width="fill_parent"
		android:layout_height="fill_parent" android:background="@drawable/one" />
</RelativeLayout>

  • 大小: 33.8 KB
分享到:
评论
1 楼 yangjiantong 2011-12-15  
不错,不知道楼主有没做过像QQ游戏主界面那个3d旋转的效果呢?

相关推荐

    浏览图片有3D效果

    浏览图片 3D效果 demo android

    Flex 3D图片图片浏览

    Flex 结合PaperVison3D 写的图片浏览demo,下载既能运行

    安卓3d图片浏览

    基于安卓环境下的一个3D图片展示Demo

    仿iphone图片3D切换效果

    这是一个仿iphone斜拉的横向3D图片切换效果demo,实现了iphone图片浏览的效果

    3d立体相册源码demo

    程序员3D效果的相册,用鼠标多拽从多个角度浏览相册图片,简单相册制作带给她人不一样的美感,入门级教程,欢迎交流

    安卓源码包android画廊效果Gallery相册浏览MyCoversFlow完整代码等DEMO源码等10个合集.zip

    安卓源码包android画廊效果Gallery相册浏览MyCoversFlow完整代码等DEMO源码等10个合集: android_PageFlipper CoversFlow drawable(图片) Gallery+ImageSwitcher+ViewFlipper实现手机查看壁纸效果 Gallery3D ...

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

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

    3DWall照片墙组件

    flash3D照片墙组件,轻松制作照片浏览墙

    Android 使用Gallery实现3D相册(附效果图+Demo源码)

    所以需要做一个简单的图片浏览选择程序。最后选用Gallery作为基本控件。加入了一些炫一点的元素,做成3D滑动效果。下面是Demo例子截图: 这个效果网上已经很多人做出来了,只是这次需要用到,所以自己也实践了一下...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...

    720度全景场景HTML5源码,直接在浏览器中运行

    全景,英文名(Panorama),又被称为3D实景,是一种新兴的富媒体技术,其与视频,声音,图片等传统的流媒体最大的区别是“可操作,可交互”。 全景分为虚拟现实和3D实景两种。虚拟现实是利用maya等软件,制作出来的...

    JQuery&CSS;&CSS;+DIV实例大全.rar

    26.jQuery实现图片3D旋转特效插件 v1.1版本下载 27.jQuery实现图片3D立体感的前后轮番展示特效 28.jQuery实现图片取景器仿相机拍照功能的插件photoShoot 29.jQuery实现图片变色特效插件与实例下载如jquery...

    vc++ 应用源码包_1

    内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加...

    vc++ 应用源码包_2

    内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加...

    vc++ 应用源码包_6

    内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加...

    vc++ 应用源码包_5

    内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加...

    vc++ 应用源码包_3

    内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加...

    android开发资料大全

    Android图片浏览之源码 图片浏览器android源码下载 Android瀑布流加载图片效果实例 Android中利用ViewPager实现视图切换 Android泡泡聊天界面的源码实现 android 实现EditText震动效果 Touch Index Bar (有锤子有...

    Android-app.rar

    Android RecycleView+任意头尾布局+拖拽换位+拖拽删除demo Android sql练习合集 Android 仿12306 Android 优秀计步器 Android 体重计算源码 Android 使用Gallery_tabhost实现标签效果图源码 Android 例子源码根据CPU...

Global site tag (gtag.js) - Google Analytics