2010-12-14 3 views
3

Я хотел бы «сдвинуть» растровое изображение на определенное смещение x и y. По смене, я имею в виду, если у меня есть растровое изображение размером 300 x 500, и я сдвигаю его с помощью смещения -50, я ожидаю, что каждый пиксель будет перемещаться на 50 пикселей, а прямоугольник размером 300 × 50 пикселей будет пустым, в нижней части растрового изображения , Приведенный ниже код отлично работает, если shiftX и shiftY отрицательны, но не работают вообще для положительных значений. Я не имею понятия почему?Android: как сдвинуть растровое изображение?

Rect srcRect = new Rect(-shiftX, -shiftY, mBitmap.getWidth(), mBitmap.getHeight()); 
Rect destRect = new Rect(srcRect); 
destRect.offset(shiftX, shiftY); 

Canvas bitmapCanvas = new Canvas(mBitmap); 
bitmapCanvas.drawBitmap(mBitmap, srcRect, destRect, null); 

Я пробовал много разных версий этого. Кажется, что попытка перевести битмап с положительным y всегда производит мусор. В этом простом примере, отрицательный бегающие дает ожидаемое поведение, но положительный бегающие дает результат мусора:

Canvas bitmapCanvas = new Canvas(mBitmap); 
bitmapCanvas.drawBitmap(mBitmap, 0, shiftY, null); 

* Update. Это решается приведенным ниже кодом. Однако это не эффективная память. Любые предложения для лучшего решения?

Canvas bitmapCanvas = new Canvas(mBitmap); 
Bitmap tempBitmap = mBitmap.copy(CONFIG.ARGB_8888, false); 
bitmapCanvas.drawBitmap(tempBitmap, 0, shiftY, null); 
+0

'не work' означает, что именно? Что вы получаете? – WarrenFaith

+0

создает, по-видимому, результат мусора – ab11

+0

почему вы создаете новый холст? – WarrenFaith

ответ

0

Я не могу воспроизвести это с помощью вашего кода. Я пробовал его со смещением 50 и -50, и оба работают так, как ожидалось.

Мой код внутри метода рисования:

// negative value: -50 
Rect srcRect = new Rect(-(-50), -(-50), mBitmap.getWidth(), mBitmap.getHeight()); 
Rect destRect = new Rect(srcRect); 
destRect.offset(-50, -50); 

canvas.drawBitmap(mBitmap, srcRect, destRect, null); 

или с положительным:

// positive value: 50 
Rect srcRect = new Rect(-50, -50, mBitmap.getWidth(), mBitmap.getHeight()); 
Rect destRect = new Rect(srcRect); 
destRect.offset(50, 50); 

canvas.drawBitmap(mBitmap, srcRect, destRect, null); 
+0

Когда вы рисуете с положительным значением, вы уже инициализировали растровое изображение, чтобы иметь некоторый контент? Я думаю, что проблема заключается в том, чтобы перезаписать пиксели, которые уже были написаны. – ab11

+0

метод drawBitmap с прямым считыванием пикселей из растрового изображения и нарисовать их на destRect, поэтому не должно быть уже написанного пикселя. Можете ли вы предоставить немного больше кода? – WarrenFaith

+0

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

0

Простое решение ...

canvas.translate(dx, dy); 

canvas.draw....(); 
Смежные вопросы