Растянуть / масштабировать определенный регион обзора / растровое изображение

Я пытаюсь применить ScaleAnimation к представлению, но у меня есть несколько нетрадиционное требование: я хотел бы масштабировать только очень специфический регион представления.

Используя существующий класс ScaleAnimation я могу легко равномерно масштабировать представление. Я также могу установить точку поворота, по которой можно масштабировать представление. Ниже приведен пример:

Смайлик, масштабированный снизу

Это просто. Но я хочу добиться следующего, что связано с масштабированием только определенной области вида (или в этом случае маленького горизонтального прямоугольника в середине смайлика):

Смайлик с определенной областью масштабирования

Я выкопал исходный код для ScaleAnimation , и следующая функция, по-видимому, отвечает за масштабирование:

 protected void applyTransformation(float interpolatedTime, Transformation t) { float sx = 1.0f; float sy = 1.0f; if (mFromX != 1.0f || mToX != 1.0f) { sx = mFromX + ((mToX - mFromX) * interpolatedTime); } if (mFromY != 1.0f || mToY != 1.0f) { sy = mFromY + ((mToY - mFromY) * interpolatedTime); } if (mPivotX == 0 && mPivotY == 0) { t.getMatrix().setScale(sx, sy); } else { t.getMatrix().setScale(sx, sy, mPivotX, mPivotY); } } 

Поскольку эта функция просто применяет операцию масштабирования к матрице, я думал, что есть какая-то матричная операция, которую я мог бы использовать для написания пользовательской анимации масштаба, но у меня нет ноу-хау в линейной алгебре. Решение этого может быть намного проще, поскольку, как кажется, другие сталкиваются с этой проблемой, но я не смог найти никаких решений. Заранее спасибо.

    Матрица преобразует весь битмап. Вы не можете масштабировать регионы с одной матрицей.