Canvas.drawBitmap () игнорируя режим плитки для рисования - PullRequest
3 голосов
/ 30 января 2012

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

Я настроил все переменные следующим образом:

Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Rect srcRect = ...
Rect dstRect = ...
Paint p = new Paint();
p.setShader(new BitmapShader(b, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT));

А затем в методе draw() я рисую следующим образом:

canvas.drawBitmap(b, srcRect, dstRect, p);

Что я делаю не так? Как мне нарисовать srcRect в dstRect так, чтобы моя часть растрового изображения стала мозаичной?

1 Ответ

7 голосов
/ 30 января 2012

Я обнаружил проблему, изложив вкратце: шейдеры на растровых изображениях не работают таким образом.

Чтобы нарисовать прямоугольник, мозаичный с определенным Bitmap, вы должны использовать Canvas.drawRect() с Paint который имеет BitmapShader.Тем не менее, Android dev никогда не может быть таким простым.

Сначала вы должны вырезать srcRect до отдельного Bitmap (где-то это кешируется, так как я не думаю, что это дешевооперация), вот так:

Bitmap t = Bitmap.createBitmap(b, srcRect.left, srcRect.top, srcRect.right-srcRect.left, srcRect.bottom-srcRect.top);

Затем вам нужно создать Paint и BitmapShader:

BitmapShader bs = new BitmapShader(t, TileMode.REPEAT, TileMode.REPEAT);
Paint p = new Paint();
p.setShader(bs);

Затем вы можете наконец нарисовать прямоугольник назначения, носначала вам нужно настроить матрицу перевода для шейдера, иначе она не запустится с правильного места и может полностью зависнуть, если ваш режим плиток - CLAMP:

Matrix m = new Matrix();
m.postTranslate(dstRect.left, dstRect.right);
p.getShader().setMatrix(m);
canvas.drawRect(dstRect, p);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...