سلام.
من کد MainActivity.java را ذکر می کنم :
کد پیاچپی:
package com.example.simplegraphics;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
public class MainActivity extends Activity {
DemoView demoview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
demoview = new DemoView(this);
setContentView(demoview);
}
private class DemoView extends View{
public DemoView(Context context){
super(context);
}
@Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// custom drawing code here
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
// make the entire canvas white
paint.setColor(Color.WHITE);
canvas.drawPaint(paint);
// draw blue circle with anti aliasing turned off
paint.setAntiAlias(false);
paint.setColor(Color.BLUE);
canvas.drawCircle(20, 20, 15, paint);
// draw green circle with anti aliasing turned on
paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
canvas.drawCircle(60, 20, 15, paint);
// draw red rectangle with anti aliasing turned off
paint.setAntiAlias(false);
paint.setColor(Color.RED);
canvas.drawRect(100, 5, 200, 30, paint);
// draw the rotated text
canvas.rotate(-45);
paint.setStyle(Paint.Style.FILL);
canvas.drawText("Graphics Rotation", 40, 180, paint);
//undo the rotate
canvas.restore();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
خوب ابتدا باید ببینیم که در روش onCreate که به محض شروع Activity ، اجرا می شود، چه کدهایی نوشته شده :
کد پیاچپی:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
demoview = new DemoView(this);
setContentView(demoview);
}
خط زیر از کد بالا را ببینید :
کد پیاچپی:
demoview = new DemoView(this);
در آن، از کلاس (Class) با نام DemoView ، یک شیء (object) با نام demoview ساخته ایم (با دیدن کلمه new ، متوجه ساخت شیء از روی کلاس می شویم). کدهای مربوط به تعریف کلاس DemoView در خود کدهای این Activity وجود دارد :
کد پیاچپی:
private class DemoView extends View{
public DemoView(Context context){
super(context);
}
@Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// custom drawing code here
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
// make the entire canvas white
paint.setColor(Color.WHITE);
canvas.drawPaint(paint);
// draw blue circle with anti aliasing turned off
paint.setAntiAlias(false);
paint.setColor(Color.BLUE);
canvas.drawCircle(20, 20, 15, paint);
// draw green circle with anti aliasing turned on
paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
canvas.drawCircle(60, 20, 15, paint);
// draw red rectangle with anti aliasing turned off
paint.setAntiAlias(false);
paint.setColor(Color.RED);
canvas.drawRect(100, 5, 200, 30, paint);
// draw the rotated text
canvas.rotate(-45);
paint.setStyle(Paint.Style.FILL);
canvas.drawText("Graphics Rotation", 40, 180, paint);
//undo the rotate
canvas.restore();
}
}
که در آن، روش (method) با نام
onDraw تعریف شده که با ساخت یک شیء از این کلاس، اجرا خواهد شد :
کد پیاچپی:
@Override protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// custom drawing code here
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
// make the entire canvas white
paint.setColor(Color.WHITE);
canvas.drawPaint(paint);
// draw blue circle with anti aliasing turned off
paint.setAntiAlias(false);
paint.setColor(Color.BLUE);
canvas.drawCircle(20, 20, 15, paint);
// draw green circle with anti aliasing turned on
paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
canvas.drawCircle(60, 20, 15, paint);
// draw red rectangle with anti aliasing turned off
paint.setAntiAlias(false);
paint.setColor(Color.RED);
canvas.drawRect(100, 5, 200, 30, paint);
// draw the rotated text
canvas.rotate(-45);
paint.setStyle(Paint.Style.FILL);
canvas.drawText("Graphics Rotation", 40, 180, paint);
//undo the rotate
canvas.restore();
}
مشکل اصلی من با خط آخری هست که توضیح دادید
متد onDraw رو کی فراخونی می کنه ؟
ورودی اون رو (canvas) کی می ده؟
(من این طور می دونم که اگه ما ابجت از یه کلاس داشته باشیم با دات می شه اونا رو فراخونی کرد ولی این جا فقط یه ابجت ازDemoView درست کرده و خبری ازdemoview.onDraw نیست )
(۱۳۹۳/۱۲/۲۰, ۱۱:۲۱ ق.ظ)'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 می کنیم (مطابق روندی که در مثال های قبلی بود).