package com.test.photo; 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 GalleryFlow extends Gallery { // 创建Camera对象 private Camera mCamera = new Camera(); // 最大旋转角度 private int mMaxRotateAngle = 60; // 最大缩放值 private int mMaxZoom = -120; private int mCoverflowCenter; public GalleryFlow(Context context) { super(context); setStaticTransformationsEnabled(true); } public GalleryFlow(Context context, AttributeSet attrs) { super(context, attrs); setStaticTransformationsEnabled(true); } public GalleryFlow(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setStaticTransformationsEnabled(true); } // 获得gallery展示图片的中心点 public int getCenterOfCoverflow() { return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2 + getPaddingLeft(); } // 获得图片中心点 public int getCenterOfView(View view) { return view.getLeft() + view.getWidth() / 2; } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { mCoverflowCenter = getCenterOfCoverflow(); super.onSizeChanged(w, h, oldw, oldh); } // 控制gallery中每个图片的旋转 @Override protected boolean getChildStaticTransformation(View child, Transformation t) { // 得到图片的重心点 final int childCenter = getCenterOfView(child); final int width = child.getLayoutParams().width; // 旋转角度 int rotationAngle = 0; //重置转换状态 t.clear(); //设置转换类型 t.setTransformationType(Transformation.TYPE_MATRIX); //如果图片位于中心位置不需要进行旋转 if (childCenter == mCoverflowCenter) { transformImageBitmap((ImageView) child, t, 0); } else { //根据图片在gallery中的位置来计算图片的旋转角度 rotationAngle = (int) ((float) (mCoverflowCenter - childCenter) / width * mMaxRotateAngle); //如果旋转角度绝对值大于最大旋转角度返回(-mMaxRotationAngle或mMaxRotationAngle;) if (Math.abs(rotationAngle) > mMaxRotateAngle) { rotationAngle = rotationAngle < 0 ? -mMaxRotateAngle : mMaxRotateAngle; } transformImageBitmap((ImageView) child, t, rotationAngle); } return true; } // 图片变形 private void transformImageBitmap(ImageView child, Transformation t, int rotateAngle) { // 保存图像变换的效果 mCamera.save(); final Matrix matrix = t.getMatrix(); // 图片高度 final int imageHeight = child.getLayoutParams().height; // 图片宽度 final int imageWidth = child.getLayoutParams().width; // 返回旋转角度的绝对值 final int rotation = Math.abs(rotateAngle); // 在Z轴上正向移动camera的视角,实际效果为放大图片。 // 如果在Y轴上移动,则图片上下移动;X轴上对应图片左右移动。 mCamera.translate(0.0f, 0.0f, 100.0f); if (rotation < mMaxRotateAngle) { float zoom = (float) ((rotation * 1.5) + mMaxZoom); mCamera.translate(0.0f, 0.0f, zoom); child.setAlpha((int) (255 - rotation * 2.5)); } /// 在Y轴上旋转,对应图片竖向向里翻转。 // 如果在X轴上旋转,则对应图片横向向里翻转。 mCamera.rotateY(rotateAngle); mCamera.getMatrix(matrix); matrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2)); matrix.postTranslate((imageWidth / 2), (imageHeight / 2)); // 还原 mCamera.restore(); } }
package com.test.photo; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Shader.TileMode; import android.graphics.drawable.BitmapDrawable; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; public class ImageAdapter extends BaseAdapter { private Context mContext; private int[] mImageIds; private ImageView[] mImages; public ImageAdapter(Context context, int[] imageIds) { this.mContext = context; this.mImageIds = imageIds; mImages = new ImageView[imageIds.length]; } @Override public int getCount() { return mImages.length; } @Override public Object getItem(int position) { return mImages[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { return mImages[position]; } // 生成带有倒影效果的图片 public boolean createReflectedImages() { // 原图片与倒影之间的距离 final int reflectionGap = 4; int index = 0; for (int imageId : mImageIds) { // 原图片 Bitmap originalImage = BitmapFactory.decodeResource( mContext.getResources(), imageId); int width = originalImage.getWidth(); int height = originalImage.getHeight(); // 创建矩阵对象 Matrix matrix = new Matrix(); 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 defaultpaint = new Paint(); canvas.drawRect(0, height, width, height + reflectionGap, defaultpaint); // 绘制倒影图片 canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); LinearGradient shader = new LinearGradient(0, height, 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70FFFFFF, 0x00FFFFFF, TileMode.MIRROR); // 着色器 用来绘制颜色 上色的 paint.setShader(shader); canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); // 创建一个ImageView用来显示已经画好的bitmapWithReflection ImageView imageView = new ImageView(mContext); BitmapDrawable bd = new BitmapDrawable(bitmapWithReflection); // 消除图片锯齿效果 bd.setAntiAlias(true); imageView.setImageDrawable(bd); // 设置图片的大小 imageView.setLayoutParams(new GalleryFlow.LayoutParams(160, 240)); mImages[index++] = imageView; } return true; } }
package com.test.photo; import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { private GalleryFlow mGalleryFlow; private int[] imageIds = new int[] { R.drawable.nba_1, R.drawable.nba_2, R.drawable.nba_3, R.drawable.nba_4, R.drawable.nba_5, R.drawable.nba_6, R.drawable.nba_7, R.drawable.nba_8, R.drawable.nba_9, R.drawable.nba_10,}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViews(); initViews(); } private void findViews() { mGalleryFlow = (GalleryFlow) findViewById(R.id.gf); } private void initViews() { ImageAdapter adapter = new ImageAdapter(this, imageIds); // 生成带有倒影效果的图片 adapter.createReflectedImages(); mGalleryFlow.setAdapter(adapter); } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:background="@android:color/black" > <com.test.photo.GalleryFlow android:id="@+id/gf" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
相关推荐
这篇文档将深入解析《Android 3D相册图片滑动+倾斜+放大+倒影处理源码》这一项目,这是一个适合计算机专业学生进行毕业设计学习的Android应用源码示例。我们将探讨其中的关键技术点,包括3D效果实现、图片滑动交互、...
android 3d grally的代码,实现3D相册功能
在Android平台上,开发一款引人入胜的3D相册应用可以极大地提升用户体验。"android 3d相册"源码提供了一个实现此类功能的实例,对于开发者来说,这是一个宝贵的资源,可以用来学习如何在Android上创建具有立体视觉...
本项目名为"android 3D相册完美实现",它展示了如何将普通的相册功能提升到一个新的维度,包括立体滑动和透明阴影等特效。 首先,3D相册的核心在于实现图片的三维旋转和平移。这通常涉及到Android的`ImageView`或...
"Android 3D相册图片滑动+倾斜+放大+倒影处理源码"是一个专门针对这一需求的解决方案,它提供了丰富的3D效果,使得用户在浏览相册时能感受到更加生动、立体的视觉体验。 首先,我们要理解3D相册的核心概念。在...
android 供学习 3D 相册开发
超炫的android 3d相册
这篇内容将深入解析《Android 3D相册图片滑动+倾斜+放大+倒影处理源码》这一项目,帮助你理解如何在Android平台上实现一个功能丰富的3D相册应用。我们将探讨涉及到的关键技术点,包括图像处理、手势检测、动画效果...
这个"Android 3D相册图片滑动+倾斜+放大+倒影处理源码"提供了实现此类高级视觉效果的方法。下面将详细探讨这个源码中的关键知识点。 1. **3D相册效果**:此源码实现了3D翻转效果,让用户在浏览相册时仿佛在操作真实...
在Android平台上,开发一款3D相册应用可以提供独特的用户体验,让图片浏览变得更加生动有趣。本资源提供的"android 3D相册 无错误源码"是一个完整的、经过验证的项目,适合开发者学习或者直接应用于自己的项目中。...
在Android开发中,创建一个具有视觉吸引力的3D相册是一项挑战,但通过巧妙地结合各种技术,可以实现像标题中描述的那样——3D相册图片滑动、倾斜、放大以及倒影处理。这个源码项目正是为了解决这个问题,提供了一种...
Android 3D相册实现demo
本项目"Android3D相册图片滑动-倾斜-放大-倒影处理源码"提供了一种创新的方式,使用户可以以3D效果浏览相册,增强了视觉效果和互动性。以下是该项目涉及的关键技术点和实现原理的详细解析。 1. **3D 图片滑动**: ...
Android 3D相册图片滑动+倾斜+放大+倒影处理源码.zip项目安卓应用源码下载Android 3D相册图片滑动+倾斜+放大+倒影处理源码.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司...
在Android平台上,开发一款引人注目的3D相册应用是一项技术挑战,它不仅需要对Android UI组件有深入理解,还要掌握3D图形编程。"android相册3D源码"是一个专为Android设计的3D相册实现,提供了一种独特的方式来展示...
《Android应用源码3D相册》是一款基于Android平台的3D效果相册应用程序,它展示了如何在Android环境中实现复杂的视觉特效,同时提供了一个学习和借鉴的实例。本项目源码主要采用Java语言编写,是Android开发者提升...