转自:http://blog.csdn.net/android_tutor/article/details/5981753


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

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

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

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

view plain print ?
  1. packagecom.android.tutor;
  2. importandroid.graphics.Bitmap;
  3. importandroid.graphics.Canvas;
  4. importandroid.graphics.LinearGradient;
  5. importandroid.graphics.Matrix;
  6. importandroid.graphics.Paint;
  7. importandroid.graphics.PixelFormat;
  8. importandroid.graphics.PorterDuffXfermode;
  9. importandroid.graphics.Rect;
  10. importandroid.graphics.RectF;
  11. importandroid.graphics.Bitmap.Config;
  12. importandroid.graphics.PorterDuff.Mode;
  13. importandroid.graphics.Shader.TileMode;
  14. importandroid.graphics.drawable.Drawable;
  15. publicclassImageUtil{
  16. //放大缩小图片
  17. publicstaticBitmapzoomBitmap(Bitmapbitmap,intw,inth){
  18. intwidth=bitmap.getWidth();
  19. intheight=bitmap.getHeight();
  20. Matrixmatrix=newMatrix();
  21. floatscaleWidht=((float)w/width);
  22. floatscaleHeight=((float)h/height);
  23. matrix.postScale(scaleWidht,scaleHeight);
  24. Bitmapnewbmp=Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);
  25. returnnewbmp;
  26. }
  27. //将Drawable转化为Bitmap
  28. publicstaticBitmapdrawableToBitmap(Drawabledrawable){
  29. intwidth=drawable.getIntrinsicWidth();
  30. intheight=drawable.getIntrinsicHeight();
  31. Bitmapbitmap=Bitmap.createBitmap(width,height,
  32. drawable.getOpacity()!=PixelFormat.OPAQUE?Bitmap.Config.ARGB_8888
  33. :Bitmap.Config.RGB_565);
  34. Canvascanvas=newCanvas(bitmap);
  35. drawable.setBounds(0,0,width,height);
  36. drawable.draw(canvas);
  37. returnbitmap;
  38. }
  39. //获得圆角图片的方法
  40. publicstaticBitmapgetRoundedCornerBitmap(Bitmapbitmap,floatroundPx){
  41. Bitmapoutput=Bitmap.createBitmap(bitmap.getWidth(),bitmap
  42. .getHeight(),Config.ARGB_8888);
  43. Canvascanvas=newCanvas(output);
  44. finalintcolor=0xff424242;
  45. finalPaintpaint=newPaint();
  46. finalRectrect=newRect(0,0,bitmap.getWidth(),bitmap.getHeight());
  47. finalRectFrectF=newRectF(rect);
  48. paint.setAntiAlias(true);
  49. canvas.drawARGB(0,0,0,0);
  50. paint.setColor(color);
  51. canvas.drawRoundRect(rectF,roundPx,roundPx,paint);
  52. paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
  53. canvas.drawBitmap(bitmap,rect,rect,paint);
  54. returnoutput;
  55. }
  56. //获得带倒影的图片方法
  57. publicstaticBitmapcreateReflectionImageWithOrigin(Bitmapbitmap){
  58. finalintreflectionGap=4;
  59. intwidth=bitmap.getWidth();
  60. intheight=bitmap.getHeight();
  61. Matrixmatrix=newMatrix();
  62. matrix.preScale(1,-1);
  63. BitmapreflectionImage=Bitmap.createBitmap(bitmap,
  64. 0,height/2,width,height/2,matrix,false);
  65. BitmapbitmapWithReflection=Bitmap.createBitmap(width,(height+height/2),Config.ARGB_8888);
  66. Canvascanvas=newCanvas(bitmapWithReflection);
  67. canvas.drawBitmap(bitmap,0,0,null);
  68. PaintdeafalutPaint=newPaint();
  69. canvas.drawRect(0,height,width,height+reflectionGap,
  70. deafalutPaint);
  71. canvas.drawBitmap(reflectionImage,0,height+reflectionGap,null);
  72. Paintpaint=newPaint();
  73. LinearGradientshader=newLinearGradient(0,
  74. bitmap.getHeight(),0,bitmapWithReflection.getHeight()
  75. +reflectionGap,0x70ffffff,0x00ffffff,TileMode.CLAMP);
  76. paint.setShader(shader);
  77. //SettheTransfermodetobeporterduffanddestinationin
  78. paint.setXfermode(newPorterDuffXfermode(Mode.DST_IN));
  79. //Drawarectangleusingthepaintwithourlineargradient
  80. canvas.drawRect(0,height,width,bitmapWithReflection.getHeight()
  81. +reflectionGap,paint);
  82. returnbitmapWithReflection;
  83. }
  84. }
package com.android.tutor; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Bitmap.Config; import android.graphics.PorterDuff.Mode; import android.graphics.Shader.TileMode; import android.graphics.drawable.Drawable; public class ImageUtil { //放大缩小图片 public static Bitmap zoomBitmap(Bitmap bitmap,int w,int h){ int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidht = ((float)w / width); float scaleHeight = ((float)h / height); matrix.postScale(scaleWidht, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); return newbmp; } //将Drawable转化为Bitmap public static Bitmap drawableToBitmap(Drawable drawable){ int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0,0,width,height); drawable.draw(canvas); return bitmap; } //获得圆角图片的方法 public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){ Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap .getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } //获得带倒影的图片方法 public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){ final int reflectionGap = 4; int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 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(bitmap, 0, 0, null); Paint deafalutPaint = new Paint(); canvas.drawRect(0, height,width,height + reflectionGap, deafalutPaint); canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); paint.setShader(shader); // Set the Transfer mode to be porter duff and destination in paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // Draw a rectangle using the paint with our linear gradient canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); return bitmapWithReflection; } }

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

view plain print ?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns: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>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/image01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10px" /> <ImageView android:id="@+id/image02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10px" /> </LinearLayout>

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

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

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

OK大功告成了!!



更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. android图标的制作
  3. android 类似QQ 换皮肤 实现思路 apk资源共享
  4. ListView setOnItemClickListener无效原因详细分析
  5. android中异步加载图片
  6. android imageView详解
  7. Android(安卓)Studio中获取sha1证书的方法
  8. Android的selector,背景选择器
  9. ListView setOnItemClickListener无效原因分析

随机推荐

  1. Android(安卓)实现多个输入框的对话框
  2. Android(安卓)sdk manager 下载安装中的
  3. Android(安卓)safe mode
  4. Android(安卓)Jetpack Compose 之 Text
  5. android 如何从sqlite读取数据到spinner
  6. android 相对布局例子代码
  7. Android(安卓)Client and Jsp Server
  8. 看完这篇,再也不怕被问到AsyncTask的原理
  9. Android(安卓)自定义Dialog时出现成员变
  10. android点击事件的四种方式