Android高手进阶教程(二十二)之---Android中几种图像特效处理的集锦!!

来源:互联网 发布:java迭代器 编辑:程序博客网 时间:2024/05/06 23:58

大家好,这一节给大家分享的是Android中几种图像特效处理的小技巧,比如圆角,倒影,还有就是图片缩放,Drawable转化为Bitmap,Bitmap转化为Drawable等等.

废话少说了,直接讲解今天的实例,本例主要是先获取壁纸(getWallpaper()),然后对当前壁纸的一些特效处理.大家按步骤一步一步来:

第一步:新建一个Android工程命名为ImageDemo,工程结构如下:

第二步:新建一个.java文件,命名为ImageUtil.java,在里面定义一些图片处理方法,代码如下:

[java] view plaincopy
  1. package com.android.tutor;  
  2. import android.graphics.Bitmap;  
  3. import android.graphics.Canvas;  
  4. import android.graphics.LinearGradient;  
  5. import android.graphics.Matrix;  
  6. import android.graphics.Paint;  
  7. import android.graphics.PixelFormat;  
  8. import android.graphics.PorterDuffXfermode;  
  9. import android.graphics.Rect;  
  10. import android.graphics.RectF;  
  11. import android.graphics.Bitmap.Config;  
  12. import android.graphics.PorterDuff.Mode;  
  13. import android.graphics.Shader.TileMode;  
  14. import android.graphics.drawable.Drawable;  
  15. public class ImageUtil {  
  16.       
  17.     //放大缩小图片  
  18.     public static Bitmap zoomBitmap(Bitmap bitmap,int w,int h){  
  19.         int width = bitmap.getWidth();  
  20.         int height = bitmap.getHeight();  
  21.         Matrix matrix = new Matrix();  
  22.         float scaleWidht = ((float)w / width);  
  23.         float scaleHeight = ((float)h / height);  
  24.         matrix.postScale(scaleWidht, scaleHeight);  
  25.         Bitmap newbmp = Bitmap.createBitmap(bitmap, 00, width, height, matrix, true);  
  26.         return newbmp;  
  27.     }  
  28.     //将Drawable转化为Bitmap  
  29.      public static Bitmap drawableToBitmap(Drawable drawable){  
  30.             int width = drawable.getIntrinsicWidth();  
  31.             int height = drawable.getIntrinsicHeight();  
  32.             Bitmap bitmap = Bitmap.createBitmap(width, height,  
  33.                     drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
  34.                             : Bitmap.Config.RGB_565);  
  35.             Canvas canvas = new Canvas(bitmap);  
  36.             drawable.setBounds(0,0,width,height);  
  37.             drawable.draw(canvas);  
  38.             return bitmap;  
  39.               
  40.         }  
  41.        
  42.      //获得圆角图片的方法  
  43.     public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){  
  44.           
  45.         Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap  
  46.                 .getHeight(), Config.ARGB_8888);  
  47.         Canvas canvas = new Canvas(output);  
  48.    
  49.         final int color = 0xff424242;  
  50.         final Paint paint = new Paint();  
  51.         final Rect rect = new Rect(00, bitmap.getWidth(), bitmap.getHeight());  
  52.         final RectF rectF = new RectF(rect);  
  53.    
  54.         paint.setAntiAlias(true);  
  55.         canvas.drawARGB(0000);  
  56.         paint.setColor(color);  
  57.         canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
  58.    
  59.         paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  60.         canvas.drawBitmap(bitmap, rect, rect, paint);  
  61.    
  62.         return output;  
  63.     }  
  64.     //获得带倒影的图片方法  
  65.     public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){  
  66.         final int reflectionGap = 4;  
  67.         int width = bitmap.getWidth();  
  68.         int height = bitmap.getHeight();  
  69.           
  70.         Matrix matrix = new Matrix();  
  71.         matrix.preScale(1, -1);  
  72.           
  73.         Bitmap reflectionImage = Bitmap.createBitmap(bitmap,   
  74.                 0, height/2, width, height/2, matrix, false);  
  75.           
  76.         Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888);  
  77.           
  78.         Canvas canvas = new Canvas(bitmapWithReflection);  
  79.         canvas.drawBitmap(bitmap, 00null);  
  80.         Paint deafalutPaint = new Paint();  
  81.         canvas.drawRect(0, height,width,height + reflectionGap,  
  82.                 deafalutPaint);  
  83.           
  84.         canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);  
  85.           
  86.         Paint paint = new Paint();  
  87.         LinearGradient shader = new LinearGradient(0,  
  88.                 bitmap.getHeight(), 0, bitmapWithReflection.getHeight()  
  89.                 + reflectionGap, 0x70ffffff0x00ffffff, TileMode.CLAMP);  
  90.         paint.setShader(shader);  
  91.         // Set the Transfer mode to be porter duff and destination in  
  92.         paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));  
  93.         // Draw a rectangle using the paint with our linear gradient  
  94.         canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()  
  95.                 + reflectionGap, paint);  
  96.    
  97.         return bitmapWithReflection;  
  98.     }  
  99.       
  100. }  

第三步:修改main.xml布局文件,主要放了两个ImageView控件,代码如下:

[java] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <ImageView   
  8.         android:id="@+id/image01"   
  9.         android:layout_width="wrap_content"   
  10.         android:layout_height="wrap_content"   
  11.         android:padding="10px"  
  12.         />  
  13.     <ImageView  
  14.         android:id="@+id/image02"  
  15.         android:layout_width="wrap_content"   
  16.         android:layout_height="wrap_content"   
  17.         android:padding="10px"  
  18.     />  
  19. </LinearLayout>  

第四步:修改主核心程序,ImageDemo.java,代码如下:

[java] view plaincopy
  1. package com.android.tutor;  
  2. import android.app.Activity;  
  3. import android.graphics.Bitmap;  
  4. import android.graphics.drawable.Drawable;  
  5. import android.os.Bundle;  
  6. import android.widget.ImageView;  
  7. public class Imagedemo extends Activity {  
  8.     private ImageView mImageView01,mImageView02;  
  9.       
  10.     public void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.         setupViews();  
  14.     }  
  15.      
  16.     private void setupViews(){  
  17.         mImageView01 = (ImageView)findViewById(R.id.image01);  
  18.         mImageView02 = (ImageView)findViewById(R.id.image02);  
  19.           
  20.         //获取壁纸返回值是Drawable  
  21.         Drawable drawable = getWallpaper();  
  22.         //将Drawable转化为Bitmap  
  23.         Bitmap bitmap = ImageUtil.drawableToBitmap(drawable);  
  24.         //缩放图片  
  25.         Bitmap zoomBitmap = ImageUtil.zoomBitmap(bitmap, 100100);  
  26.         //获取圆角图片  
  27.         Bitmap roundBitmap = ImageUtil.getRoundedCornerBitmap(zoomBitmap, 10.0f);  
  28.         //获取倒影图片  
  29.         Bitmap reflectBitmap = ImageUtil.createReflectionImageWithOrigin(zoomBitmap);  
  30.         //这里可以让Bitmap再转化为Drawable  
  31. //      Drawable roundDrawable = new BitmapDrawable(roundBitmap);         
  32. //      Drawable reflectDrawable = new BitmapDrawable(reflectBitmap);         
  33. //      mImageView01.setBackgroundDrawable(roundDrawable);  
  34. //      mImageView02.setBackgroundDrawable(reflectDrawable);  
  35.                   
  36.         mImageView01.setImageBitmap(roundBitmap);  
  37.         mImageView02.setImageBitmap(reflectBitmap);  
  38.     }  
  39.         
  40.          
  41. }  

第五步:运行上述工程,查看效果如下:

 

OK大功告成了!!

抗锯齿方法两种(其一:paint.setAntiAlias(ture);paint.setBitmapFilter(true))  

2011-08-15 17:59:42|  分类:Android开发 |举报|字号 订阅

在Android中,目前,我知道有两种出现锯齿的情况。 ① 当我们用Canvas绘制位图的时候,如果对位图进行了选择,则位图会出现锯齿。 ② 在用View的RotateAnimation做动画时候,如果View当中包含有大量的图形,也会出现锯齿。我们分别以这两种情况加以考虑。 ◆ 用Canvas绘制位的的情况。在用Canvas绘制位图时,一般地,我们使用drawBitmap函数家族,在这些函数中,都有一个Paint参数,要做到防止锯齿,我们就要使用到这个参数。如下:首先在你的构造函数中,需要创建一个Paint。 Paint mPaint = new Paint(); 然后,您需要设置两个参数: 1)mPaint.setAntiAlias(); 2)mPaint.setBitmapFilter(true)。第一个函数是用来防止边缘的锯齿,第二个函数是用来对位图进行滤波处理。最后,在画图的时候,调用drawBitmap函数,只需要将整个Paint传入即可。 ◆ 有时候,当你做RotateAnimation时,你会发现,讨厌的锯齿又出现了。这个时候,由于你不能控制位图的绘制,只能用其他方法来实现防止锯齿。另外,如果你画的位图很多。不想每个位图的绘制都传入一个Paint。还有的时候,你不可能控制每个窗口的绘制的时候,您就需要用下面的方法来处理——对整个Canvas进行处理。 1)在您的构造函数中,创建一个Paint滤波器。 PaintFlagsDrawFilter mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG);第一个参数是你要清除的标志位,第二个参数是你要设置的标志位。此处设置为对位图进行滤波。 2)当你在画图的时候,如果是View则在onDraw当中,如果是ViewGroup则在dispatchDraw中调用如下函数。 canvas.setDrawFilter( mSetfil ); ★ 最后,另外,在Drawable类及其子类中,也有函数setFilterBitmap可以用来对Bitmap进行滤波处理,这样,当你选择Drawable时,会有抗锯齿的效果。





0 0