直接看代码,自定义gallery,代码大部分是学习的网上的.
附件是demo,有建议欢迎讨论
public class Gallery3D extends Gallery {
private Camera camera = new Camera();// 相机类
private int maxRotationAngle = 60;// 最大转动角度
private int maxZoom = 60;// z方向的移动至,相当于缩放
private int coveflowCenter;// 半径值
private int height;
public Gallery3D(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.setStaticTransformationsEnabled(true);
}
public Gallery3D(Context context, AttributeSet attrs) {
super(context, attrs);
this.setStaticTransformationsEnabled(true);
}
public Gallery3D(Context context) {
super(context);
this.setStaticTransformationsEnabled(true);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
height = getHeight();
}
public int getMaxRotationAngle() {
return maxRotationAngle;
}
public void setMaxRotationAngle(int maxRotationAngle) {
this.maxRotationAngle = maxRotationAngle;
}
public int getMaxZoom() {
return maxZoom;
}
public void setMaxZoom(int maxZoom) {
this.maxZoom = maxZoom;
}
private int getCenterOfCoverflow() {
return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2
+ getPaddingLeft();
}
private static int getCenterOfView(View view) {
System.out.println("view left :" + view.getLeft());
System.out.println("view width :" + view.getWidth());
return view.getLeft() + view.getWidth() / 2;
}
// 控制gallery中每个图片的旋转(重写的gallery中方法)
@Override
protected boolean getChildStaticTransformation(View child, Transformation t) {
// 取得当前子view的半径值
final int childCenter = getCenterOfView(child);
System.out.println("childCenter:" + childCenter);
final int childWidth = child.getWidth();
// 旋转角度
int rotationAngle = 0;
// 重置转换状态
t.clear();
// 设置转换类型
t.setTransformationType(Transformation.TYPE_BOTH);
// 如果图片位于中心位置不需要进行旋转
if (childCenter == coveflowCenter) {
transformImageBitmap((ImageView) child, t, 0);
} else {
// 根据图片在gallery中的位置来计算图片的旋转角度
rotationAngle = (int) (((float) (coveflowCenter - childCenter) / childWidth) * maxRotationAngle);
System.out.println("rotationAngle:" + rotationAngle);
// 如果旋转角度绝对值大于最大旋转角度返回(-mMaxRotationAngle或mMaxRotationAngle;)
if (Math.abs(rotationAngle) > maxRotationAngle) {
rotationAngle = (rotationAngle < 0) ? -maxRotationAngle
: maxRotationAngle;
}
transformImageBitmap((ImageView) child, t, rotationAngle);
}
return true;
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
coveflowCenter = getCenterOfCoverflow();
super.onSizeChanged(w, h, oldw, oldh);
}
private void transformImageBitmap(ImageView child, Transformation t,
int rotationAngle) {
// 对效果进行保存
camera.save();
// 返回旋转角度的绝对值
// final int rotation = Math.abs(rotationAngle);
// 在Z轴上正向移动camera的视角,实际效果为放大图片。
// 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。
camera.translate(0f, 0f, maxZoom);
// // 精确的缩放控制
// if (rotation < mMaxRotationAngle) {
// float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));
// mCamera.translate(0.0f, 0.0f, zoomAmount);
// }
// 如果在Y轴上旋转,对应图片竖向向里翻转。
// 如果在X轴上旋转,对应图片横向向里翻转。
camera.rotateY(rotationAngle);
final Matrix imageMatrix = t.getMatrix();
camera.getMatrix(imageMatrix);
camera.restore();
// 设置旋转中心点
// 图片高度,用的gallery的高度
// 图片宽度,用的图片宽度;这里图片的高度取不到,都是-1,不知道什么原因
final int imageWidth = child.getLayoutParams().width;
imageMatrix.preTranslate(-(imageWidth / 2), -height / 2);
imageMatrix.postTranslate((imageWidth / 2), height / 2);
camera.save();
}
}
分享到:
相关推荐
在Android平台上,"android gallery3D" 是一个用于创建类似iPhone风格3D图像浏览体验的应用程序。这个项目致力于实现一种视觉上引人入胜且流畅的图片画廊,通过优化和特殊效果处理,降低了图像边缘的锯齿现象,提供...
在Android平台上,`Gallery`组件曾经是实现3D滚动效果的一种流行方式,它允许用户以横向滑动的方式浏览图片或项目列表,同时提供了一种视觉上的立体感。然而,随着Android版本的更新,`Gallery`组件在API 16...
**Android Gallery3D详解** Gallery3D是Android平台上的一款高性能图片浏览器应用,它以其流畅的3D滚动效果和优秀的用户体验而备受赞誉。本篇将深入探讨Gallery3D的源代码,解析其背后的实现原理和技术细节。 ### ...
《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_Gallery3D源码解析》 Gallery3D是Android平台上的一款3D图片浏览应用,它展示了Android系统中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源码,我测试过了,可以正常运行,希望对大家有用。