ورود

View Full Version : مشکل در درک یک کد و شناخت وظیفه handler.



fshb_ 1370
شنبه 12 مرداد 1392, 08:53 صبح
سلام
تصمیم گرفتم برای تمرین بیشتر، برنامه TicTacToe رو بنویسم با استفاده از این tutorial: http://www.edumobile.org/android/android-development/tictactoe-game-implementation/

وقتی user نقطه ای از گوشی رو لمس میکنه، من مختصات اون مکان رو برداشته و باید X یا O رو رسم کنم و این رسم در کلاس های مربوط به XSymbol و OSymbol در متد draw وجود داره، امااا وقتی این tutorial رو مینویسم ، این رسم با استفاده از handler انجام میده و نه با صدا زدن draw(). چرا؟؟!!!! یعنی وقتی handler.sendMessage()را در drawImage() صدا نزنم ،با touch من X یا O رسم نمیشه!!
مگه Handler ، وظیفه handle کردن و اجرای message ها رو در یک thread جداگانه از Main thread نداره؟؟

اینم کد:

public class Game extends View {

private Cell [][] coordinate=null;
int x=3;
int y=3;
private boolean whatDrawn=false;
private Paint caneta;
private int l;
private int h;

int xCell;
int yCell;

Handler handler = new Handler() {
// @Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
invalidate();
break;
case 1:
Toast.makeText(getContext(), "You Win!", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(getContext(), "Computer Win!", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(getContext(), "Loose!", Toast.LENGTH_SHORT).show();
break;
default:
break;
}

super.handleMessage(msg);
}
};
...
@Override
public void onDraw(Canvas canvas){
for(int i=0;i<coordinate.length;i++){
for(int j=0;j<coordinate.length;j++){
//
coordinate[i][j].draw(canvas, getResources(), j, i, (this.getWidth()+3)/coordinate.length, (this.getHeight()+3)/coordinate.length);

}
}

xCell=this.getWidth()/x;
yCell=this.getHeight()/y;

for(int i=0;i<=x;i++)
canvas.drawLine(xCell*i,0,xCell*i,this.getHeight() ,caneta);
for(int i=0;i<=y;i++)
canvas.drawLine(0, yCell*i, this.getWidth() ,yCell*i, caneta);

super.onDraw(canvas);
}

@Override
public boolean onTouchEvent(MotionEvent event){
xCell=this.getWidth()/x;
yCell=this.getHeight()/y;

int x_touch=(int)(event.getX()/xCell);
int y_touch=(int)(event.getY()/yCell);

drawImage(x_touch,y_touch);

return super.onTouchEvent(event);
}

public void drawImage(int x_touch,int y_touch){
Cell cell=null;
if(whatDrawn){
cell=new XSymbol(coordinate[x_touch][y_touch].x,coordinate[x_touch][y_touch].y);
whatDrawn=true;
}else{
cell=new OSymbol(coordinate[x_touch][y_touch].x,coordinate[x_touch][y_touch].y);
whatDrawn=false;
}
coordinate[x_touch][y_touch]=cell;

handler.sendMessage(Message.obtain(handler, 0));

}

}

fshb_ 1370
دوشنبه 14 مرداد 1392, 22:07 عصر
up .
اگه کسی بلده، لطفش دریغ نکنه ;)