Графика в Android имеет важнейшее значение для разработчиков. Это одна из самых разнообразных и трудных тем в программировании, имеет много решений для любой ситуации. Обычный файл изображения несет в себе много разной информации в зависимости от формата, но самая главная его часть это - данные пикселей, такие как цвет и координаты. Для доступа к ним в Android есть класс - Bitmap (карта точек). Через него можно читать, изменять, записывать, и преобразовывать пиксели в удобную форму ( например в массив для обработки в цикле), а также делать более глобальные вещи : изменять размеры изображений и манипулировать им в пространстве. Простейший и один из самых главных действий с Bitmap это - загрузка изображения с выводом на экран:
- Bitmap bitmap = BitmapFactory.decodeResource( context.getResources() , R.drawable.image);
- ImageView.setImageBitmap(bitmap);
- int hColor = 0;
- int r, g, b;
- for (int x = 0; x < bitmap.getWidth(); x++)
- for (int y = y; y < bitmap.getHeight(); y++) {
- hColor = bitmap.getPixel(x, y);
- r = (hColor>>16)&0xff;
- g = (hColor>>8)&0xff;
- b = hColor&0xff;
- bitmap.setPixel(x, y, Color.rgb( r/2, g/2, b/2));
- } tmap.setPixel(x, y, Color.rgb( r/2, g/2, b/2));
Каждый пиксель физически состоит из трех пикселей главных цветов. Есть более простой способ чтения цвета пикселя, однако он в несколько раз медленнее :
- r = Color.red(bitmap.getPixel(x, y));
- g = Color.green(bitmap.getPixel(x, y));
- b = Color.blue(bitmap.getPixel(x, y));
Работа напрямую с Bitmap эффективна при работе с изображением в глобальном плане, однако когда необходимо выводить стандартные фигуры ( текст, линии , прямоугольники, круги, эллипсы, заливка цветом и другое) более эффективно использовать класс Canvas. Он сам решает математику по рисованию фигур в двумерном пространстве на пикселях. Более того, по возможности нужно всегда использовать стандартные классы в Android, так как они имеют хорошую оптимизацию на уровне виртуальной машины ( глубже на уровне железа ) всегда будут работать быстрее пользовательских решений подобных задач, используя неявные связи между Bitmap и виртуальной машиной. Если для заливки Bitmap цветом нужно использовать цикл, и перебрать все пиксели, что займет некоторое время, то класс Canvas справится с этим практически мгновенно. Объект данного класса принимает в конструктор Bitmap, на котором нужно рисовать, и объект типа Paint который задает параметры кисти.
- Canvas canvas = new Canvas(bitmap);
- canvas.drawLine(x, y, x + a, y + b, Paint);
- ...
- canvas.drawRect(x, y, x + a, y + b, Paint);
- ImageView.setImageBitmap(bitmap); , Paint);
Описывать все методы рисования Canvas не имеет смысла, они просты и в документации достаточно описаны. В самом Android SDK эти методы также можно посмотреть.
Комментариев нет:
Отправить комментарий