Android: Рисование плиточных растровых изображений с основанием или некоторыми другими выравниваниями, подобными CSS-background-position - PullRequest
2 голосов
/ 18 марта 2012

Я хочу установить фон для представления с мозаичным растровым изображением, но мозаика должна быть привязана к левому нижнему углу, а не к верхнему левому углу (по умолчанию). Например, если на плитах изображены смайлики ниже, я хочу, чтобы они были выложены как:

enter image description here

Используя xml drawables, я мог бы достичь либо мозаики (используя tileMode="repeat"), либо позиционирования снизу (используя gravity="bottom"), но комбинирование обоих невозможно, даже в документации сказано:

андроида: TILEMODE

Ключевое слово. Определяет режим плитки. Когда режим плитки включен, растровое изображение повторяется. Гравитация игнорируется , когда режим плитки включен.

Хотя это не поддерживается внутри, есть ли способ достичь этого, возможно, с помощью пользовательских представлений?

Ответы [ 3 ]

5 голосов
/ 22 марта 2012

Другим способом было бы расширить BitmapDrawable и переопределить метод paint():

В этом методе мы избегаем создания нового растрового изображения с размером представления.

class MyBitmapDrawable extends BitmapDrawable {
    private Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG);
    private boolean mRebuildShader = true;
    private Matrix mMatrix = new Matrix();

    @Override
    public void draw(Canvas canvas) {
        Bitmap bitmap = getBitmap();
        if (bitmap == null) {
            return;
        }

        if (mRebuildShader) {
            mPaint.setShader(new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT));
            mRebuildShader = false;
        }

        // Translate down by the remainder
        mMatrix.setTranslate(0, getBounds().bottom % getIntrinsicHeight());
        canvas.save();
        canvas.setMatrix(mMatrix);
        canvas.drawRect(getBounds(), mPaint);
        canvas.restore();
    }
}

Это может быть установлено на вид как это:

view.setBackgroundDrawable(new MyBitmapDrawable(getResources().getDrawable(R.drawable.smiley).getBitmap()));
1 голос
/ 22 марта 2012

Использование собственного представления может включать обработку всех чертежа самостоятельно, а не только фонового изображения.

Вместо этого я предлагаю установить фон представления программно, как показано:

// This drawable refers to an image directly and NOT an XML
BitmapDrawable smiley = (BitmapDrawable) getResources().getDrawable(R.drawable.smiley);

// Create a new bitmap with the size of the view
Bitmap bgBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bgBitmap);

// Translate down by the remainder
Matrix matrix = new Matrix();
matrix.setTranslate(0, view.getHeight() % smiley.getIntrinsicHeight());
canvas.setMatrix(matrix);

// Tile the smileys
Paint paint = new Paint();
paint.setShader(new BitmapShader(smiley.getBitmap(), TileMode.REPEAT, TileMode.REPEAT));
canvas.drawPaint(paint);

view.setBackgroundDrawable(new BitmapDrawable(bgBitmap));

Нужно учитывать:

  • Я не уверен, что view.getWidth () и view.getHeight () являются правильными методы получения размеров.
  • Что делать, если размер смайлика больше, чем у вида?
1 голос
/ 21 марта 2012

Просто мысль, и это довольно круто, но не могли бы вы перевернуть изображение по вертикали, а затем применить преобразование к фону, чтобы перевернуть , что также по вертикали?

...