2016-02-11 9 views
1

У моего приложения есть функция, позволяющая пользователю снимать фотографию и добавлять рисунок на эту фотографию.Android Canvas не рисует больше размеров экрана

Все фотографии переделаны точно в 900 x 900. Чтобы пользователь мог добавить рисунок к изображению. Я держу transparent image над original image и делаю рисунок на прозрачном изображении. Рисование выполняется с использованием canvas.

Но при нанесении на устройство, которое имеет 720 x 480 (высота x ширина). Если я создаю прозрачное изображение 900 x 900 и рисую линию от 0,0 до 900,900, холст только рисует линию от 0,0 до 480,480.

Ниже приводится соответствующая часть кода:

Подготовка Canvas:

holder = getHolder(); 
if (holder.getSurface().isValid()) { 

    Canvas canvas = holder.lockCanvas(); 
    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
    /* original image is 900 x 900 */ 
    overlayBitmap = Bitmap.createBitmap(originalImage.getWidth(), originalImage.getHeight(), originalImage.getConfig()); 
    canvas.setBitmap(overlayBitmap); 
} 

Drawing Line:

canvas.drawLine(0, 0, 900, 900, paint); 

Я понятия не имею, почему я с этим вопрос. Это из-за использования canvas ?? Есть ли какая-нибудь работа? Любая помощь очень ценится :-)

ответ

0

После некоторого более подробно о canvas, а также справка от this сообщение я смог исправить проблему.

Вопрос был в canvas clip rectangle. Это было (0,0,480,480) по умолчанию, поскольку дисплей устройства был 720 x 480, я думаю? Так что все, что было на растровом изображении, всегда было обрезано до 480 x 480.

Позже я изменил мой код, как это:

holder = getHolder(); 
if (holder.getSurface().isValid()) { 

    Canvas canvas = holder.lockCanvas(); 
    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
    /* original image is 900 x 900 */ 
    overlayBitmap = Bitmap.createBitmap(originalImage.getWidth(), originalImage.getHeight(), originalImage.getConfig()); 
    canvas.setBitmap(overlayBitmap); 

    /* set extended clip rectangle for the larger target bitmap */ 
    Rect clipRect = canvas.getClipBounds(); 
    clipRect.set(0, 0, image.getWidth(), image.getHeight()); 
    canvas.clipRect(clipRect, Region.Op.REPLACE); 

} 

После замены размера клипа прямоугольника с размером изображений все работало просто отлично.

0

Просто потому, что фотография 900x900, это не значит, что это точно так много пикселей при отображении на экране устройства. Экран устройств может иметь самые разные размеры, и, когда говорят, что изображение (или любой вид в этом случае) расширяется, чтобы соответствовать экрану или измеряться в dp (независимые от устройства пиксели), то число пикселей устройства различаются в зависимости от экрана устройства.

Ваш код должен быть чувствительным к этим различиям. Когда вы делаете рисунок, не принимайте размер холста вида. Вместо этого спросите мнение, насколько оно велико, и выполните весь чертеж, основанный на фактическом измеренном размере.

+0

Спасибо, но добавленный код используется только для целей тестирования. –

+0

Я понятия не имею, что это значит. Я объяснил в общем смысле, почему ваши строки не рисуют ожидаемого размера. Пожалуйста, приложите усилия, чтобы понять, что означает, что для устройств Android используются пиксели разного размера. –