Фон
Я написал собственный Android View на основе LinearLayout
, который я назвал ReflectingLayout
. Идея довольно проста - визуализировать эффект отражения ниже дочерних представлений, объявленных в ReflectingLayout
. например ...
![Something like this](https://t3.gstatic.com/images?q=tbn:ANd9GcQpf0IpB89pF1lnclD46KFtxz8KmV4Lp-fEaDDYnPc4FOK1fb-jWA)
Я достигаю этого, переопределяя 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);
}
Проблема
Если мой ReflectingLayout
содержит, скажем, TextView
, и я изменяю текстовое содержимое этого TextView
, эффект отражения не обновляется.
Я считаю, что это потому, что Android будет перерисовывать только сам TextView
, а не все родительские представления, а это означает, что мой переопределенный метод dispatchDraw()
не вызывается.
Есть ли простой способ вызвать перерисовку родительского представления в ответ на изменения в любом из его дочерних представлений?
В частности, как я могу сделать так, чтобы мой ReflectingLayout
был перерисован при перерисовке дочерних представлений?
Вещи, которые я уже рассмотрел
Я заметил, что в API Level 11 был добавлен новый View.OnLayoutChangeListener
. Предположительно это можно использовать для регистрации обратного вызова в родительском представлении и запуска перерисовки (?). В любом случае мне нужно решение, которое будет работать на уровне API 7 и выше.
Я мог бы просто расширить TextView
и любой другой класс View, который я хочу объявить внутри ReflectingLayout
, чтобы сделать их родителей недействительными, поскольку они перерисовываются, но это неуклюжее решение.
Любая полученная помощь (в том числе, если вы считаете, что общий подход неверен).
Спасибо.