کلیدستان

نسخه‌ی کامل: عدم درک چگونگی فراخوانی بعضی از روش ها (methods) در کد برنامه اندروید
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام.
بر اساس کد لینک زیر :

http://www.javatpoint.com/android-simple...cs-example

می شه توضیح بدید روش onDraw (در مثال بالا) کی فراخوانی و مقدار دهی شد ؟   
سلام.
من کد 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(202015paint);  
  
            
// draw green circle with anti aliasing turned on  
            
paint.setAntiAlias(true);  
            
paint.setColor(Color.GREEN);  
            
canvas.drawCircle(602015paint);  
  
            
// draw red rectangle with anti aliasing turned off  
            
paint.setAntiAlias(false);  
            
paint.setColor(Color.RED);  
            
canvas.drawRect(100520030paint);  
                           
            
// draw the rotated text  
            
canvas.rotate(-45);  
                      
            
paint.setStyle(Paint.Style.FILL);  
            
canvas.drawText("Graphics Rotation"40180paint);  
              
            
//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.mainmenu);  
        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(202015paint);  

        
// draw green circle with anti aliasing turned on  
        
paint.setAntiAlias(true);  
        
paint.setColor(Color.GREEN);  
        
canvas.drawCircle(602015paint);  

        
// draw red rectangle with anti aliasing turned off  
        
paint.setAntiAlias(false);  
        
paint.setColor(Color.RED);  
        
canvas.drawRect(100520030paint);  
                       
        
// draw the rotated text  
        
canvas.rotate(-45);  
                  
        
paint.setStyle(Paint.Style.FILL);  
        
canvas.drawText("Graphics Rotation"40180paint);  
          
        
//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(202015paint);  

    
// draw green circle with anti aliasing turned on  
    
paint.setAntiAlias(true);  
    
paint.setColor(Color.GREEN);  
    
canvas.drawCircle(602015paint);  

    
// draw red rectangle with anti aliasing turned off  
    
paint.setAntiAlias(false);  
    
paint.setColor(Color.RED);  
    
canvas.drawRect(100520030paint);  
                   
    
// draw the rotated text  
    
canvas.rotate(-45);  
              
    
paint.setStyle(Paint.Style.FILL);  
    
canvas.drawText("Graphics Rotation"40180paint);  
      
    
//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 است :

کد پی‌اچ‌پی:
@Override 

یعنی به compiler می گوید که دارم یک روش (method) را Override می کنم، بنابراین اگر compiler روشی با آن نام را نیابد، به ما یک اخطار می دهد (زیرا باید در کلاس پایه، یک روش با آن نام وجود داشته باشد تا آن را Override کنیم).
اما حالا شرح بدهیم که اصلا خود Override کردن چیست. 
Override کردن method ، یعنی اینکه ما می خواهیم یک روش (method) موجود در کلاس پایه (کلاسی که از آن، روش ها را به ارث برده ایم) را با کدهای متفاوتی اجرا کنیم، یعنی کدهای اجرایی آن، مثل روش موجود در کلاس پایه نباشد، بلکه یک سری کد دیگر اجرا شود. برای این منظور، روش مورد نظر را دوباره کدنویسی می کنیم، یا در اصطلاح، Override می کنیم (مطابق روندی که در مثال های قبلی بود).