Как вызвать перерисовку родительского View, когда перерисовывается любой из его дочерних View?

Background

Я написал пользовательское представление Android, основанное на LinearLayout, которое я назвал ReflectingLayout. Идея довольно проста - отобразить эффект отражения под всеми дочерними представлениями, объявленными в ReflectingLayout. Например...

Something like this

Я добиваюсь этого, переопределяя 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 перерисовываться, когда перерисовываются дочерние представления?

То, что я уже рассмотрел

  • Я заметил, что новый View.OnLayoutChangeListener был добавлен в API Level 11. Предположительно, его можно использовать для регистрации обратного вызова родительского представления и запуска перерисовки(?). В любом случае, мне нужно решение, которое будет работать на API Level 7 и выше.

  • Я мог бы просто расширить TextView и любой другой класс View, который я хочу объявить внутри ReflectingLayout, чтобы аннулировать их родителя при перерисовке, но это громоздкое решение.

Любая помощь будет принята с радостью (в том числе, если вы считаете, что общий подход неверен).

Спасибо.

11
задан Community 9 February 2017 в 15:09
поделиться