- 浏览: 156671 次
- 性别:
- 来自: 北京
最新评论
-
cys1314:
java 实现的公式计算 -
qq408170918:
楼主 请问下 “zip压缩包式皮肤” 这个 要怎么解压 怎么读 ...
应用换肤实现思路总结 -
蕾恩love:
Exception in thread "main& ...
Hadoop远程开发 -
unimme:
刚刚接触Jetty收-藏-了
jetty嵌入式配置总结 -
liuxuejin:
demo在那里呢??
aac解码器之郁闷
看了看效果,跑了一下。感觉还不错。
作者不知道是谁了,收藏一下:
Gallery3DActivity
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; import com.zgy.android.view.MyGalleryView; public class Gallery3DActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_gallery); Integer[] images = { R.drawable.sample_5, R.drawable.sample_7, R.drawable.sample_5, R.drawable.sample_7, R.drawable.sample_5, R.drawable.sample_7, R.drawable.sample_5, R.drawable.sample_7 }; ImageAdapter adapter = new ImageAdapter(this, images); adapter.createReflectedImages();// 创建倒影效果 MyGalleryView galleryFlow = (MyGalleryView) this.findViewById(R.id.Gallery01); galleryFlow.setFadingEdgeLength(0); galleryFlow.setSpacing(-100); // 图片之间的间距 galleryFlow.setAdapter(adapter); galleryFlow.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(getApplicationContext(), String.valueOf(position), Toast.LENGTH_SHORT).show(); } }); galleryFlow.setSelection(4); } }
ImageAdapter.java
import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuffXfermode; import android.graphics.Bitmap.Config; import android.graphics.Shader.TileMode; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import com.zgy.android.view.MyGalleryView; public class ImageAdapter extends BaseAdapter { int mGalleryItemBackground; private Context mContext; private Integer[] mImageIds; private ImageView[] mImages; public ImageAdapter(Context c, Integer[] ImageIds) { mContext = c; mImageIds = ImageIds; mImages = new ImageView[mImageIds.length]; } /** * 创建倒影效果 * * @return */ public boolean createReflectedImages() { // 倒影图和原图之间的距离 final int reflectionGap = 4; int index = 0; for (int imageId : mImageIds) { // 返回原图解码之后的bitmap对象 Bitmap originalImage = BitmapFactory.decodeResource(mContext.getResources(), imageId); int width = originalImage.getWidth(); int height = originalImage.getHeight(); // 创建矩阵对象 Matrix matrix = new Matrix(); // 指定一个角度以0,0为坐标进行旋转 // matrix.setRotate(30); // 指定矩阵(x轴不变,y轴相反) matrix.preScale(1, -1); // 将矩阵应用到该原图之中,返回一个宽度不变,高度为原图1/2的倒影位图 Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height / 2, width, height / 2, matrix, false); // 创建一个宽度不变,高度为原图+倒影图高度的位图 Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2), Config.ARGB_8888); // 将上面创建的位图初始化到画布 Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(originalImage, 0, 0, null); Paint deafaultPaint = new Paint(); deafaultPaint.setAntiAlias(false); // canvas.drawRect(0, height, width, height + reflectionGap,deafaultPaint); canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint(); paint.setAntiAlias(false); /** * 参数一:为渐变起初点坐标x位置, 参数二:为y轴位置, 参数三和四:分辨对应渐变终点, 最后参数为平铺方式, * 这里设置为镜像Gradient是基于Shader类,所以我们通过Paint的setShader方法来设置这个渐变 */ LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.MIRROR); // 设置阴影 paint.setShader(shader); paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.DST_IN)); // 用已经定义好的画笔构建一个矩形阴影渐变效果 canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()+ reflectionGap, paint); // 创建一个ImageView用来显示已经画好的bitmapWithReflection ImageView imageView = new ImageView(mContext); imageView.setImageBitmap(bitmapWithReflection); // 设置imageView大小 ,也就是最终显示的图片大小 imageView.setLayoutParams(new MyGalleryView.LayoutParams(300, 400)); // imageView.setScaleType(ScaleType.MATRIX); mImages[index++] = imageView; } return true; } @SuppressWarnings("unused") private Resources getResources() { return null; } public int getCount() { return mImageIds.length; } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { return mImages[position]; } public float getScale(boolean focused, int offset) { return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset))); } }
这个类里的倒影效果挺有意思的。
MyGalleryView.java
import android.content.Context; import android.graphics.Camera; import android.graphics.Matrix; import android.util.AttributeSet; import android.view.View; import android.view.animation.Transformation; import android.widget.Gallery; import android.widget.ImageView; public class MyGalleryView extends Gallery { private Camera mCamera = new Camera();// 相机类 private int mMaxRotationAngle = 60;// 最大转动角度 private int mMaxZoom = -300;// //最大缩放值 private int mCoveflowCenter;// 半径值 public MyGalleryView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.setStaticTransformationsEnabled(true); } public MyGalleryView(Context context, AttributeSet attrs) { super(context, attrs); this.setStaticTransformationsEnabled(true); } public MyGalleryView(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); } public int getMaxRotationAngle() { return mMaxRotationAngle; } public void setMaxRotationAngle(int maxRotationAngle) { mMaxRotationAngle = maxRotationAngle; } public int getMaxZoom() { return mMaxZoom; } public void setMaxZoom(int maxZoom) { mMaxZoom = 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_MATRIX); // 如果图片位于中心位置不需要进行旋转 if (childCenter == mCoveflowCenter) { transformImageBitmap((ImageView) child, t, 0); } else { // 根据图片在gallery中的位置来计算图片的旋转角度 rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle); System.out.println("rotationAngle:" + rotationAngle); // 如果旋转角度绝对值大于最大旋转角度返回(-mMaxRotationAngle或mMaxRotationAngle;) if (Math.abs(rotationAngle) > mMaxRotationAngle) { rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle : mMaxRotationAngle; } transformImageBitmap((ImageView) child, t, rotationAngle); } return true; } protected void onSizeChanged(int w, int h, int oldw, int oldh) { mCoveflowCenter = getCenterOfCoverflow(); super.onSizeChanged(w, h, oldw, oldh); } private void transformImageBitmap(ImageView child, Transformation t, int rotationAngle) { // 对效果进行保存 mCamera.save(); final Matrix imageMatrix = t.getMatrix(); // 图片高度 final int imageHeight = child.getLayoutParams().height; // 图片宽度 final int imageWidth = child.getLayoutParams().width; // 返回旋转角度的绝对值 final int rotation = Math.abs(rotationAngle); // 在Z轴上正向移动camera的视角,实际效果为放大图片。 // 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。 mCamera.translate(0.0f, 0.0f, 100.0f); // As the angle of the view gets less, zoom in if (rotation < mMaxRotationAngle) { float zoomAmount = (float) (mMaxZoom + (rotation * 1.5)); mCamera.translate(0.0f, 0.0f, zoomAmount); } // 在Y轴上旋转,对应图片竖向向里翻转。 // 如果在X轴上旋转,则对应图片横向向里翻转。 mCamera.rotateY(rotationAngle); mCamera.getMatrix(imageMatrix); imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2)); imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2)); mCamera.restore(); } }
这个类主要控制图片角度移动。
发表评论
-
方便好用的自定义按钮按下效果
2013-07-01 12:08 1403public static StateListDrawabl ... -
分享一下
2013-03-08 17:43 1124http://www.cnblogs.com/DreamSea ... -
aac解码器之郁闷(二)
2012-08-21 15:05 5863扫盲 AAC实际上是高级音频编码的缩写, ... -
flash打包
2012-06-29 12:40 1380輕鬆學會用Adobe Flash ... -
Activity的启动模式(android:launchMode)
2012-05-16 10:31 1399standard 每次都会新建,每个Task都可以有, ... -
报表,折线图
2012-04-10 13:14 1440前几天为了实现类window资源管理器的效果实现了这个折线图。 ... -
复合ListView
2012-04-10 13:11 1696前几天写的复杂ListView的实现方式。 使用的场景: ... -
View 3D旋转
2012-04-10 13:08 1588没事自己写的: package com.zgy.and ... -
取得系统支持的所有音频格式
2012-03-14 20:54 1290try { // Method method = Cla ... -
handler源码分析
2012-03-01 21:24 1623昨天研究了一下Handler的源码,今天总结一下: a ... -
很久发博客了,发个最近写的一个方法吧。
2012-01-05 22:08 1193/** * 设定按钮动作 * @param nor ... -
自定义绝对布局的实现
2012-01-05 22:01 2371android 绝对布局已经过期了为了保证稳定性自定义了一个绝 ... -
aac解码器之郁闷
2011-10-07 10:52 2544扫盲 AAC实际上是高级音频编码的缩写,它是M ... -
91手机助手、豌豆荚自动安装驱动实现方式技术调研总结
2011-07-30 23:37 7960本帖强烈要求扔砖头。 因为工作需要调研一下91手机助手 ... -
换肤实现思路(二)
2011-07-09 12:31 2486以前写过一个关于皮肤的换肤思路的博客。但那个里边主要是针对于资 ... -
ContentProvider的实现
2011-07-09 12:28 3362这几天有些忙,要做关于访问exchange服务器的技术调研,环 ... -
应用换肤实现思路总结
2011-07-01 23:14 3995注:以下所有言论纯属个人主观分析。 换肤解决方案:1. ... -
widget开发实例代码
2011-06-28 21:44 1689其实创建一个widget很简单。这里就做了一个简单的demo, ... -
android应用之--我的微博
2011-06-26 15:53 1565用了一个周六周日,做了一个简单的新浪微博。后续功能还要加入腾讯 ... -
androidpn的一次亲密接触(二)
2011-06-22 22:46 6401简单看了一下源码的实现,这里贴一点个人觉得比叫重要的代码。 ...
相关推荐
在本案例中,"Gallery实现了3D效果"意味着开发者通过自定义或者利用第三方库对原生`Gallery`进行了扩展,增加了立体、动态的视觉体验,使得图片浏览变得更加生动和吸引人。 首先,我们来详细了解一下`Gallery`的...
在Android平台上,`Gallery`组件曾经是实现3D滚动效果的一种流行方式,它允许用户以横向滑动的方式浏览图片或项目列表,同时提供了一种视觉上的立体感。然而,随着Android版本的更新,`Gallery`组件在API 16...
在Android早期版本中,`Gallery`被广泛用来创建类似相册的3D效果,尽管在API 16之后,它被`GridView`和`RecyclerView`等更灵活的视图替代。然而,通过一些自定义实现,我们仍然可以创建出类似`Gallery 3D`的效果。 ...
在Android开发领域,创建引人入胜的用户体验是至关重要的,而3D Gallery效果就是一种能够提升用户界面吸引力的技术。标题“非常不错的倒影的3d gallery效果”提及的是一种结合了倒影与3D视图变换的图片浏览组件,它...
在标题"gallery 3D效果"和描述"自定义gallery ,实现3D效果图片展示,带图片倒影"中,我们可以理解为这是一个通过自定义扩展Gallery控件,实现了具有3D视觉效果和图片倒影功能的项目。 要实现这样的3D效果,开发者...
"Gallery 3D效果"是一种视觉上引人入胜的图像展示技术,灵感来源于iOS平台上的CoverFlow组件。这种效果通常用于创建一个动态且交互式的画廊,让用户能够以3D方式浏览图片,增强了用户体验。在Android开发中,实现...
《Gallery3D效果详解》 Gallery3D效果是Android平台上的一种高级图像展示技术,它以其流畅的动画效果、丰富的交互性和高效的数据管理机制,为用户提供了卓越的图像浏览体验。在移动设备上,Gallery3D能够实现类似...
本项目"Gallery实现3D效果滑动"正是针对这种情况,通过自定义Gallery来实现一种更具视觉吸引力的3D滑动效果,使得用户在浏览图片时能体验到类似iPhone的3D立体感。 首先,我们来了解自定义Gallery的基础概念。在...
本教程将详细讲解如何动态地向`Gallery`中添加图片,并实现倒影与3D翻转效果,使应用的用户体验更加丰富和生动。 首先,`Gallery`是Android提供的一个滚动视图,类似于iOS中的`UIPickerView`。它允许用户通过水平...
"3D滑动页面效果关联gallery滑动"是一个高级交互设计,它利用ViewPager组件和自定义布局来实现3D翻页效果,并与Gallery组件进行联动,为用户提供更加直观且富有立体感的浏览体验。以下将详细介绍这一技术的实现过程...
标题"3D Interactive Gallery XML Flash(3D图片展示--很酷的效果)"暗示了这项技术的核心特点:通过Flash实现的3D效果和基于XML的数据驱动。Flash是一种流行的多媒体开发平台,它可以创建丰富的互动内容,包括动画、...
3. 动画优化:Gallery3D的动画效果平滑而自然,这得益于对动画帧率的控制和GPU加速的使用。 五、扩展性与可定制性 Gallery3D的源码设计考虑了可扩展性,开发者可以方便地自定义数据源、图片加载策略、UI样式等。...
Android控件开发之Gallery3D酷炫效果(带源码),功能简单,欢迎下载
《Android控件Gallery3D效果实现详解》 在Android应用开发中,为了提供更丰富的用户交互体验,常常会使用到一些特殊效果的控件。其中,Gallery3D效果就是一个非常吸引眼球的设计,它能实现类似3D翻转的图片浏览体验...
在这个"Gallery 3D效果的程序"中,我们将深入探讨如何利用编程技术实现这种效果,以及在处理图片时的关键点。 1. **Gallery组件介绍**: Gallery是Android SDK中的一个视图组件,主要用于展示可滚动的项目列表,...
这个3D Gallery效果的实现基于对Android系统的深入理解和熟练运用,主要涉及到以下几个关键知识点: 1. **自定义View**:Android系统允许开发者自定义View或ViewGroup,以满足特定的需求。在这个案例中,开发者创建...
**Android的Gallery3D详解** Gallery3D是Android操作系统中的一款强大的3D图像查看应用,专为用户提供了独特的三维浏览体验。它不仅是一款高效的图片管理工具,还利用了Android设备的硬件加速功能,实现了流畅的3D...