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

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
Last Week in AI
Last Week in AI
腾讯CDC
The Cloudflare Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MyScale Blog
MyScale Blog
博客园 - Franky
MongoDB | Blog
MongoDB | Blog
I
InfoQ
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
Y
Y Combinator Blog
H
Help Net Security
T
Tailwind CSS Blog
美团技术团队
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed

博客园 - 蔡清华

数据库中查询的各种连接(左连接,右连接,全连接,内连接,交叉连接,自连接) 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 物件。