- 浏览: 259750 次
- 性别:
- 来自: 太原
-
最新评论
-
kinglo:
请问生成的文件怎么看?
Android 全局异常处理 -
yong7356:
学习一下。。。。。
Android Ant -
bzlring:
很好
Android 全局异常处理 -
M985300651:
難得一見的好教學
Android 自定义滚动视图 -
i5suoi:
thank you very much
Android 全局异常处理
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" />
发表评论
-
Android 自定义Gallery
2011-10-19 21:33 2974MainActivity package org.wp.ac ... -
Android 3D图片切换
2011-10-14 17:19 3636MainActivity package org.wp.ac ... -
Android C2DM
2011-10-07 16:36 2329AndroidC2DMDemo com.google. ... -
Android Ant
2011-10-03 20:31 3056build.xml <?xml version=&qu ... -
Android 电视关机动画
2011-09-14 13:28 1910MainActivity package org.wp.ac ... -
Android 图片倒影
2011-09-09 11:07 6465MainActivity package org.wp.ac ... -
Android 自定义滚动视图
2011-09-08 15:03 7006MainActivity package org.wp.ac ... -
Android 绘制心形
2011-09-06 15:18 6823MyLove package org.wp.activity ... -
Android 播放音频文件
2011-09-05 16:31 5872MainActivity package org.wp.ac ... -
Android 添加自定义SurfaceView
2011-08-29 17:19 7592MainActivity package org.wp.ac ... -
Android Looper
2011-08-28 11:10 2345LooperActivity package org.wp. ... -
Android AsyncTask
2011-08-27 15:21 1598AsyncTaskActivity package org. ... -
Android TimerTask
2011-08-26 22:16 4610TimerTaskActivity package org. ... -
Android Thread
2011-08-26 13:59 5747ThreadActivity package org.wp. ... -
Android 判断程序前后台状态
2011-08-25 13:26 6928AppStatusService package org.w ... -
注册界面
2011-08-23 20:57 1257MainActivity package org.wp.ac ... -
Android 半透明(二)
2011-08-18 20:02 1564TranslucentBlurActivity packag ... -
Android 半透明(一)
2011-08-18 17:08 1733TranslucentActivity package or ... -
游戏角色在屏幕行走
2011-08-18 11:32 1295MySurfaceView package org.wp.a ... -
Android SurfaceView基础
2011-08-17 15:01 1717MySurfaceView package org.wp.a ...
相关推荐
在Android平台上,"android gallery3D" 是一个用于创建类似iPhone风格3D图像浏览体验的应用程序。这个项目致力于实现一种视觉上引人入胜且流畅的图片画廊,通过优化和特殊效果处理,降低了图像边缘的锯齿现象,提供...
《Android_Gallery3D源码解析》 Gallery3D是Android平台上的一款3D图片浏览应用,它展示了Android系统中3D图形处理和图像展示的强大能力。这个应用的源码提供了深入理解Android图形库、线程管理、数据加载优化以及...
在Android平台上,`Gallery`组件曾经是实现3D滚动效果的一种流行方式,它允许用户以横向滑动的方式浏览图片或项目列表,同时提供了一种视觉上的立体感。然而,随着Android版本的更新,`Gallery`组件在API 16...
《Android Gallery3D最新源码解析》 Gallery3D是Android平台上的一款开源3D图片浏览应用,它以其高效、流畅的用户体验和强大的3D渲染能力而受到开发者和用户的喜爱。本文将深入探讨Gallery3D的最新源码,揭示其背后...
在Android早期版本中,`Gallery`被广泛用来创建类似相册的3D效果,尽管在API 16之后,它被`GridView`和`RecyclerView`等更灵活的视图替代。然而,通过一些自定义实现,我们仍然可以创建出类似`Gallery 3D`的效果。 ...
《Android Gallery3D:探索3D画廊的源码世界》 在移动设备上,用户界面的创新一直是吸引用户的关键因素之一。Android Gallery3D,正如其名,是一款基于Android平台的3D图像浏览应用,它为用户带来了全新的图片浏览...
在Android开发中,"android Gallery 3d 图片浏览 oom"是一个常见的问题,尤其是在处理大量图片时。oom,全称是Out Of Memory,即内存溢出错误,当应用程序分配的内存超过系统能提供的范围时,就会触发这个错误。本文...
**Android Gallery 3D 深度解析** Android Gallery 3D 是一款专为Android操作系统设计的三维图像浏览应用,它提供了高效的图片管理和流畅的3D浏览体验。这款经过优化的应用旨在提升用户在查看和管理手机照片时的...
【Android Gallery 3D】是一款基于Android平台的3D相册应用,它为用户提供了一种独特的方式来展示和浏览他们的照片集。这个应用以其创新的3D界面和流畅的用户体验而受到许多开发者的关注。Gallery 3D展示了Android...
**Android的Gallery3D详解** Gallery3D是Android操作系统中的一款强大的3D图像查看应用,专为用户提供了独特的三维浏览体验。它不仅是一款高效的图片管理工具,还利用了Android设备的硬件加速功能,实现了流畅的3D...
如果你想快速实现这个效果那么直接拷过去就可以运行了
在Android开发中,`Gallery3D`是一种实现3D效果的滚动视图,它允许用户在多个项目之间进行平滑的3D切换,通常用于图片画廊或应用选择器等场景。下面我们将深入探讨如何创建和自定义一个Android `Gallery3D`效果。 ...
Android控件开发之Gallery3D酷炫效果(带源码),功能简单,欢迎下载
《深入剖析Android Gallery3D源码》 在Android操作系统中,Gallery3D是一款经典的图片浏览应用,它以其高效、流畅的用户体验而广受好评。本文将深入探讨Gallery3D的源码,帮助开发者理解其背后的实现原理,进一步...
在Android开发中,`Gallery`组件是一个非常有用的控件,它可以用来展示一系列的图片或其它内容,用户可以左右滑动来浏览。然而,原生的`Gallery`在Android API Level 16(Jelly Bean)之后已被废弃。尽管如此,...
总的来说,动态向`Gallery`中添加图片并实现倒影和3D效果是一个结合了Android UI设计、图像处理和动画技术的任务。通过以上步骤,你可以创建出一个既美观又互动性强的图片浏览界面。当然,实际开发中可能还需要考虑...
- **com.example.gallery3d.app**: 应用的主要逻辑,包括Activity、Fragment和其他核心类。 - **com.example.gallery3d.data**: 数据模型和数据加载相关的类,如图片数据结构、数据库访问等。 - **...
《Android Gallery3D深度解析》 Gallery3D是Android系统中的一个高性能图片浏览应用,它以其流畅的3D效果和高效的图片加载能力而备受开发者关注。本文将对Gallery3D进行深入探讨,揭示其背后的原理和技术实现。 1....
android gallery3d源码,我测试过了,可以正常运行,希望对大家有用。