У меня довольно большое количество маленьких растровых изображений (100+, размер около 40x40), каждое из которых имеет непрозрачные и прозрачные части, и мне нужно нарисовать их с учетом этих областей.
Растровые изображения в формате ARGB, 888 (rgb) плюс 256-битный альфа-канал, стандартный, как в формате PNG.
Единственный (рабочий) способ, которым я нашел их рисование, это следующий подход:
- создатьрастровое изображение (ARGB_8888)
- заполнить растровое изображение необработанными данными
- извлечь альфа-слой из растрового изображения
- создать BitmapShader (RGB_565) на основе исходного растрового изображения
Создание краски для растрового изображения, в которой используется созданный шейдер
Затем нарисуйте альфа-маску с помощью краски с помощью специального BitmapShader.
Код инициализации запускается только один раз, конечно:
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)он работает плавно и нормально, но на других телефонах, таких как топовый Samsung Galaxy SII (Android 2.3), он дрянной и медленный.Это не имеет большого смысла для меня ...
Итак, что вы думаете об этом подходе?Существуют ли лучшие, более быстрые способы достижения того же результата?
И почему, по вашему мнению, это слишком медленно на современном быстром оборудовании?Есть ли способы улучшить его?