2013-02-21 2 views
3

Мы пытаемся, чтобы написать свой собственный MapView, и я пытаюсь выяснить, как добавление накладок к MapView заставляет их втянуться в других API, картографированиеандроид вида ViewGroup аннулированию OnDraw и рисовать

Я получил MapView, который расширяет ViewGroup. Я думаю, что я понял, что вызов MapView.invalidate() вызывает вызов метода dispatchDraw mapview. Правильно ли это звучит?

Если это правда, когда называется метод onDraw и draw для вида mapview?

Что еще более важно, все это мнение и какие методы называются, когда материал хорошо документирован где угодно?

Спасибо!

EDIT This SO post пояснил, что для классов, расширяющих ViewGroup, метод OnDraw не вызывается автоматически. Вы должны заставить его, если вам это нужно. Но, как ebarrenchea отметил, заказ рисовать, OnDraw, dispatchDraw Если все методы называются

ответ

0

Вызов invalidate на вашем ViewGroup заставит draw бежать, который, в свою очередь вызов onDraw, а затем dispatchDraw. Вы должны взглянуть на документацию по просмотру here и просмотреть исходный код here.

+0

Да, я видел эту страницу, но нет там, где она говорит, что «вызывает недействительные причины ... произойти». поэтому, когда я вызываю mapView.invalidate, выполняется onDraw mapview, затем выполняется рисование mapView, затем dispatchDraw mapView, правильно? – Josh

+1

В документации там говорится: «Если вид виден, в будущем будет вызываться onDraw (android.graphics.Canvas)». И, глядя на исходный код View, указывается, что 'onDraw' вызывается из' draw' и сразу после того, как 'dispatchDraw' будет вызываться, как вы можете видеть [здесь] (http://grepcode.com/file/repository.grepcode.com /java/ext/com.google.android/android/2.0_r1/android/view/View.java#View.draw%28android.graphics.Canvas%29). – ebarrenechea

+0

Хммм я пропустил ссылку на исходный код в первый раз. ive прочитал это и посмотрел документацию, и это имеет смысл, но, похоже, мой метод onDraw никогда не называется! У меня есть запись журнала там, поэтому я могу видеть, когда это происходит, но это никогда не было написано. Любая идея, почему onDraw не будет вызываться? Вид виден, это вещь на экране! – Josh

0

invalidate() должен быть вызван из нити пользовательского интерфейса, чтобы вызвать onDraw(). Попробуйте использовать postInvalidate(), который должен иметь тот же эффект, что и invalidate(), но работает с темами, не относящимися к пользовательскому интерфейсу.

Смежные вопросы