Android之绚丽的图片游览效果--有点像W7效果,透明的倒影,层叠的图片,渐变的颜色透明度

本文主要是介绍Android之绚丽的图片游览效果--有点像W7效果,透明的倒影,层叠的图片,渐变的颜色透明度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自http://blog.csdn.net/kkfdsa132/article/details/6408052

这里转载一个牛人的博客:http://www.cnblogs.com/tankaixiong/archive/2011/02/24/1964340.html

          下面,是我参照他的博客实现的一个效果图。这个程序,在他的基础上进行了一些改良,但改良得不是很好,嘻嘻,等有空,继续研究。该实例下载路径:http://download.csdn.net/source/3275783

          (一)截图

             

       (二)实现关键:

          1、改写Gallery,实现图片的层叠和透明度渐变。 主要是改写getChildStaticTransformation方法

          2、对图片进行加工处理,实现透明倒影。

          3、对于超大图片,先进行缩小。防止图片过大,超出屏幕范围报错。

       (三)代码

          1、Activity类代码:GallaryBrowser.java

          

[java] view plaincopy
  1. package com.myandroid.test;  
  2.   
  3.   
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.ImageSwitcher;  
  8. import android.widget.ImageView;  
  9. import android.widget.Gallery.LayoutParams;  
  10. import android.widget.ViewSwitcher.ViewFactory;  
  11.   
  12. public class GallaryBrowser extends Activity {  
  13.     private Integer[] imageIds = new Integer[] {  
  14.             R.drawable.a, R.drawable.desert,   
  15.             R.drawable.hydrangeas, R.drawable.lighthouse,  
  16.             R.drawable.jellyfish, R.drawable.koala,  
  17.             R.drawable.lighthouse, R.drawable.penguins,  
  18.             R.drawable.tulips  
  19.     };  
  20.       
  21.   
  22.       
  23.     /** Called when the activity is first created. */  
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.           
  28.         final CoverFlow cf = new CoverFlow(this);  
  29.         cf.setAdapter(new ImageAdapter(this, imageIds));  
  30.         cf.setAnimationDuration(1500);  
  31.         setContentView(cf);  
  32.   
  33.     }  
  34.   
  35. }  

          2、图片处理代码,主要是实现旋转和倒影: MyImgView.java

          

[java] view plaincopy
  1.      ///******************************************************************************//  
  2. ///**************************请尊重tank的成果毕竟这也是花了笔者很多时间和心思*****//  
  3. /*************************  为了让大家容易懂tank特地详细的写了很多的解释*********************************************////  
  4. ///**************************欢迎访问我的博客http://www.cnblogs.com/tankaixiong/********************************************//  
  5. ///***************************里面文章将持续更新!***************************************************//  
  6.   
  7.   
  8. package com.myandroid.test;  
  9.   
  10. import android.graphics.Bitmap;  
  11. import android.graphics.Canvas;  
  12. import android.graphics.LinearGradient;  
  13. import android.graphics.Matrix;  
  14. import android.graphics.Paint;  
  15. import android.graphics.PixelFormat;  
  16. import android.graphics.PorterDuffXfermode;  
  17. import android.graphics.Bitmap.Config;  
  18. import android.graphics.PorterDuff.Mode;  
  19. import android.graphics.Shader.TileMode;  
  20. import android.graphics.drawable.Drawable;  
  21.   
  22. public class MyImgView {  
  23.   
  24.     /** 
  25.      * 添加倒影,原理,先翻转图片,由上到下放大透明度 
  26.      *  
  27.      * @param originalImage 
  28.      * @return 
  29.      */  
  30.     public static Bitmap createReflectedImage(Bitmap originalImage) {  
  31.         // The gap we want between the reflection and the original image  
  32.         final int reflectionGap = 4;  
  33.   
  34.         int width = originalImage.getWidth();  
  35.         int height = originalImage.getHeight();  
  36.   
  37.         // This will not scale but will flip on the Y axis  
  38.         Matrix matrix = new Matrix();  
  39.         matrix.preScale(1, -1);  
  40.   
  41.         // Create a Bitmap with the flip matrix applied to it.  
  42.         // We only want the bottom half of the image  
  43.         Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,  
  44.                 height / 2, width, height / 2, matrix, false);  
  45.   
  46.         // Create a new bitmap with same width but taller to fit reflection  
  47.         Bitmap bitmapWithReflection = Bitmap.createBitmap(width,  
  48.                 (height + height / 2), Config.ARGB_8888);  
  49.   
  50.         // Create a new Canvas with the bitmap that's big enough for  
  51.         // the image plus gap plus reflection  
  52.         Canvas canvas = new Canvas(bitmapWithReflection);  
  53.         // Draw in the original image  
  54.         canvas.drawBitmap(originalImage, 00null);  
  55.         // Draw in the gap  
  56.         Paint defaultPaint = new Paint();  
  57.         canvas.drawRect(0, height, width, height + reflectionGap, defaultPaint);  
  58.         // Draw in the reflection  
  59.         canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);  
  60.   
  61.         // Create a shader that is a linear gradient that covers the reflection  
  62.         Paint paint = new Paint();  
  63.         LinearGradient shader = new LinearGradient(0,  
  64.                 originalImage.getHeight(), 0, bitmapWithReflection.getHeight()  
  65.                         + reflectionGap, 0x70ffffff0x00ffffff, TileMode.CLAMP);  
  66.         // Set the paint to use this shader (linear gradient)  
  67.         paint.setShader(shader);  
  68.         // Set the Transfer mode to be porter duff and destination in  
  69.         paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));  
  70.         // Draw a rectangle using the paint with our linear gradient  
  71.         canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()  
  72.                 + reflectionGap, paint);  
  73.   
  74.         return bitmapWithReflection;  
  75.     }  
  76.     //drawable 类型转化为bitmap  
  77.     public static Bitmap drawableToBitmap(Drawable drawable) {  
  78.   
  79.         Bitmap bitmap = Bitmap  
  80.                 .createBitmap(  
  81.                         drawable.getIntrinsicWidth(),  
  82.                         drawable.getIntrinsicHeight(),  
  83.                         drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
  84.                                 : Bitmap.Config.RGB_565);  
  85.         Canvas canvas = new Canvas(bitmap);  
  86.         // canvas.setBitmap(bitmap);  
  87.         drawable.setBounds(00, drawable.getIntrinsicWidth(), drawable  
  88.                 .getIntrinsicHeight());  
  89.         drawable.draw(canvas);  
  90.         return bitmap;  
  91.     }  
  92.   
  93. }  

          3、自定义的Gallery,继承Gallery类,重写getChildStaticTransformation方法,实现图片的重叠和透明度渐变:CoverFlow.java

          

[java] view plaincopy
  1. ///******************************************************************************//  
  2. ///**************************请尊重tank的成果毕竟这也是花了笔者很多时间和心思*****//  
  3. /*************************  为了让大家容易懂tank特地详细的写了很多的解释*********************************************////  
  4. ///**************************欢迎访问我的博客http://www.cnblogs.com/tankaixiong/********************************************//  
  5. ///***************************里面文章将持续更新!***************************************************//  
  6. package com.myandroid.test;  
  7.   
  8. import android.content.Context;  
  9. import android.graphics.Camera;  
  10. import android.graphics.Matrix;  
  11. import android.util.AttributeSet;  
  12. import android.util.Log;  
  13. import android.view.View;  
  14. import android.view.animation.Transformation;  
  15. import android.widget.Gallery;  
  16. import android.widget.ImageView;  
  17.   
  18.   
  19. //自己定义的Gallery  
  20. public class CoverFlow extends Gallery {  
  21.   
  22.     private Camera mCamera = new Camera();  
  23.     private int mMaxRotationAngle = 50;  
  24.     private int mMaxZoom = -500;  
  25.     private int mCoveflowCenter;  
  26.     private boolean mAlphaMode = true;  
  27.     private boolean mCircleMode = false;  
  28.   
  29.     public CoverFlow(Context context) {  
  30.         super(context);  
  31.         this.setStaticTransformationsEnabled(true);  
  32.         Log.e("sequence""CoverFlow2");  
  33.     }  
  34.   
  35.     public CoverFlow(Context context, AttributeSet attrs) {  
  36.         super(context, attrs);  
  37.         this.setStaticTransformationsEnabled(true);  
  38.     }  
  39.   
  40.     public CoverFlow(Context context, AttributeSet attrs, int defStyle) {  
  41.         super(context, attrs, defStyle);  
  42.         this.setStaticTransformationsEnabled(true);  
  43.     }  
  44.   
  45.     public int getMaxRotationAngle() {  
  46.         return mMaxRotationAngle;  
  47.     }  
  48.   
  49.     public void setMaxRotationAngle(int maxRotationAngle) {  
  50.         mMaxRotationAngle = maxRotationAngle;  
  51.     }  
  52.   
  53.     public boolean getCircleMode() {  
  54.         return mCircleMode;  
  55.     }  
  56.   
  57.     public void setCircleMode(boolean isCircle) {  
  58.         mCircleMode = isCircle;  
  59.     }  
  60.   
  61.     public boolean getAlphaMode() {  
  62.         return mAlphaMode;  
  63.     }  
  64.   
  65.     public void setAlphaMode(boolean isAlpha) {  
  66.         mAlphaMode = isAlpha;  
  67.     }  
  68.   
  69.     public int getMaxZoom() {  
  70.         return mMaxZoom;  
  71.     }  
  72.   
  73.     public void setMaxZoom(int maxZoom) {  
  74.         mMaxZoom = maxZoom;  
  75.     }  
  76.   
  77.     private int getCenterOfCoverflow() {  
  78.         return (getWidth() - getPaddingLeft() - getPaddingRight()) / 2  
  79.                 + getPaddingLeft();  
  80.     }  
  81.   
  82.     private static int getCenterOfView(View view) {  
  83.         return view.getLeft() + view.getWidth() / 2;  
  84.     }  
  85.     //重写Garray方法 ,产生层叠和放大效果  
  86.     @Override  
  87.     protected boolean getChildStaticTransformation(View child, Transformation t) {  
  88.           
  89.         final int childCenter = getCenterOfView(child);  
  90.         final int childWidth = child.getWidth();  
  91.         int rotationAngle = 0;  
  92.         t.clear();  
  93.         t.setTransformationType(Transformation.TYPE_MATRIX);  
  94.         if (childCenter == mCoveflowCenter) {  
  95.             transformImageBitmap((ImageView) child, t, 00);  
  96.         } else {  
  97.             rotationAngle = (int) (((float) (mCoveflowCenter - childCenter) / childWidth) * mMaxRotationAngle);  
  98.             // Log.d("test", "recanglenum:"+Math.floor ((mCoveflowCenter -  
  99.             // childCenter) / childWidth));  
  100.             if (Math.abs(rotationAngle) > mMaxRotationAngle) {  
  101.                 rotationAngle = (rotationAngle < 0) ? -mMaxRotationAngle  
  102.                         : mMaxRotationAngle;  
  103.             }  
  104.             transformImageBitmap((ImageView) child, t, rotationAngle,  
  105.                     (int) Math.floor((mCoveflowCenter - childCenter)/ (childWidth==0?1:childWidth)));  
  106.         }  
  107.         Log.e("sequence""getChildStaticTransformation");  
  108.         return true;  
  109.     }  
  110.   
  111.     /** 
  112.      * This is called during layout when the size of this view has changed. If 
  113.      * you were just added to the view hierarchy, you're called with the old 
  114.      * values of 0. 
  115.      *  
  116.      * @param w 
  117.      *            Current width of this view. 
  118.      * @param h 
  119.      *            Current height of this view. 
  120.      * @param oldw 
  121.      *            Old width of this view. 
  122.      * @param oldh 
  123.      *            Old height of this view. 
  124.      */  
  125.     protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
  126.         mCoveflowCenter = getCenterOfCoverflow();  
  127.         super.onSizeChanged(w, h, oldw, oldh);  
  128.         Log.e("sequence""onSizeChanged");  
  129.     }  
  130.   
  131.     /** 
  132.      * Transform the Image Bitmap by the Angle passed 
  133.      *  
  134.      * @param imageView 
  135.      *            ImageView the ImageView whose bitmap we want to rotate 
  136.      * @param t 
  137.      *            transformation 
  138.      * @param rotationAngle 
  139.      *            the Angle by which to rotate the Bitmap 
  140.      */  
  141.     private void transformImageBitmap(ImageView child, Transformation t,  
  142.             int rotationAngle, int d) {  
  143.         mCamera.save();  
  144.         final Matrix imageMatrix = t.getMatrix();  
  145.         final int imageHeight = child.getLayoutParams().height;  
  146.         final int imageWidth = child.getLayoutParams().width;  
  147.         final int rotation = Math.abs(rotationAngle);  
  148.         mCamera.translate(0.0f, 0.0f, 100.0f);  
  149.         // As the angle of the view gets less, zoom in  
  150.         if (rotation <= mMaxRotationAngle) {  
  151.             float zoomAmount = (float) (mMaxZoom + (rotation * 1.5));  
  152.             mCamera.translate(0.0f, 0.0f, zoomAmount);  
  153.             if (mCircleMode) {  
  154.                 if (rotation < 40)  
  155.                     mCamera.translate(0.0f, 1550.0f);  
  156.                 else  
  157.                     mCamera.translate(0.0f, (255 - rotation * 2.5f), 0.0f);  
  158.             }  
  159.             if (mAlphaMode) {  
  160.                 ((ImageView) (child)).setAlpha((int) (255 - rotation * 2.5));  
  161.             }  
  162.         }  
  163.         mCamera.rotateY(rotationAngle);  
  164.         mCamera.getMatrix(imageMatrix);  
  165.   
  166.         imageMatrix.preTranslate(-(imageWidth / 2), -(imageHeight / 2));  
  167.         imageMatrix.postTranslate((imageWidth / 2), (imageHeight / 2));  
  168.         mCamera.restore();  
  169.         Log.e("sequence""transformImageBitmap");  
  170.     }  
  171. }  

          4、图片适配器:ImageAdapter。这里,我改写了getView方法,把图片按照一定比例进行缩放,防止图片过大,超出屏幕而导致报错。

          

[java] view plaincopy
  1.  package com.myandroid.test;  
  2.   
  3. import java.io.InputStream;  
  4.   
  5. import android.content.Context;  
  6. import android.content.res.Resources;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.BitmapFactory;  
  9. import android.graphics.Matrix;  
  10. import android.graphics.drawable.BitmapDrawable;  
  11. import android.view.View;  
  12. import android.view.ViewGroup;  
  13. import android.widget.BaseAdapter;  
  14. import android.widget.Gallery;  
  15. import android.widget.ImageView;  
  16.   
  17. public class ImageAdapter extends BaseAdapter {  
  18.     private Context context;  
  19.     private Integer[] images;  
  20.       
  21.     public ImageAdapter(Context context, Integer[] imageIds) {  
  22.         this.context = context;  
  23.         this.images = imageIds;  
  24.     }  
  25.       
  26.     @Override  
  27.     public int getCount() {  
  28.         // TODO Auto-generated method stub  
  29.         return images.length;  
  30.     }  
  31.   
  32.     @Override  
  33.     public Object getItem(int position) {  
  34.         // TODO Auto-generated method stub  
  35.         return position;  
  36.     }  
  37.   
  38.     @Override  
  39.     public long getItemId(int position) {  
  40.         // TODO Auto-generated method stub  
  41.         return position;  
  42.     }  
  43.   
  44.     @Override  
  45.     public View getView(int position, View convertView, ViewGroup parent) {  
  46.           
  47.          ImageView imageView = new ImageView(context);  
  48.          //创建BitMap对象,用于显示图片     
  49.          Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),  
  50.                  images[position]);     
  51.          Matrix matrix = new Matrix();   //矩阵,用于图片比例缩放     
  52.          matrix.postScale((float)80/bitmap.getWidth(),   
  53.                  (float)60/bitmap.getHeight());    //设置高宽比例(三维矩阵)  
  54.          //图片不能超出屏幕范围,否则报错,这里进行缩小  
  55.          Bitmap newBmp = Bitmap.createBitmap(bitmap, 00, bitmap.getWidth(),  
  56.                  bitmap.getHeight(), matrix, true);      
  57.          imageView.setImageBitmap(MyImgView.createReflectedImage(newBmp));  
  58.          imageView.setLayoutParams(new Gallery.LayoutParams(8060));  
  59.   
  60.          return imageView;  
  61.     }  
  62.   
  63. }  



这篇关于Android之绚丽的图片游览效果--有点像W7效果,透明的倒影,层叠的图片,渐变的颜色透明度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989682

相关文章

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

防近视护眼台灯什么牌子好?五款防近视效果好的护眼台灯推荐

在家里,灯具是属于离不开的家具,每个大大小小的地方都需要的照亮,所以一盏好灯是必不可少的,每个发挥着作用。而护眼台灯就起了一个保护眼睛,预防近视的作用。可以保护我们在学习,阅读的时候提供一个合适的光线环境,保护我们的眼睛。防近视护眼台灯什么牌子好?那我们怎么选择一个优秀的护眼台灯也是很重要,才能起到最大的护眼效果。下面五款防近视效果好的护眼台灯推荐: 一:六个推荐防近视效果好的护眼台灯的

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使