2016-02-23 5 views
5

я видел это в TextView классе андроида:Что вызывает метод OnDraw зрения называться и когда

@Override 
protected void onDraw(Canvas canvas) { 
    restartMarqueeIfNeeded(); 

    // Draw the background for this view 
    super.onDraw(canvas); 

В View класс андроида, я вижу, что он пуст:

/** 
* Implement this to do your drawing. 
* 
* @param canvas the canvas on which the background will be drawn 
*/ 
protected void onDraw(Canvas canvas) { 
} 

Почему кто-нибудь вызовет метод суперкласса, если он пуст?

Где находится метод с холстом параметров?

Является ли параметр холст автоматически передан системой android?

Когда метод ondraw называется и кем?

Когда он переопределяется, используется метод подкласса вместо суперкласса?

Это мой пользовательский вид, например:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new MyView(this)); 


    } 
} 
class MyView extends View { 


    public MyView(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
    } 
} 

Кто вызывает метод MyView.OnDraw?

Должна быть какая-то одна строка кода, которая вызывает метод Myview.Ondraw.Isnt'it?

+1

использовать 'Thread # dumpStack()' inside 'onDraw' и посмотреть' logcat' – pskink

+0

Возможный дубликат [Android при вызове onDraw?] (Http://stackoverflow.com/questions/17576970/android-when- ondraw-is-called) – user1643723

ответ

2

Чтобы ответить на ваши вопросы:

Почему бы кто-нибудь вызов метода супер класс, если он пустой?

Потому что это хорошая практика, чтобы позвонить супер, если вы не уверены, что такое реализация. Например, если у вас есть расширенный класс класса в библиотеке, и у вас нет кода этого, вы должны вызвать метод super. В этом случае, однако, это не обязательно, но я бы рекомендовал его

Где находится метод с холстом параметров?

Я не совсем уверен, что вы имеете в виду под этим, но когда вы позволяете вашему класс переопределения View, вы можете переопределить onDraw так что вы можете решить, как ваш взгляд выглядит

Является ли параметр холст передается автоматически с помощью системы Android?

Да

Когда OnDraw метод вызывается и кем?

Он вызывается деятельностью, к которой он привязан где-то в своем жизненном цикле, когда он становится видимым в первый раз. Тебе не о чем беспокоиться. Он также вызывается, когда вы вызываете invalidate на вид или когда он считается грязным (его нужно перерисовать). В вашем примере будет вызываться onDraw, но так как вы ничего не нарисовали на поставляемом холсте, вы ничего не увидите в своей деятельности.Если вы добавите некоторый журнал в функцию, вы увидите, что он находится в логарифме

Когда он переопределяется, это метод подкласса, называемый вместо суперкласса '?

Да, вот как он работает с проходящими классами и преобладающими методами

+0

Я обновил свой вопрос. Мой вопрос: кто вызывает метод MyView.OnDraw? потому что я вижу только созданный объект класса Myview и после вызова вызывающего конструктора. – user5949689

+0

"setContentView (новый MyView (this));" и затем: «public MyView (контекст контекста) { супер (контекст); }" – user5949689

+0

@ user5949689 обновлен мой ответ – 0xDEADC0DE

1

The onDraw вызываются ViewRoot, когда кто-то просил перерисовку одного его ребенку Просмотров по телефону invalidate или postInvalidateOnAnimation. ViewRoot вызывает onDraw каждого дочернего элемента Window, а те, в свою очередь, рисуют их видимые дети (в случае ViewGroup) или сами (в случае Views) до тех пор, пока не будет отображен последний View.

Чертеж может выполняться в любое время на основном потоке, что нормально и используется по умолчанию в старых версиях, но не визуально идеально. В качестве альтернативы он может откладываться до следующей вертикальной синхронизации через Choreographer. Современные версии Android расписывают все звонки на onDraw, вызванные недействительностью и анимацией Drawable, через хореографа.

Холст предоставлен SurfaceFlinger - Система Android Window, которая внутренне использует OpenGL ES и аппаратную композицию для управления отображаемыми окнами.

Когда оно переопределено, это метод подкласса, называемый вместо суперкласса '?

Да. Но не называть onDraw суперкласса редко действительной тактикой (почему вы подклассифицируете ее в первую очередь ?!) Если вы не хотите, чтобы что-то было нарисовано, вы можете позвонить setWillNotDraw(true) (по умолчанию для базового класса «Вид» уже есть true, по путь).

0

Дополнительная информация о вышеуказанной: мягкая клавиатура вызывает View.invalidate() -> View.onDraw() после изменения размера окна, чтобы разумно разместить «клавиатуру». Пользовательский View.onDraw() должен оставить себя в состоянии, которое предвосхищает эту возможность.
Это может объяснить, почему приложение, разработанное и протестированное на планшете с клавиатурой Bluetooth, неожиданно появилось в реальном мире.

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

  • Нет связанных вопросов^_^