`
onewayonelife
  • 浏览: 259750 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

Android Gallery3D

 
阅读更多

MainActivity

package org.wp.activity;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.ViewConfiguration;
import android.widget.FrameLayout;
import android.widget.ImageView;

public class MainActivity extends Activity {
	/** 图片资源ID **/
	private Integer[] mImageIds = { R.drawable.image1, R.drawable.image2,
			R.drawable.image3, R.drawable.image4, R.drawable.image5,
			R.drawable.image6 };
	
	private static final int LEFT = 0x10;
	private static final int RIGHT = 0x11;

	/** FreamLayout **/
	private FrameLayout mContainer;
	/** 第一个ImageView **/
	private ImageView myIv1;
	/** 第二个ImageView **/
	private ImageView myIv2;
	/** 底部圆圈 **/
	private PageControlView pageControlView = null;

	/** 抖动动画 **/
	private Animation shake;
	/** 手势识别对象GestureDetector **/
	private GestureDetector gestureDetector = null;

	/** Handler对象 **/
	public Handler iHandler;

	/** 标识是否动画正在执行 **/
	private boolean flag = false;
	/** 定时开始时间 **/
	private long start;
	/** 当前时间 **/
	private long end;

	/** 显示图片的数量 **/
	private final int childCount = 6;
	/** 当前屏幕索引 **/
	private int currentScreenIndex = 0;
	/** ImageView先后顺序 **/
	private int currentIndex = 0;
	private final int iv1Index = 1;
	private final int iv2Index = 2;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		addBtnEvent();
		addMessageHandler();
	}

	private void addBtnEvent() {
		// 抖动动画
		shake = AnimationUtils.loadAnimation(this, R.anim.shake);
		// 手势识别
		gestureDetector = new GestureDetector(new FlingGestureDetector());

		mContainer = (FrameLayout) this.findViewById(R.id.mContainer);
		mContainer.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View arg0, MotionEvent arg1) {
				// 如果没有动画正在执行
				if (!flag) {
					// 当前时间记录为开始时间
					start = System.currentTimeMillis();
					// 判断用户手势
					gestureDetector.onTouchEvent(arg1);
				}
				return false;
			}
		});

		myIv1 = (ImageView) this.findViewById(R.id.myIv1);
		myIv2 = (ImageView) this.findViewById(R.id.myIv2);
		// 初始化显示图片
		myIv2.setImageResource(mImageIds[0]);
		// 初始化当前图片所以为0
		currentScreenIndex = 0;
		// 当前先后索引为iv2Index
		currentIndex = iv2Index;

		pageControlView = (PageControlView) this.findViewById(R.id.myPageControlView);
		/** 设置圆圈的数量 **/
		pageControlView.setCount(childCount);
		/** 初始化圆圈 **/
		pageControlView.generatePageControl(0);

		// 启动监听线程
		new OnFlingListener().start();
	}

	private void addMessageHandler() {
		iHandler = new Handler() {
			public void handleMessage(android.os.Message msg) {
				switch (msg.what) {
				case LEFT:
					scrollToScreen(currentScreenIndex - 1, 90.0f);
					break;
				case RIGHT:
					scrollToScreen(currentScreenIndex + 1, -90.0f);
					break;
				}
			}
		};
	}

	/** 手势识别 **/
	private class FlingGestureDetector extends GestureDetector.SimpleOnGestureListener {
		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
				float velocityY) {
			// 判断是否达到最小轻松速度,取绝对值的
			if (Math.abs(velocityX) > ViewConfiguration.get(MainActivity.this)
					.getScaledMinimumFlingVelocity()) {
				if (velocityX > 0 && currentScreenIndex > 0) {
					// 上一张图片
					scrollToScreen(currentScreenIndex - 1, 90.0f);
				} else if (velocityX < 0 && currentScreenIndex < childCount - 1) {
					// 下一张图片
					scrollToScreen(currentScreenIndex + 1, -90.0f);
				} else {
					// 如果没有,抖动
					mContainer.startAnimation(shake);
				}
			}
			return false;
		}
	}

	/** 切换到指定屏 **/
	public void scrollToScreen(int whichScreen, float degrees) {
		// 更新当前屏幕索引
		currentScreenIndex = whichScreen;
		// 重绘底部圆圈
		pageControlView.callback(currentScreenIndex);
		if (currentIndex == iv1Index) {
			// 如果myIv1在前
			currentIndex = iv2Index;
			// 设置myIv2图片资源
			myIv2.setImageResource(mImageIds[whichScreen]);
			// 旋转myIv1
			applyRotation(myIv1, 0, degrees);
			// 旋转myIv2
			applyRotation(myIv2, -degrees, 0);
		} else if (currentIndex == iv2Index) {
			// 如果myIv2在前
			currentIndex = iv1Index;
			// 设置myIv1图片资源
			myIv1.setImageResource(mImageIds[whichScreen]);
			// 旋转myIv2
			applyRotation(myIv2, 0, degrees);
			// 旋转myIv1
			applyRotation(myIv1, -degrees, 0);
		}
	}

	/** 实现旋转 **/
	private void applyRotation(ImageView iv, 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);
		rotation.setDuration(500);
		rotation.setFillAfter(true);
		// 监听第二个动画
		if (start == 90.0f || start == -90.0f)
			rotation.setAnimationListener(new DisplayNextView());

		iv.startAnimation(rotation);
	}

	/** 动画监听器 **/
	private final class DisplayNextView implements Animation.AnimationListener {
		@Override
		public void onAnimationEnd(Animation arg0) {
			flag = false;
		}

		@Override
		public void onAnimationRepeat(Animation arg0) {

		}

		@Override
		public void onAnimationStart(Animation arg0) {
			flag = true;
		}
	}

	/** 定时旋转线程 **/
	private final class OnFlingListener extends Thread {
		private boolean isRunning = true;

		@Override
		public void run() {
			start = System.currentTimeMillis();
			end = start;
			// 标识是否到达最后
			boolean bol = false;
			while (isRunning) {
				end = System.currentTimeMillis();
				// 如果没有动画正在进行且用户空闲操作时间超过3秒
				if (!flag && (end - start > 3000)) {
					if (!bol) {
						if (currentScreenIndex < childCount - 1) {
							start = end;
							iHandler.sendEmptyMessage(RIGHT);
						} else if (currentScreenIndex == childCount - 1) {
							bol = true;
						}
					} else {
						if (currentScreenIndex > 0) {
							start = end;
							iHandler.sendEmptyMessage(LEFT);
						} else if (currentScreenIndex == 0) {
							bol = false;
						}
					}
				}
			}
		}

		// 关闭监听线程
		@SuppressWarnings("unused")
		public void shutDown() {
			isRunning = false;
		}
	}
	
	/** 底部圆圈显示回调接口 **/
	interface ScrollToScreenCallback {
		public void callback(int currentIndex);
	}
}

 

PageControlView

package org.wp.activity;

import org.wp.activity.MainActivity.ScrollToScreenCallback;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class PageControlView extends LinearLayout implements ScrollToScreenCallback {
	/** Context对象 **/
	private Context context;
	/** 圆圈的数量 **/
	private int count;

	public PageControlView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
	}

	@Override
	public void callback(int currentIndex) {
		generatePageControl(currentIndex);
	}

	public void generatePageControl(int currentIndex) {
		this.removeAllViews();

		for (int i = 0; i < this.count; i++) {
			ImageView iv = new ImageView(context);
			if (currentIndex == i) {
				iv.setImageResource(R.drawable.page_indicator_focused);
			} else {
				iv.setImageResource(R.drawable.page_indicator);
			}
			this.addView(iv);
		}
	}

	/** 设置圆圈数量 **/
	public void setCount(int count) {
		this.count = count;
	}
}

 

Rotate3dAnimation

package org.wp.activity;

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

public class Rotate3dAnimation extends Animation {
	/** 开始旋转的角度 **/
	private final float mFromDegrees;
	/** 旋转结束的角度 **/
	private final float mToDegrees;
	/** 图片中心X坐标 **/
	private final float mCenterX;
	/** 图片中心Y坐标 **/
	private final float mCenterY;
	/** 视角 **/
	private Camera mCamera;

	public Rotate3dAnimation(float fromDegrees, float toDegrees, float centerX, float centerY) {
		this.mFromDegrees = fromDegrees;
		this.mToDegrees = toDegrees;
		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 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();

		if (degrees >= 76.0f) {
			// 旋转角度大于76度保持90度
			degrees = 90.0f;
			camera.save();
			camera.rotateY(degrees);
			camera.getMatrix(matrix);
			camera.restore();
		} else if (degrees <= -76.0f) {
			// 旋转角度小于-76度保持-90度
			degrees = -90.0f;
			camera.save();
			camera.rotateY(degrees);
			camera.getMatrix(matrix);
			camera.restore();
		} else {
			camera.save();
			// 缩小
			camera.translate(0, 0, centerX);
			camera.rotateY(degrees);
			// 旋转产生偏移效果
			camera.translate(0, 0, -centerX);
			camera.getMatrix(matrix);
			camera.restore();
		}

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

 

anim

 

shake.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 
	fromXDelta x轴开始位置
	toXDelta x轴结束位置 
	duration 执行时间 
	interpolator 动画变化率
 -->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
	android:fromXDelta="0" android:toXDelta="10" android:duration="850" android:interpolator="@anim/cycle_5" />

 

cycle_5.xml

<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="5" />

 

 

 

 

分享到:
评论
1 楼 corvin83 2012-05-24  
能吧main。xml发上来吗

相关推荐

    android gallery3D

    在Android平台上,"android gallery3D" 是一个用于创建类似iPhone风格3D图像浏览体验的应用程序。这个项目致力于实现一种视觉上引人入胜且流畅的图片画廊,通过优化和特殊效果处理,降低了图像边缘的锯齿现象,提供...

    Android_Gallery3D源码(已编译)

    《Android_Gallery3D源码解析》 Gallery3D是Android平台上的一款3D图片浏览应用,它展示了Android系统中3D图形处理和图像展示的强大能力。这个应用的源码提供了深入理解Android图形库、线程管理、数据加载优化以及...

    android gallery 3D效果

    在Android平台上,`Gallery`组件曾经是实现3D滚动效果的一种流行方式,它允许用户以横向滑动的方式浏览图片或项目列表,同时提供了一种视觉上的立体感。然而,随着Android版本的更新,`Gallery`组件在API 16...

    android Gallery3D 最新源码

    《Android Gallery3D最新源码解析》 Gallery3D是Android平台上的一款开源3D图片浏览应用,它以其高效、流畅的用户体验和强大的3D渲染能力而受到开发者和用户的喜爱。本文将深入探讨Gallery3D的最新源码,揭示其背后...

    Android Gallery 3D效果

    在Android早期版本中,`Gallery`被广泛用来创建类似相册的3D效果,尽管在API 16之后,它被`GridView`和`RecyclerView`等更灵活的视图替代。然而,通过一些自定义实现,我们仍然可以创建出类似`Gallery 3D`的效果。 ...

    android Gallery3D

    《Android Gallery3D:探索3D画廊的源码世界》 在移动设备上,用户界面的创新一直是吸引用户的关键因素之一。Android Gallery3D,正如其名,是一款基于Android平台的3D图像浏览应用,它为用户带来了全新的图片浏览...

    android Gallery 3d 图片浏览 oom

    在Android开发中,"android Gallery 3d 图片浏览 oom"是一个常见的问题,尤其是在处理大量图片时。oom,全称是Out Of Memory,即内存溢出错误,当应用程序分配的内存超过系统能提供的范围时,就会触发这个错误。本文...

    Android Gallery 3D

    **Android Gallery 3D 深度解析** Android Gallery 3D 是一款专为Android操作系统设计的三维图像浏览应用,它提供了高效的图片管理和流畅的3D浏览体验。这款经过优化的应用旨在提升用户在查看和管理手机照片时的...

    android gallery 3d

    【Android Gallery 3D】是一款基于Android平台的3D相册应用,它为用户提供了一种独特的方式来展示和浏览他们的照片集。这个应用以其创新的3D界面和流畅的用户体验而受到许多开发者的关注。Gallery 3D展示了Android...

    android 的gallery3d

    **Android的Gallery3D详解** Gallery3D是Android操作系统中的一款强大的3D图像查看应用,专为用户提供了独特的三维浏览体验。它不仅是一款高效的图片管理工具,还利用了Android设备的硬件加速功能,实现了流畅的3D...

    android gallery3d 效果源码

    如果你想快速实现这个效果那么直接拷过去就可以运行了

    Android Gallery3D效果 教程 案例 代码

    在Android开发中,`Gallery3D`是一种实现3D效果的滚动视图,它允许用户在多个项目之间进行平滑的3D切换,通常用于图片画廊或应用选择器等场景。下面我们将深入探讨如何创建和自定义一个Android `Gallery3D`效果。 ...

    Android控件开发之Gallery3D酷炫效果(带源码)

    Android控件开发之Gallery3D酷炫效果(带源码),功能简单,欢迎下载

    安卓Android源码——Gallery3D.zip

    《深入剖析Android Gallery3D源码》 在Android操作系统中,Gallery3D是一款经典的图片浏览应用,它以其高效、流畅的用户体验而广受好评。本文将深入探讨Gallery3D的源码,帮助开发者理解其背后的实现原理,进一步...

    android Gallery 3d实现无限循环播放 用做广告板最后了

    在Android开发中,`Gallery`组件是一个非常有用的控件,它可以用来展示一系列的图片或其它内容,用户可以左右滑动来浏览。然而,原生的`Gallery`在Android API Level 16(Jelly Bean)之后已被废弃。尽管如此,...

    android 动态向Gallery中添加图片及倒影&&3D;效果

    总的来说,动态向`Gallery`中添加图片并实现倒影和3D效果是一个结合了Android UI设计、图像处理和动画技术的任务。通过以上步骤,你可以创建出一个既美观又互动性强的图片浏览界面。当然,实际开发中可能还需要考虑...

    Android Gellary3D 源码

    - **com.example.gallery3d.app**: 应用的主要逻辑,包括Activity、Fragment和其他核心类。 - **com.example.gallery3d.data**: 数据模型和数据加载相关的类,如图片数据结构、数据库访问等。 - **...

    android Grallery3D

    《Android Gallery3D深度解析》 Gallery3D是Android系统中的一个高性能图片浏览应用,它以其流畅的3D效果和高效的图片加载能力而备受开发者关注。本文将对Gallery3D进行深入探讨,揭示其背后的原理和技术实现。 1....

    android2.2 gallery3d源码

    android gallery3d源码,我测试过了,可以正常运行,希望对大家有用。

Global site tag (gtag.js) - Google Analytics