惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
宝玉的分享
宝玉的分享
腾讯CDC
博客园_首页
T
Tailwind CSS Blog
月光博客
月光博客
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
V
Visual Studio Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
SecWiki News
SecWiki News
美团技术团队
P
Privacy International News Feed
H
Help Net Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
Know Your Adversary
Know Your Adversary
Y
Y Combinator Blog
D
DataBreaches.Net
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
S
Schneier on Security
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
Cisco Talos Blog
Cisco Talos Blog
小众软件
小众软件
Forbes - Security
Forbes - Security
D
Docker
T
Tenable Blog
S
Secure Thoughts
雷峰网
雷峰网
S
Security @ Cisco Blogs
T
The Exploit Database - CXSecurity.com
The Cloudflare Blog
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
阮一峰的网络日志
阮一峰的网络日志

博客园 - 蔡清华

数据库中查询的各种连接(左连接,右连接,全连接,内连接,交叉连接,自连接) Android RenderScript 的使用基础篇 Android应用启动后自动创建桌面快捷方式 Android API教程:人脸检测(Face Detect) Android应用中通过AIDL机制实现进程间的通讯实例 Android开发:如何实现TCP和UDP传输 用户授权认证过程 Android应用自动更新功能的代码实现 Android蓝牙开发浅析 网络通信的中文乱码问题 (转)android中 检查网络连接状态的变化,无网络时跳转到设置界面 Android开发之OpenGL+ES教程 android 示例源码 Android应用如何实现换主题功能 android 开发环境搭建 Android 之 内存管理 Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面 android 网络拨号流程 Android_launcher的源码详细分析
android 图片处理
蔡清华 · 2011-09-16 · via 博客园 - 蔡清华

Posted on 2011-09-16 15:09  蔡清华  阅读(3133)  评论()    收藏  举报

1、图标加灰色过滤;
2、android的图片资源默认是静态的,单实例;如果两个IM好友的头像一样,最简单的都是用的软件自带头像,有一个在线,一个离线,直接改变头像的灰度,则两个用户的头像都会变灰或者在线,答案是:Drawable.mutate()。

Java代码 复制代码 收藏代码

  1. Drawable mDrawable = context.getResources().getDrawable(R.drawable.face_icon);     
  2.   
  3.   
  4. mDrawable.mutate();     
  5. ColorMatrix cm = new ColorMatrix();     
  6. cm.setSaturation(0);     
  7. ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);     
  8. mDrawable.setColorFilter(cf);  

Java代码 复制代码 收藏代码

  1.   
  2. public void drawRegion(Image image_src,   
  3.   
  4. int x_src, int y_src,   
  5.   
  6. int width, int height,   
  7.   
  8. int transform,   
  9.   
  10. int x_dest, int y_dest,   
  11.   
  12. int anchor){   
  13.   
  14. if((anchor&VCENTER) != 0){   
  15.   
  16. y_dest -= height/2;   
  17.   
  18. }else if((anchor&BOTTOM) != 0){   
  19.   
  20. y_dest -= height;   
  21.   
  22. }   
  23.   
  24. if((anchor&RIGHT) != 0){   
  25.   
  26. x_dest -= width;   
  27.   
  28. }else if((anchor&HCENTER) != 0){   
  29.   
  30. x_dest -= width/2;   
  31.   
  32. }   
  33.   
  34. Bitmap newMap = Bitmap.createBitmap(image_src.getBitmap(), x_src, y_src, width, height);   
  35.   
  36. Matrix mMatrix = new Matrix();   
  37.   
  38. Matrix temp = new Matrix();   
  39.   
  40. Matrix temp2 = new Matrix();   
  41.   
  42. float[] mirrorY = {   
  43.   
  44. -100,   
  45. 010,   
  46. 001  
  47.   
  48. };   
  49.   
  50. temp.setValues(mirrorY);   
  51.   
  52. switch(transform){   
  53.   
  54. case Sprite.TRANS_NONE:   
  55.   
  56. break;   
  57.   
  58. case Sprite.TRANS_ROT90:   
  59.   
  60. mMatrix.setRotate(90,width/2, height/2);   
  61.   
  62. break;   
  63.   
  64. case Sprite.TRANS_ROT180:   
  65.   
  66. mMatrix.setRotate(180,width/2, height/2);   
  67.   
  68. break;   
  69.   
  70. case Sprite.TRANS_ROT270:   
  71.   
  72. mMatrix.setRotate(270,width/2, height/2);   
  73.   
  74. break;   
  75.   
  76. case Sprite.TRANS_MIRROR:   
  77.   
  78. mMatrix.postConcat(temp);   
  79.   
  80. break;   
  81.   
  82. case Sprite.TRANS_MIRROR_ROT90:   
  83.   
  84. mMatrix.postConcat(temp);   
  85.   
  86. mMatrix.setRotate(90,width/2, height/2);   
  87.   
  88. break;   
  89.   
  90. case Sprite.TRANS_MIRROR_ROT180:   
  91.   
  92. mMatrix.postConcat(temp);   
  93.   
  94. mMatrix.setRotate(180,width/2, height/2);   
  95.   
  96. break;   
  97.   
  98. case Sprite.TRANS_MIRROR_ROT270:   
  99.   
  100. mMatrix.postConcat(temp);   
  101.   
  102. mMatrix.setRotate(270,width/2, height/2);   
  103.   
  104. break;   
  105.   
  106. }   
  107.   
  108. mMatrix.setTranslate(x_dest, y_dest);   
  109.   
  110. canvas.drawBitmap(newMap, mMatrix, mPaint);   
  111.   
  112. }  

Java代码 复制代码 收藏代码

  1.   
  2.   
  3. public Bitmap returnBitMap(String url) {   
  4.         URL myFileUrl = null;   
  5.         Bitmap bitmap = null;   
  6.         try {   
  7.             myFileUrl = new URL(url);   
  8.         } catch (MalformedURLException e) {   
  9.             e.printStackTrace();   
  10.         }   
  11.         try {   
  12.             HttpURLConnection conn = (HttpURLConnection) myFileUrl   
  13.                     .openConnection();   
  14.             conn.setDoInput(true);   
  15.             conn.connect();   
  16.             InputStream is = conn.getInputStream();   
  17.             bitmap = BitmapFactory.decodeStream(is);   
  18.             is.close();   
  19.         } catch (IOException e) {   
  20.             e.printStackTrace();   
  21.         }   
  22.         Log.v(tag, bitmap.toString());   
  23.   
  24.         return bitmap;   
  25.     }   
  26.   
  27. public static Drawable resizeImage(Bitmap bitmap, int w, int h) {   
  28.   
  29.           
  30.         Bitmap BitmapOrg = bitmap;   
  31.   
  32.         int width = BitmapOrg.getWidth();   
  33.         int height = BitmapOrg.getHeight();   
  34.         int newWidth = w;   
  35.         int newHeight = h;   
  36.   
  37.         Log.v(tag, String.valueOf(width));   
  38.         Log.v(tag, String.valueOf(height));   
  39.   
  40.         Log.v(tag, String.valueOf(newWidth));   
  41.         Log.v(tag, String.valueOf(newHeight));   
  42.   
  43.           
  44.         float scaleWidth = ((float) newWidth) / width;   
  45.         float scaleHeight = ((float) newHeight) / height;   
  46.   
  47.           
  48.         Matrix matrix = new Matrix();   
  49.           
  50.         matrix.postScale(scaleWidth, scaleHeight);   
  51.           
  52.           
  53.   
  54.           
  55.         Bitmap resizedBitmap = Bitmap.createBitmap(BitmapOrg, 00, width,   
  56.                 height, matrix, true);   
  57.   
  58.           
  59.           
  60.         return new BitmapDrawable(resizedBitmap);   
  61.   
  62.     }  

Java代码 复制代码 收藏代码

  1. 1.图片加载方法,方便用户加载图片   
  2.  
  3.  
  4.  
  5.  
  6.  
  7.   
  8. public final Bitmap CreatImage(Context context, int bitAdress) {   
  9. Bitmap bitmaptemp = null;   
  10. bitmaptemp = BitmapFactory.decodeResource(context.getResources(),   
  11. bitAdress);   
  12. return bitmaptemp;   
  13. }   
  14. 2.图片平均分割方法,将大图平均分割为N行N列,方便用户使用   
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.   
  37. public final void cuteImage(Canvas g, Paint paint, Bitmap imgBit, int x,   
  38. int y, int w, int h, int line, int row) {   
  39. g.clipRect(x, y, x + w, h + y);   
  40. g.drawBitmap(imgBit, x – line * w, y – row * h, paint);   
  41. g.restore();   
  42. }   
  43. 3.图片缩放,对当前图片进行缩放处理   
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.   
  55. public Bitmap zoomImage(Bitmap bgimage, int newWidth, int newHeight) {   
  56.   
  57. int width = bgimage.getWidth();   
  58. int height = bgimage.getHeight();   
  59.   
  60. Matrix matrix = new Matrix();   
  61.   
  62. float scaleWidth = ((float) newWidth) / width;   
  63. float scaleHeight = ((float) newHeight) / height;   
  64.   
  65. matrix.postScale(scaleWidth, scaleHeight);   
  66. Bitmap bitmap = Bitmap.createBitmap(bgimage, 00, width, height,   
  67. matrix, true);   
  68. return bitmap;   
  69. }   
  70. 4.绘制带有边框的文字,一般在游戏中起文字的美化作用   
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.   
  89. public void drawText(String strMsg, Canvas g, Paint paint, int setx,   
  90. int sety, int fg, int bg) {   
  91. paint.setColor(bg);   
  92. g.drawText(strMsg, setx + 1, sety, paint);   
  93. g.drawText(strMsg, setx, sety – 1, paint);   
  94. g.drawText(strMsg, setx, sety + 1, paint);   
  95. g.drawText(strMsg, setx – 1, sety, paint);   
  96. paint.setColor(fg);   
  97. g.drawText(strMsg, setx, sety, paint);   
  98. g.restore();   
  99. }   
  100. 5.Android 图片透明度处理代码   
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.   
  110. public static Bitmap setAlpha(Bitmap sourceImg, int number) {   
  111. int[] argb = new int[sourceImg.getWidth() * sourceImg.getHeight()];   
  112. sourceImg.getPixels(argb, 0, sourceImg.getWidth(), 00,sourceImg.getWidth(), sourceImg.getHeight());  
  113. number = number * 255 / 100;   
  114. for (int i = 0; i < argb.length; i++) {   
  115. argb = (number << 24) | (argb & 0×00FFFFFF);  
  116. }   
  117. sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg.getHeight(), Config.ARGB_8888);   
  118. return sourceImg;   
  119. }   
  120. 6.图片翻转   
  121. Resources res = this.getContext().getResources();   
  122. img = BitmapFactory.decodeResource(res, R.drawable.slogo);   
  123. Matrix matrix = new Matrix();   
  124. matrix.postRotate(90);          
  125. int width = img.getWidth();   
  126. int height = img.getHeight();   
  127. r_img = Bitmap.createBitmap(img, 00, width, height, matrix, true);  

Java代码 复制代码 收藏代码

  1. import android.graphics.Bitmap;   
  2. import android.graphics.Canvas;   
  3. import android.graphics.LinearGradient;   
  4. import android.graphics.Matrix;   
  5. import android.graphics.Paint;   
  6. import android.graphics.PixelFormat;   
  7. import android.graphics.PorterDuffXfermode;   
  8. import android.graphics.Rect;   
  9. import android.graphics.RectF;   
  10. import android.graphics.Bitmap.Config;   
  11. import android.graphics.PorterDuff.Mode;   
  12. import android.graphics.Shader.TileMode;   
  13. import android.graphics.drawable.Drawable;   
  14.  
  15.  
  16.  
  17.  
  18.  
  19.   
  20. public class ImageUtil {   
  21.   
  22.  
  23.  
  24.   
  25. public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {   
  26.    int width = bitmap.getWidth();   
  27.    int height = bitmap.getHeight();   
  28.    Matrix matrix = new Matrix();   
  29.    float scaleWidht = ((float) w / width);   
  30.    float scaleHeight = ((float) h / height);   
  31.    matrix.postScale(scaleWidht, scaleHeight);   
  32.    Bitmap newbmp = Bitmap.createBitmap(bitmap, 00, width, height, matrix, true);   
  33.    return newbmp;   
  34. }   
  35.   
  36.  
  37.  
  38.   
  39. public static Bitmap drawableToBitmap(Drawable drawable) {   
  40.    int width = drawable.getIntrinsicWidth();   
  41.    int height = drawable.getIntrinsicHeight();   
  42.    Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);   
  43.    Canvas canvas = new Canvas(bitmap);   
  44.    drawable.setBounds(00, width, height);   
  45.    drawable.draw(canvas);   
  46.    return bitmap;   
  47.   
  48. }   
  49.   
  50.  
  51.  
  52.   
  53. public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {   
  54.   
  55.    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);   
  56.    Canvas canvas = new Canvas(output);   
  57.   
  58.    final int color = 0xff424242;   
  59.    final Paint paint = new Paint();   
  60.    final Rect rect = new Rect(00, bitmap.getWidth(), bitmap.getHeight());   
  61.    final RectF rectF = new RectF(rect);   
  62.   
  63.    paint.setAntiAlias(true);   
  64.    canvas.drawARGB(0000);   
  65.    paint.setColor(color);   
  66.    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);   
  67.   
  68.    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));   
  69.    canvas.drawBitmap(bitmap, rect, rect, paint);   
  70.   
  71.    return output;   
  72. }   
  73.   
  74.  
  75.  
  76.   
  77. public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {   
  78.    final int reflectionGap = 4;   
  79.    int width = bitmap.getWidth();   
  80.    int height = bitmap.getHeight();   
  81.   
  82.    Matrix matrix = new Matrix();   
  83.    matrix.preScale(1, -1);   
  84.   
  85.    Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2, width, height / 2, matrix, false);   
  86.   
  87.    Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height / 2), Config.ARGB_8888);   
  88.   
  89.    Canvas canvas = new Canvas(bitmapWithReflection);   
  90.    canvas.drawBitmap(bitmap, 00null);   
  91.    Paint deafalutPaint = new Paint();   
  92.    canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);   
  93.   
  94.    canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);   
  95.   
  96.    Paint paint = new Paint();   
  97.    LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff0x00ffffff, TileMode.CLAMP);   
  98.    paint.setShader(shader);   
  99.      
  100.    paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));   
  101.      
  102.    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint);   
  103.    return bitmapWithReflection;   
  104. }   
  105. }  

Java代码 复制代码 收藏代码

  1. private byte[] Bitmap2Bytes(Bitmap bm){   
  2.    ByteArrayOutputStream baos = new ByteArrayOutputStream();   
  3.    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);   
  4.    return baos.toByteArray();   
  5. }   
  6. private Bitmap Bytes2Bimap(byte[] b){   
  7.             if(b.length!=0){   
  8.                 return BitmapFactory.decodeByteArray(b, 0, b.length);   
  9.             }   
  10.             else {   
  11.                 return null;   
  12.             }   
  13.       }   
  14.   
  15.   
  16.  
  17.  
  18.  
  19.  
  20.  
  21.   
  22.     private Bitmap createBitmap( Bitmap src, Bitmap watermark )   
  23.     {   
  24.         String tag = "createBitmap";   
  25.         Log.d( tag, "create a new bitmap" );   
  26.         if( src == null )   
  27.         {   
  28.             return null;   
  29.         }   
  30.     
  31.         int w = src.getWidth();   
  32.         int h = src.getHeight();   
  33.         int ww = watermark.getWidth();   
  34.         int wh = watermark.getHeight();   
  35.           
  36.         Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );  
  37.         Canvas cv = new Canvas( newb );   
  38.           
  39.         cv.drawBitmap( src, 00null );  
  40.           
  41.         cv.drawBitmap( watermark, w - ww + 5, h - wh + 5null );  
  42.           
  43.         cv.save( Canvas.ALL_SAVE_FLAG );  
  44.           
  45.         cv.restore();  
  46.         return newb;   
  47.     }   
  48.     
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.   
  62.  private static Bitmap codec(Bitmap src, Bitmap.CompressFormat format,   
  63.                                     int quality) {   
  64.             ByteArrayOutputStream os = new ByteArrayOutputStream();   
  65.             src.compress(format, quality, os);               
  66.   
  67.             byte[] array = os.toByteArray();   
  68.             return BitmapFactory.decodeByteArray(array, 0, array.length);   
  69.         }   
  70.   
  71.   
  72. static byte[] streamToBytes(InputStream is) {   
  73.       ByteArrayOutputStream os = new ByteArrayOutputStream(1024);   
  74.       byte[] buffer = new byte[1024];   
  75.       int len;   
  76.       try {   
  77.              while ((len = is.read(buffer)) >= 0) {   
  78.              os.write(buffer, 0, len);   
  79.              }   
  80.           } catch (java.io.IOException e) {   
  81.   
  82.           }   
  83.           return os.toByteArray();   
  84. }   
  85.   
  86.   
  87.      
  88.  
  89.   
  90.     static Bitmap getViewBitmap(View v) {   
  91.            
  92.         v.clearFocus();   
  93.         v.setPressed(false);   
  94.   
  95.           
  96.         boolean willNotCache = v.willNotCacheDrawing();   
  97.         v.setWillNotCacheDrawing(false);    
  98.         int color = v.getDrawingCacheBackgroundColor();   
  99.         v.setDrawingCacheBackgroundColor(0);   
  100.         if (color != 0) {   
  101.             v.destroyDrawingCache();   
  102.         }   
  103.         v.buildDrawingCache();   
  104.         Bitmap cacheBitmap = v.getDrawingCache();   
  105.         if (cacheBitmap == null) {   
  106.             Log.e(TAG, "failed getViewBitmap(" + v + ")"new RuntimeException());   
  107.             return null;   
  108.         }   
  109.         Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);   
  110.           
  111.         v.destroyDrawingCache();   
  112.         v.setWillNotCacheDrawing(willNotCache);   
  113.         v.setDrawingCacheBackgroundColor(color);   
  114.         return bitmap;   
  115.     }  

Java代码 复制代码 收藏代码

  1. 读取raw资源文件中的mp3文件,然后通过音乐播放器播放:   
  2.   
  3.      
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.   
  11.     private void writeMP3ToSDcard(String fileName, Context context) {   
  12.         byte[] buffer = new byte[1024 * 8];   
  13.         int read;   
  14.         BufferedInputStream bin = new BufferedInputStream(context.getResources().openRawResource(R.raw.ring));   
  15.         try {   
  16.             BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(fileName));   
  17.             while ((read = bin.read(buffer)) > -1) {   
  18.                 bout.write(buffer, 0, read);   
  19.             }   
  20.             bout.flush();   
  21.             bout.close();   
  22.             bin.close();   
  23.         } catch (FileNotFoundException e) {   
  24.             e.printStackTrace();   
  25.         } catch (IOException e) {   
  26.             e.printStackTrace();   
  27.         }   
  28.     }   
  29.   
  30.   
  31. Intent intent = new Intent();   
  32. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);   
  33. intent.setAction(android.content.Intent.ACTION_VIEW);   
  34. intent.setDataAndType(Uri.fromFile(newFile("XXXXmp3的文件全路径")),"audio/*");   
  35. startActivity(intent);  

绘制图像倒影

Java代码 复制代码 收藏代码

  1. private void     
  2. _Init()      
  3. {      
  4.   m_paint = new Paint(Paint.ANTI_ALIAS_FLAG);      
  5.   LinearGradient lg = new LinearGradient(      
  6.     000, m_nShadowH,       
  7.     0xB0FFFFFF0x00000000,      
  8.     Shader.TileMode.CLAMP);      
  9.   m_paint.setShader(lg);      
  10.   m_paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));      
  11. }      
  12.      
  13. @Override protected void       
  14. onDraw(Canvas canvas)      
  15. {      
  16.   super.onDraw(canvas);      
  17.      
  18.   int nX = 0;      
  19.   int nY = 20;      
  20.      
  21.   _DrawNormalImg(canvas, nX, nY);      
  22.   _DrawMirror(canvas, nX, nY);      
  23. }       
  24.      
  25. private void     
  26. _DrawNormalImg(Canvas canvas, int nX, int nY)      
  27. {      
  28.   canvas.save(Canvas.MATRIX_SAVE_FLAG);      
  29.   canvas.translate(nX, nY);         
  30.   m_dw.draw(canvas);      
  31.   canvas.restore();      
  32. }      
  33.      
  34. private void     
  35. _DrawMirror(Canvas canvas, int nX, int nY)      
  36. {      
  37.   int nW = m_dw.getIntrinsicWidth();      
  38.   int nH = m_dw.getIntrinsicHeight();      
  39.      
  40.     
  41.     
  42.   canvas.save(Canvas.MATRIX_SAVE_FLAG);      
  43.   canvas.scale(1.0f, -1.0f);      
  44.   canvas.translate(nX, -(nY + nH * 2));      
  45.   canvas.clipRect(0, nH, nW, nH - m_nShadowH);      
  46.   m_dw.draw(canvas);      
  47.   canvas.restore();      
  48.      
  49.     
  50.     
  51.   canvas.save();      
  52.   canvas.translate(nX, nY + nH);      
  53.   canvas.drawRect(00, nW, m_nShadowH, m_paint);      
  54.   canvas.restore();      
  55. }    

Android 繪圖座標體系預設的原點在左上角,X 軸往右是越來越大的正值,而 Y 軸往下,則是越來越大的正值。要畫出垂直翻轉的圖片,其實也就是要垂直翻轉整個繪圖座標體系。在 Android 中,要如何做?答案就是 canvas.scale(1.0f, -1.0f)。很簡單吧,沒想到給 scale() 函式一個負值,就可以翻轉相對應的軸。
在 Photoshop 中,做鏡像特效的第二步是要對這翻轉的圖片,加個由灰到黑的漸層 mask。
在 Android 中,要畫漸層色,那就一定得用 LinearGradient 這個類別。至於要對背景圖加上個 mask,就請參考一下 Paint 的 setXfermode() 函式。_Init() 這個函式,就是負責生成一個由灰到黑漸層 mask 的 m_paint 物件。