`

图片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旋转的效果呢?

相关推荐

    Android实现高级图片滚动控件,3D版的图片轮播器Demo_图片滚动展示.zip

    本项目“Android高级图片滚动控件,3D版的图片轮播器Demo”专注于提供一种独特且引人入胜的3D图片展示方式,让用户能够更加沉浸地浏览图片。 首先,我们要理解3D图片轮播器的核心概念。在传统的2D轮播器基础上,3D...

    3d立体相册源码demo

    这个"3d立体相册源码demo"是一个入门级的教程,旨在帮助程序员们了解如何创建具有3D效果的相册,使用户可以通过鼠标拖动来从不同角度浏览图片,从而为浏览者带来独特的视觉体验。 首先,我们需要了解HTML5。HTML5是...

    小程序源码 高级图片滚动控件,3D版的图片轮播器Demo.rar

    "小程序源码 高级图片滚动控件,3D版的图片轮播器Demo.rar" 这个标题明确指出我们讨论的是一个针对小程序开发的源码项目,具体是一个高级的图片滚动控件,具有3D效果的图片轮播器的示例代码。这意味着这个压缩包包含...

    Android高级图片滚动控件,3D版的图片轮播器Demo.zip

    本示例提供的"Android高级图片滚动控件,3D版的图片轮播器Demo.zip"是一个源码项目,它为开发者提供了更丰富、更生动的图片展示体验,尤其是在3D视觉效果上。 1. **3D图片轮播效果** - 3D转换:这个控件利用...

    3D图片环绕浏览

    - `zns_demo.html`:这是主HTML文件,包含整个3D图片环绕浏览的结构和JavaScript代码。 - `zns.jpg`:可能是一个示例3D图片,用于演示3D环绕浏览效果。 - `style` 文件夹:通常包含CSS样式文件,用于定义3D图片的...

    Android高级应用源码-Android高级图片滚动控件,3D版的图片轮播器Demo.zip

    本篇文章将聚焦于一个Android高级应用源码——3D版的图片轮播器Demo,深入探讨其设计原理、实现方式以及优化策略,旨在帮助开发者提升对Android图像处理和UI控件的理解。 首先,我们要理解这个3D图片轮播器的核心...

    flash图片特效制作banner焦点图片3D立体展示效果

    首先,让我们分析“标题”:“flash图片特效制作banner焦点图片3D立体展示效果”。这里的关键词是“Flash”,它是一种由Adobe公司开发的动画创作和多媒体软件平台,用于创建交互式的矢量图形、动画、游戏以及应用...

    安卓Android源码——安卓Android高级图片滚动控件,3D版的图片轮播器Demo.zip

    首先,这个“安卓Android源码——安卓Android高级图片滚动控件,3D版的图片轮播器Demo”是一个包含源代码的压缩包,开发者可以下载并研究其内部结构。该压缩包的名称表明它是一个关于3D图片轮播器的示例项目,可能...

    安卓Android源码——安卓Android高级图片滚动控件,3D版的图片轮播器Demo.rar

    "安卓Android源码——安卓Android高级图片滚动控件,3D版的图片轮播器Demo.rar" 这个标题明确指出我们正在讨论一个针对Android平台的源码项目,它是一个高级的图片滚动控件,具有3D效果的图片轮播功能。在Android...

    Android高级图片滚动控件,3D版的图片轮播器Demo-IT计算机-毕业设计.zip

    这个压缩包文件包含了一个基于Android平台的高级图片滚动控件的源码Demo,它具有3D效果,可以为用户带来独特的图片浏览体验。这个项目对于Android应用开发者,尤其是那些正在做毕业设计的学生来说,是一个非常有价值...

    浏览图片有3D效果

    在Android平台上,为用户提供3D效果的图片浏览体验是一种创新且引人入胜的设计。这种技术可以增强用户体验,使图片看起来更加生动立体。本篇将深入探讨如何在Android应用中实现这一功能,主要涵盖以下几个核心知识点...

    Android应用源码之Android高级图片滚动控件,3D版的图片轮播器Demo-IT计算机-毕业设计.zip

    这个Demo展示了如何在Android平台上构建一个具有高级特性的图片滚动控件,其中包括了3D视觉效果,使得用户在浏览图片时有更丰富的体验。在进行Android应用开发时,图片轮播器是一个常见的组件,常见于应用的启动界面...

    图片3D展示效果

    "图片3D展示效果"是一种将传统2D图片转化为动态3D展示的技术,能够为用户提供更生动、更具视觉冲击力的浏览体验。在本案例中,我们关注的是一个基于jQuery实现的3D图片切换插件。 jQuery是一个广泛使用的JavaScript...

    仿iphone图片3D切换效果

    【标题】"仿iPhone图片3D切换效果"指的是在网页中实现的一种模拟iPhone手机中图片浏览的3D切换动画。这种效果通常是通过JavaScript库或CSS3技术来完成,旨在为用户提供更加直观、生动且富有立体感的图片浏览体验,...

    漂亮的图片展示 3D 展示

    "漂亮的图片展示 3D 展示"这个项目显然聚焦于使用3D效果来展示图片,提供了一种新颖且吸引人的图片浏览方式。下面将详细讨论相关知识点: 1. **3D图形**:3D图形技术基于数学模型,通过计算机生成具有深度和立体感...

    HTML5 3D图片阴影翻转动画

    在"HTML5 3D图片阴影翻转动画DEMO演示"中,我们可以预期看到以下关键技术的应用: 1. **CSS3 Transitions**: 这是CSS3的一个特性,允许元素在两个样式之间平滑过渡。在翻转动画中,transition通常用于设置旋转速度...

    flash图片特效3D动画焦点图片切换带左右按钮控制图片滚动.rar

    这篇教程将介绍如何使用Flash创建一个3D动画焦点图片切换效果,该效果具有左右按钮控制,可以方便地滚动浏览图片。我们将重点讨论Flash的3D功能、XML文件的使用以及如何实现图片的动态加载。 首先,让我们理解...

    galley3D效果+滑动敏感控制demo

    总的来说,"galley3D效果+滑动敏感控制demo"是一个实用的Android开发示例,它展示了如何通过自定义和优化来提升Galley控件的用户体验,尤其是对于那些需要流畅且具有视觉冲击力的图片浏览应用来说,这个demo提供了很...

    自己做着玩的翻图片Demo.7z

    描述中提到的“左右循环翻图片的Demo”是指该程序能够展示一个图片库,用户可以通过按键盘的左右方向键来浏览图片,实现图片在序列中的前后切换。这种功能通常需要编程逻辑来处理图片的加载和动画效果,确保平滑过渡...

    小程序swiper 3D 切换代码

    在这个场景中,Swiper可能用于展示多位医生的简介和头像,用户可以通过3D切换效果浏览并选择合适的医生。具体的实现细节可能包括医生数据的获取、每个`swiper-item`内的布局设计等。 总之,小程序中的Swiper 3D切换...

Global site tag (gtag.js) - Google Analytics