Фон
Я написал пользовательский Android-вид на основе LinearLayout
, который я назвал ReflectingLayout
. Идея довольно проста, чтобы сделать эффект отражения ниже любого дочернего вида, объявленного в ReflectingLayout
. например...
Я достигаю этого, переопределяя dispatchDraw()
в ReflectingLayout
следующим образом:
@Override
protected void dispatchDraw(Canvas canvas) {
Bitmap bitmap = Bitmap.createBitmap(...);
Canvas tempCanvas = new Canvas(bitmap);
// Draw child views to bitmap using tempCanvas
super.dispatchDraw(tempCanvas);
...
// some tranformations performed on bitmap
...
// draw transformed image on to main canvas
canvas.drawBitmap(bitmap, 0, 0, null);
}
Проблема
Если my ReflectingLayout
содержит, скажем, a TextView
, и я изменяю текстовое содержимое этого TextView
, эффект отражения не обновляется.
Я считаю, что это связано с тем, что Android будет перерисовывать только TextView
, а не все родительские представления, то есть мой переопределенный метод dispatchDraw()
не будет вызван.
Есть ли какой-либо простой способ вызвать перерисовку родительского представления в ответ на изменения в любом из его дочерних представлений?
В частности, как сделать, чтобы мой ReflectingLayout
был перерисован при перерисовании дочерних просмотров?
Вещи, которые я уже рассмотрел
-
Я заметил, что в API уровня 11 добавлен новый
View.OnLayoutChangeListener
. Предположительно это можно было бы использовать для регистрации обратный вызов родительского представления и запуск перерисовки (?). В любом случае мне нужно решение, которое будет работать над API уровня 7 вверх. -
Я мог бы просто расширить
TextView
и любой другой класс представления, который я хочу объявить внутриReflectingLayout
, чтобы сделать недействительным их родительский объект, поскольку они перерисовываются, но это неуклюжее решение.
Любая полученная помощь (в том числе, если вы считаете, что общий подход неверен).
Спасибо.