BitmapShader

//Initialize the bitmap object by loading an image from the resources folder  
    fillBMP = BitmapFactory.decodeResource(m_context.getResources(), R.drawable.cross);  
    //Initialize the BitmapShader with the Bitmap object and set the texture tile mode  
    fillBMPshader = new BitmapShader(fillBMP, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);  

    fillPaint.setStyle(Paint.Style.FILL);  
    //Assign the 'fillBMPshader' to this paint  
    fillPaint.setShader(fillBMPshader);  

    //Draw the fill of any shape you want, using the paint object.
    canvas.drawCircle(posX, posY, 100, fillPaint);
Path with Bitmap fill screenshotExample
from this blog
Android custom brush pattern/image
 记住onDraw是很消耗资源的 执行onDraw方法是很消耗资源的处理,它会强制Android执行多个图片组合和位图构建操作。下面有几点建议可以让你修改Canvas的外观,而不用重新绘制它:
  • 使用Canvas转换 可以使用像rotate和translate这样的转换,来简化Canvas中元素复杂的相关位置。例如,相比放置和旋转一个表盘周围的每一个文本元素,你可以简单地将canvas旋转22.5?,然后在相同的位置绘制文本。
  • 使用动画 可以考虑使用动画来执行View的预设置的转换,而不是手动地重新绘制它。在活动的View中可以执行缩放、旋转和转换动画,并可以提供一种能够有效利用资源的方式来提供缩放、旋转或者抖动效果。
  • 考虑使用位图和9 Patch 如果View使用了静态背景,那么你应该考虑使用一个图片,如位图或者9 patch,而不是手动地重新绘制。

android.graphic【android】

Canvas

It represents a surface that can have things drawn to it. The Canvas class provides methods for you to:

  • Draw primitives such as simple shapes and paths
  • Draw bitmaps
  • Draw text
  • Clip drawing operations
  • Translate, scale, rotate, or otherwise transform the canvas’s image
  • Save and restore drawing states

Paint

The Paint class in Android functions in a similar capacity of the physical brush: several different brushes that all have different properties, and you use each one for a different purpose.

  • could  give a Paint object which contains the properties with which you want that drawing operation to use.
  • could have as many different paint objects as you like, and you can use any of them for each drawing operation performed on a canvas.
  • can use any of them for each drawing operation performed on a canvas

The properties that a Paint object encapsulates are:

  • Drawing Color
  • Primitive drawing style (solid ‘fill’ or outline ‘stroke’)
  • Stroke style attributes
  • Fill shader
  • Text drawing font attributes
  • Color filter
  • Mask filter
  • Transfer mode
  • Shadow layer

Paint类相当于一个笔刷和调色板。它可以选择如何使用上面描述的draw方法来渲染绘制在画布上的基本图形。通过修改Paint对象,可以在绘图的时候控制颜色、样式、字体和特殊效果。除了这些简单的控制之外,Paint类还支持透明度,另外,它也可以通过使用各种各样的阴影、过滤器效果进行修改,从而提供由更丰富的、复杂的画笔和颜料组成的调色板

Android SDK包含了一些非常好的实例,它们说明了Paint类中可用的大部分功能。你可以在API demos的graphics子目录中找到它们:sdk root folder]\samples\ApiDemos\src\com\android\samples\graphics

使用透明度
Android中的所有颜色都包含了一个不透明组件(alpha通道)
当创建一个颜色的时候,可以使用argb或者parseColor方法来定义它的alpha值,如下所示:
// 使用红色,并让它50%透明
int opacity = 127;
int intColor = Color.argb(opacity, 255, 0, 0);
int parsedColor = Color.parseColor("#7FFF0000");
//也可以使用setAlpha方法来设置已存在的Paint对象的透明度:让颜色50%透明
int opacity = 127;
myPaint.setAlpha(opacity);

可以在任何使用了颜色的类或者方法中使用透明效果,包括Paint、ShaderMask Filter

Shader介绍

Shader类的派生类可以创建允许使用多种固体颜色填充绘图对象的Paint。
对Shader最常见的使用是定义渐变填充;渐变是在2D图像中添加深度和纹理的最佳方式之一。Android包含了一个Bitmap Shader和一个Compose Shader,同时,还包含了三个渐变的Shader。
Bitmap
Every canvas has exactly one underlying Bitmap object.

The bitmap holds the actual pixel data of the image. Whereas the Canvas class provides a high level interface to draw shapes, paths, text, and so on, the Bitmap class provides a more low-level interface to the image, allowing you to manipulate the pixels directly.

Bitmap.Config是内部枚举类表示位图的颜色配置,

  • 它的颜色配置有ALPHA_8、ARGB_4444、ARGB_8888、RGB_565

Bitmap是使用像素阵列来表示的图像,每个像素的颜色信息由RGB组合或者灰度值表示。根据颜色信息所需的数据位分为1、4、8、16、24及32位等,位数越高颜色越丰富,相应的数据量越大。

  • 使用1位表示一个像素颜色的位图因为一个数据位只能表示两种颜色,所以又称为二值位图。
  • 使用24位RGB组合数据位表示的的位图称为真彩色位图。
  • 一般来说,位图是没有经过压缩的,位图文件体积比较大。(位图常用的压缩算法是通过“索引颜色表”实现的),
  • 位图大多支持alpha通道(透明通道)。
  • RGB编码方式: 位图颜色的一种编码方法,用红、绿、蓝三原色的光学强度来表示一种颜色。 直接用于屏幕显示。
  • CMYK编码方式: 位图颜色的一种编码方法,用青、品红、黄、黑四种颜料含量来表示一种颜色。直接用于彩色印刷。
  • 色彩位数,即位图中要用多少个二进制位来表示每个点的颜色,是分辨率的一个重要指标。常用有1位(单色),2位(4色,CGA),4位(16色,VGA),8 位(256色),16位(增强色),24位和32位(真彩色)等。色深16位以上的位图还可以根据其中分别表示RGB三原色或CMYK四原色色深16位以上的位图还可以根据其中分别表示RGB三原色或CMYK四原色的位数进一步分类,如16位位图图片还可分为R5G6B5,R5G5B5X1(有1位不携带信息),R5G5B5A1,R4G4B4A4 等等。

Xfermode

Xfermode is the base class for objects that are called to implement custom “transfer-modes” in the drawing pipeline. 通过修改Paint的Xfermode来影响在Canvas已有的图像上面绘制新的颜色的方式 : 在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的,那么它将完全遮挡住下面的Paint;如果它是部分透明的,那么它将会被染上下面的颜色。

color blending, image compositing, small explanation about Transfer modes algorithms, source color, destenation color and op color

AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);    borderPen.setXfermode(avoid);

Xfermode子类:

  • AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
  • PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作
  • PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互

16条Porter-Duff规则:
1.PorterDuff.Mode.CLEAR
2.PorterDuff.Mode.SRC //
表示下面要绘制的文本应在上面绘制的圆的上层
3.PorterDuff.Mode.DST
4.PorterDuff.Mode.SRC_OVER
5.PorterDuff.Mode.DST_OVER
6.PorterDuff.Mode.SRC_IN
7.PorterDuff.Mode.DST_IN
8.PorterDuff.Mode.SRC_OUT
9.PorterDuff.Mode.DST_OUT
10.PorterDuff.Mode.SRC_ATOP
11.PorterDuff.Mode.DST_ATOP
12.PorterDuff.Mode.XOR
13.PorterDuff.Mode.DARKEN
14.PorterDuff.Mode.LIGHTEN
15.PorterDuff.Mode.MULTIPLY
16.PorterDuff.Mode.SCREEN

Paint p = new Paint();
p.setAntiAlias(true);
p.setAlpha(0x80);/设置颜色透明度为十六进制80(半透明),0x00全透明0xFF不透明
c.drawCircle(x/2, y/2, x/2, p);//在位图矩阵区域内画一个相切的圆
p.setAlpha(0x30);
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));//用指定的PorterDuff模型创建xformode


   Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Config.ARGB_4444);
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);//在绘制一个新的Paint对象时,可以通过传递给它一些标记来影响它被渲染的方式。ANTI_ALIAS_FLAG可以保证在绘制斜线的时候使用抗锯齿效果来平滑该斜线的外观。要创建更加平滑的文本效果,可以应用SUBPIXEL_TEXT_FLAG,它将会应用子像素抗锯齿效果。也可以手工地使用setSubpixelText和setAntiAlias方法来设置这些标记
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
//paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
//MULTIPLY 多层阴影
paint.setXfermode(new PorterDuffXfermode(mode));
canvas.drawBitmap(bitmap, rect, rect, paint);

after

BlueAsteroid

Just another WordPress.com site

Jing's Blog

Just another WordPress.com site

Start from here......

我的心情魔方

天才遠私廚

希望能做一個分享各種資訊的好地方

语义噪声

西瓜大丸子汤的博客

笑对人生,傲立寰宇

Just another WordPress.com site

Where On Earth Is Waldo?

A Project By Melanie Coles

the Serious Computer Vision Blog

A blog about computer vision and serious stuff

Cauthy's Blog

paper review...

Cornell Computer Vision Seminar Blog

Blog for CS 7670 - Special Topics in Computer Vision

datarazzi

Life through nerd-colored glasses

Luciana Haill

Brainwaves Augmenting Consciousness

槑烎

1,2,∞

Dr Paul Tennent

and the university of nottingham

turn off the lights, please

A bunch of random, thinned and stateless thoughts around the Web

John's Weblog

Just another WordPress.com weblog

I Am That I Am

Chasing tomorrow's sunrise.