Просмотр внешних границ не отображается должным образом

Я рисую всплывающую подсказку после щелчка внутри пользовательской гистограммы (созданной с помощью MPAndroidChart). Иерархия представлений выглядит следующим образом

<LinearLayout>
     <TextView text=Move & Max Pain/>
     <RelativeLayout with 2 textviews>
     <chart
       clipToChildren=false
       clipToPadding=false
     />
</LinearLayout>

Пока представление находится внутри диаграммы или ее ближайшего брата, все выглядит хорошо. Но в тот момент, когда он сталкивается со своим родным братом, всплывающая подсказка усекается.

введите здесь описание изображения

Используя HierarchyViewer, я вижу, что содержимое присутствует, но не отображается.

Чтобы получить отсечение, я использую этот код внутри draw

    @Override
  public void draw(Canvas canvas, float posx, float posy) {
    // take offsets into consideration
    posx += getXOffset();
    posy += getYOffset();

    canvas.save();

    // translate to the correct position and draw
    canvas.translate(posx, posy);

    Rect clipBounds = canvas.getClipBounds();
    clipBounds.inset(0, -getHeight());
    canvas.clipRect(clipBounds, Region.Op.INTERSECT);

    draw(canvas);
    canvas.translate(-posx, -posy);

    canvas.restore();
  }

Если я изменяю Op на Region.Op.Replace, всплывающая подсказка отображается правильно, но заменяет содержимое панели инструментов, а не прокручивается под ним.

введите здесь описание изображения


person Maragues    schedule 14.05.2015    source источник
comment
Не могли бы вы опубликовать исходные коды этого? Выглядит отлично, хочу посмотреть на него поглубже. Спасибо, в любом случае.   -  person SilentKnight    schedule 27.05.2015
comment
Спасибо! Но, боюсь, я не могу, извините. Я использую github.com/PhilJay/MPAndroidChart для диаграмм, но я настроил некоторые части (особенно метки X)   -  person Maragues    schedule 27.05.2015
comment
Вероятно, это не единственная ваша проблема, но я думаю, что вы неправильно используете canvas.save(). Разве вы не должны вызывать его перед вашим первым переводом, а затем вызывать восстановление после того, как вы закончите, а не вызывать перевод снова в отрицательном направлении.   -  person charliebeckwith    schedule 28.05.2015
comment
Он исправляет это на Lollipop, но все еще не работает на Kitkat :(   -  person Maragues    schedule 28.05.2015
comment
Я обновил вопрос после вашего комментария. Спасибо!   -  person Maragues    schedule 28.05.2015
comment
Я стреляю от бедра здесь, но можете ли вы добиться того, что вам нужно, поместив подсказку в FrameLayout и просто переключив видимость? Это своего рода базовое предложение (потому что у меня пока нет тонны опыта), так что вы, вероятно, уже подумали об этом, но не помешает высказать эту идею. Я не уверен, как именно вы должны выровнять подсказку внутри FrameLayout, где вы хотите, чтобы она попала в верхнюю часть вашего графика в нужном месте, но похоже, что у вас уже есть механика для этого.   -  person Chamatake-san    schedule 09.06.2015


Ответы (1)


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

Чтобы объяснить это в коде, это будет примерно так (непроверено):

Rect scrollViewRect;  // the bounds of your scrollview
Rect tooltipRect;     // the bounds of your tooltip

bool intersects = tooltipRect.intersect(scrollViewRect)
if(intersects)
{
    canvas.clipRect(tooltipRect, Region.Op.REPLACE);
    draw(canvas);
}
person Wex    schedule 10.06.2015