2012-01-12 45 views
2

我有一个相当大数量的小位图(100+,大小约为40x40),每个都有一些不透明和一些透明部分,我需要来画他们尊重这些地区。绘制带有alpha通道的位图:请指教...(某些解决方案和速度问题)

位图是ARGB格式,888(rgb)加上一个256位alpha通道,标准像PNG格式。

唯一(工作)的方式,我发现绘制这些是以下的方法:

  1. 创建位图(ARGB_8888)
  2. 填充位图与所述原始数据
  3. 提取从阿尔法层在原有基础上的位图
  4. 位图

  5. 创建BitmapShader(RGB_565)创建它使用着色器创建位图漆

  6. 然后使用具有特殊BitmapShader的颜料绘制alpha蒙版。

初始化代码只运行一次,当然:

void initializeTile(int t){ 
// Allocate the bitmap: 
Bitmap original_data = Bitmap.createBitmap(tile_w, tile_h, Bitmap.Config.ARGB_8888); 
// Fill with raw data (this is actually native C++ code): 
populateBitmap(original_data); 
// Get the alpha mask: 
tile_mask[ t ] = original_data.extractAlpha(); 
// Create the bitmap shader: 
tile_data = original_data.copy(Bitmap.Config.RGB_565, false); 
// Create the shader: 
BitmapShader shader = new BitmapShader(tile_data, CLAMP, CLAMP); 

// Create the paint: 
tile_paint[ t ] = new Paint(); 
tile_paint[ t ].setDither(true); 
tile_paint[ t ].setAntiAlias(true); 
tile_paint[ t ].setFilterBitmap(true); 
tile_paint[ t ].setShader(shader); 
} 

而且油漆代码是最简单可行的,并且它在正选赛循环:

void paintTile(t){ 
canvas.drawBitmap(tile_mask[ t ], tile_x[ t], tile_y[ t], tile_paint[ t]); 
} 

现在,在像Ideos(Android 2.2)这样的手机上,它运行平稳顺畅,但在其他手机(如顶级三星Galaxy SII(Android 2.3))上,它蹩脚而缓慢。这对我来说没有什么意义......

那么,您如何看待这种方法呢?有更好,更快的方法来达到相同的结果吗?

而且,您为什么认为它在现代,快速的硬件上太慢了?有什么方法可以改善它吗?

回答

4

好的,经过一番努力,我发现了一个更好的解决方案。我不能回答我自己的问题,所以如果你知道的比我多,请做。

但是,如果有更多人需要这个,我发布我的新解决方案,尽管有点复杂,但它的速度要快得多。关键的想法是仅在初始化期间使用着色器方法,而不是用于绘画。

为此,我创建了一个新的位图,该位图将使用着色器方法包含“剪切”位图(清除所有透明区域),然后在绘制代码中绘制没有任何着色器的剪切位图。

void initializeTile(int t){ 
// Allocate the bitmap: 
Bitmap original_data = Bitmap.createBitmap(tile_w, tile_h, Bitmap.Config.ARGB_8888); 
// Fill with raw data (this is actually native C++ code): 
populateBitmap(original_data); 

// Now make a new bitmap to be clipped: 
Bitmap clipped_data = Bitmap.createBitmap(tile_w, tile_h, Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(clipped_data); 
Paint clip_paint = new Paint(); 
clip_paint.setDither(true); 
clip_paint.setAntiAlias(true); 
clip_paint.setFilterBitmap(true); 
clip_paint.setShader(new BitmapShader(original_data, CLAMP, CLAMP)); 
// Paint the clipped bitmap: 
canvas.drawBitmap(tile_mask[ t ], 0, 0, clip_paint); 
//Use the clipped bitmap as original bitmap: 
tile_data[ t ] = clipped_data; 
} 

而且还绘制代码:

void paintTile(t){ 
canvas.drawBitmap(tile_data[ t ], tile_x[ t], tile_y[ t], null); 
} 

总的来说,这是要快得多。 还是不清楚为什么Android没有正确绘制我的Alpha通道位图而没有这些混乱!

相关问题