【Android界面实现】自定义Gallery控件实现简单3D图片浏览器

本篇文章主要介绍如何使用自定义的Gallery控件,实现3D效果的图片浏览器的效果。

话不多说,先看效果。

上面是一个自定义的Gallery控件,实现倒影和仿3D的效果,下面是一个图片查看器,点击上面的小图片,可以在下面查看大图片。

下面重点说一下,实现图片查看器的思路。

1.手机中图片路径的获取

首先,先不管图片如何展示,如果我们想实现图片查看器的功能,我们首先需要做的是获取到所有的图片的路径信息,只有这样,,我们才能实现对图片的查看。

我们可以使用下面的代码实现

private List<String> getImagesFromSD() {List<String> imageList = new ArrayList<String>();File f = Environment.getExternalStorageDirectory();if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {f = new File(Environment.getExternalStorageDirectory().toString());} else {Toast.makeText(MainActivity.this, R.string.sdcarderror, Toast.LENGTH_LONG).show();return imageList;}File[] files = f.listFiles();if (files == null || files.length == 0)return imageList;for (int i = 0; i < files.length; i++) {File file = files[i];if (isImageFile(file.getPath()))imageList.add(file.getPath());}return imageList;}

上面这个方法的作用,就是获取SD卡中,所有文件的后缀名满足图片后缀名的文件的路径,然后放到List容器中返回。

isImageFile方法是这样实现的

private boolean isImageFile(String fName) {String end = fName.substring(fName.lastIndexOf(".") + 1, fName.length()).toLowerCase();if (end.equals("jpg") || end.equals("gif") || end.equals("png") || end.equals("jpeg") || end.equals("bmp")) {return true;}return false;}2.上方小图片3D效果展示的实现

在完成了图片路径的获取之后,我们下面要做的就是将图片展示在上面的有3D效果的自定义Gallery控件上面。现在版本中Gallery控件已经不再推荐使用,取而代之的ViewPager和HorizonalScrollView控件。

下面介绍具有自定义Gallery控件的实现

/** * 3D效果Gallery实现 * * @time 2014年6月26日 下午9:10:47 */@SuppressWarnings("deprecation")public class GalleryFlow extends Gallery {private Camera mCamera = new Camera();// 两侧图片最大旋转角度private int mMaxRotationAngle = 60;private int mMaxZoom = -120;private int mCoveflowCenter;public GalleryFlow(Context context) {super(context);this.setStaticTransformationsEnabled(true);}public GalleryFlow(Context context, AttributeSet attrs) {super(context, attrs);this.setStaticTransformationsEnabled(true);}public GalleryFlow(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);this.setStaticTransformationsEnabled(true);}// 设置最大旋转角public void setMaxRotationAngle(int maxRotationAngle) {mMaxRotationAngle = maxRotationAngle;}// 获取当前控件中心点x轴位置private int getCenterOfCoverflow() {return (getWidth() – getPaddingLeft() – getPaddingRight()) / 2 + getPaddingLeft();}// 获取view控件的x轴位置private static int getCenterOfView(View view) {return view.getLeft() + view.getWidth() / 2;}// 默认返回值是false,若设置城true,则每次gallery生成子控件的时候,都会调用这个方法,所以我们可以将返回值设置为true,然后完成child的旋转等变形操作protected boolean getChildStaticTransformation(View child, Transformation t) {final int childCenter = getCenterOfView(child);final int childWidth = child.getWidth();int rotationAngle = 0;t.clear();t.setTransformationType(Transformation.TYPE_MATRIX);// 如果child控件在中心位置,则不旋转if (childCenter == mCoveflowCenter) {transformImageBitmap((ImageView) child, t, 0);} else {// 否则,将当前child控件旋转一定角度rotationAngle = (int) (((float) (mCoveflowCenter – childCenter) / childWidth) * mMaxRotationAngle);if (Math.abs(rotationAngle) > mMaxRotationAngle) {rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle : mMaxRotationAngle;}transformImageBitmap((ImageView) child, t, rotationAngle);}return true;}//重新计算控件的x轴位置protected void onSizeChanged(int w, int h, int oldw, int oldh) {mCoveflowCenter = getCenterOfCoverflow();super.onSizeChanged(w, h, oldw, oldh);}// 将child控件旋转rotationAngle方法的实现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);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();}}

3.实现Adapter,完成倒影效果

要完成倒映效果,我们需要在getView方法中,对穿进来的图片进行处理,具体代码如下

困难与折磨对于人来说,是一把打向坯料的锤,

【Android界面实现】自定义Gallery控件实现简单3D图片浏览器

相关文章:

你感兴趣的文章:

标签云: