(۱۳۹۳/۱۲/۲۰, ۱۱:۲۱ ق.ظ)'yousefesi' نوشته: متد onDraw رو کی فراخونی می کنه ؟
ورودی اون رو (canvas) کی می ده؟
هنگام تعریف کلاس DemoView ، کد خط اول را ببینید :
کد پیاچپی:
private class DemoView extends View{
کلاس DemoView از توسعه (extends) کلاس View ساخته می شود. بنابراین بخشی از کدهای اجرایی، در خود کلاس View می باشد. یعنی کلاس View ، خودش یک روش (method) با نام onDraw دارد که ما هنگام تعیین کدهای کلاس DemoView ، تنها روش onDraw مربوط به کلاس پایه View را Override کرده ایم. این موضوع را از علامت گذاری Override@ می توان متوجه شد :
کد پیاچپی:
@Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
بنابراین فراخوانی روش onDraw را باید در کدهای کلاس پایه View بیابید.
------------------------------------------------------------------
برای درک بهتر این موارد، نیازی نیست که حتما کدهای خاصی را بررسی کنیم، بلکه بررسی خود کدهای یک Activity ساده و روش های (method) آن، همین نکات را خواهد داشت :
کد پیاچپی:
package com.kelidestan.com;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class NewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_activity);
// your codes
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
// your codes for pause
}
}
ممکن است شخصی با دیدن کدهای بالا، بگوید که چرا به محض اجرای کدهای Activity ، روش onCreate اجرا می شود، ولی روش onPause تنها زمانی اجرا می شود که Activity به حالت pause رفته باشد ؟
پاسخ این است که باید کدهای کلاس پایه، که در اینجا کلاس Activity می باشد، را بررسی کنیم که در آنجا تعیین شده که هر روش (method) چه زمانی اجرا شود. زیرا این کلاس (در واقع این Activity که ساخته ایم، یا بهتر بگوییم، این شیء (object) که از کلاس Activity ساخته ایم)، بر اساس توسعه (extends) کلاس Activity می باشد :
کد پیاچپی:
public class NewActivity extends Activity {
------------------------------------------------
چون در مورد Override صحبت شد، بهتر است کمی در مورد آن توضیح بدهیم.
ابتدا باید تذکر داده شود که عبارت زیر، یک نوع علامت گذاری برای compiler است :
یعنی به compiler می گوید که دارم یک روش (method) را Override می کنم، بنابراین اگر compiler روشی با آن نام را نیابد، به ما یک اخطار می دهد (زیرا باید در کلاس پایه، یک روش با آن نام وجود داشته باشد تا آن را Override کنیم).
اما حالا شرح بدهیم که اصلا خود Override کردن چیست.
Override کردن method ، یعنی اینکه ما می خواهیم یک روش (method) موجود در کلاس پایه (کلاسی که از آن، روش ها را به ارث برده ایم) را با کدهای متفاوتی اجرا کنیم، یعنی کدهای اجرایی آن، مثل روش موجود در کلاس پایه نباشد، بلکه یک سری کد دیگر اجرا شود. برای این منظور، روش مورد نظر را دوباره کدنویسی می کنیم، یا در اصطلاح، Override می کنیم (مطابق روندی که در مثال های قبلی بود).