PDA

View Full Version : تغییر background برنامه در حال اجرا



s a h a r70
دوشنبه 04 خرداد 1394, 08:41 صبح
سلام .این متد ondrow:
@Override
protected void onDraw(Canvas canvas) {

if(back==0){
canvas.drawBitmap(backgrand,0,0, null);
}
if(back==1){
canvas.drawBitmap(backgrandd,0,0, null);
}
if(back==2){
canvas.drawBitmap(backgranddd,0,0, null);
}
}


یک دیالوگ باکس هم تعریف کردم که یکی از background ها انتخاب بشه و متغیر back رو تغیر بده. ولی وقتی متغیر تغییر میکنه background جدید ایجاد نمیشه..

public void showChoosebackDialog() {
final Dialog choosebackDialog =
new Dialog(myContext);
choosebackDialog.requestWindowFeature
(Window.FEATURE_NO_TITLE);
choosebackDialog.setContentView
(R.layout.choose_suit_dialog);
final Spinner backSpinner = (Spinner)
choosebackDialog.findViewById(R.id.backSpinner);
ArrayAdapter<CharSequence> adapter =
ArrayAdapter.createFromResource(
myContext, R.array.background,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource
(android.R.layout.simple_spinner_dropdown_item);
backSpinner.setAdapter(adapter);
Button okButton =
(Button) choosebackDialog.findViewById
(R.id.okButton);
okButton.setOnClickListener
(new View.OnClickListener(){
public void onClick(View view){
back = backSpinner.getSelectedItemPosition();
invalidate();

choosebackDialog.dismiss();
}

});
choosebackDialog.show();

}

به نظر شما مشکل کجاست...راهنمایی کنید لطفا...ممنون

JYasProgramer
دوشنبه 04 خرداد 1394, 09:01 صبح
سلام
داخل متد onDraw رو ببر داخل onCreate و داخل یه تایمر ست کن و هر ثانیه یک بار متد رو اجرا کن
این یه راهشه
و یا به حای canvas اون ویوویی رو بزار که می خوایی background ش تغییر کنه

s a h a r70
دوشنبه 04 خرداد 1394, 10:31 صبح
متد oncreate ندارم چون یه custom view هست......و راه حل دوم هم متوجه نشدم:افسرده:

JYasProgramer
دوشنبه 04 خرداد 1394, 10:39 صبح
کدت رو میشه ببینم

s a h a r70
دوشنبه 04 خرداد 1394, 11:58 صبح
public class OneGame extends View {

private Context myContext;
private Bitmap backgrand;
private Bitmap backgrandd;
private Bitmap backgranddd;
private Paint paint;
private Rect rect;

private float scale;
private int screenW;
private int screenH;
private int scaledCardW;
private int scaledCardH;
private float x;
private float y;
private int b;
private int back=1;

private List<Card> deck = new ArrayList<Card>();
private List<Card> myHand = new ArrayList<Card>();
private List<Card> com1 = new ArrayList<Card>();
private List<Card> com2 = new ArrayList<Card>();
private List<Card> friend = new ArrayList<Card>();

public OneGame (Context context) {
super(context);

myContext = context;
backgranddd = BitmapFactory.decodeResource(getResources(),R.draw able.backoneee);
backgrandd = BitmapFactory.decodeResource(getResources(),R.draw able.backonee);
backgrand = BitmapFactory.decodeResource(getResources(),R.draw able.backone);
paint = new Paint();
rect = new Rect();

scale =myContext.getResources().getDisplayMetrics().dens ity;

initCards();

}

@Override
public void onSizeChanged (int w, int h, int oldw,
int oldh){
super.onSizeChanged(w, h, oldw, oldh);
screenW = w;
screenH = h;

}

private void initCards() {
for (int i = 0; i < 4; i++) {
for (int j = 102; j < 115; j++) {
int tempId = j + (i*100);
Card tempCard = new Card(tempId);
int resourceId = getResources().getIdentifier("card"+ tempId, "drawable",
myContext.getPackageName());
Bitmap tempBitmap = BitmapFactory.decodeResource(myContext.getResource s(),resourceId);
scaledCardW = (int) (screenW/4);
scaledCardH = (int) (scaledCardW*1.28);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(tempBitmap,scaledCardW, scaledCardH, false);
tempCard.setBitmap(scaledBitmap);
deck.add(tempCard);
}
}
}

public boolean onTouchEvent(MotionEvent event) {
int eventaction = event.getAction();
int X = (int)event.getX();
int Y = (int)event.getY();
switch (eventaction ) {
case MotionEvent.ACTION_DOWN:


break;
case MotionEvent.ACTION_MOVE:

break;
case MotionEvent.ACTION_UP:

break;

}
invalidate();
return true;
}



@Override
protected void onDraw(Canvas canvas) {

if(back==0){
canvas.drawBitmap(backgrand,0,0, null);
}
if(back==1){
canvas.drawBitmap(backgrandd,0,0, null);
}
if(back==2){
canvas.drawBitmap(backgranddd,0,0, null);
}
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.FILL);
paint.setTextSize(scale*30);
canvas.drawText("Me",(float)(screenW*(0.45)),(float)(screenH*(0.9)), paint);

canvas.drawText("Friend",(float)(screenW*(0.40)),(float)(screenH*(0.1)), paint);

paint.setColor(Color.WHITE);
paint.setTextSize(scale*30);
String str2rotate = "Com";
x = (float)(screenW*(0.8));
y = (float)(screenH*(0.5));
paint.getTextBounds(str2rotate, 0, str2rotate.length(), rect);
canvas.translate(x, y);
canvas.translate(-x, -y);
canvas.rotate(-90, x + rect.exactCenterX(), y + rect.exactCenterY());
paint.setStyle(Paint.Style.FILL);
canvas.drawText(str2rotate, x, y, paint);

canvas.restore();

paint.setColor(Color.WHITE);
paint.setTextSize(scale*30);
x = (float)(screenW*(0.1));
y = (float)(screenH*(0.5));
paint.getTextBounds(str2rotate, 0, str2rotate.length(), rect);
canvas.translate(x, y);
canvas.translate(-x, -y);
canvas.rotate(90, x + rect.exactCenterX(), y + rect.exactCenterY());
paint.setStyle(Paint.Style.FILL);
canvas.drawText(str2rotate, x, y, paint);


}

public void showChoosebackDialog() {
final Dialog choosebackDialog =
new Dialog(myContext);
choosebackDialog.requestWindowFeature
(Window.FEATURE_NO_TITLE);
choosebackDialog.setContentView
(R.layout.choose_suit_dialog);
final Spinner backSpinner = (Spinner)
choosebackDialog.findViewById(R.id.backSpinner);
ArrayAdapter<CharSequence> adapter =
ArrayAdapter.createFromResource(
myContext, R.array.background,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource
(android.R.layout.simple_spinner_dropdown_item);
backSpinner.setAdapter(adapter);
Button okButton =
(Button) choosebackDialog.findViewById
(R.id.okButton);
okButton.setOnClickListener
(new View.OnClickListener(){
public void onClick(View view){
b = backSpinner.getSelectedItemPosition();
background(b);

choosebackDialog.dismiss();
}

});
choosebackDialog.show();

}

public void background(int b){
back=b;
String a="";
a=toString().valueOf(back);
Toast.makeText(myContext, a,
Toast.LENGTH_SHORT).show();

}
}

JYasProgramer
دوشنبه 04 خرداد 1394, 12:17 عصر
public void showChoosebackDialog() { final Dialog choosebackDialog =
new Dialog(myContext);
choosebackDialog.requestWindowFeature
(Window.FEATURE_NO_TITLE);
choosebackDialog.setContentView
(R.layout.choose_suit_dialog);
final Spinner backSpinner = (Spinner)
choosebackDialog.findViewById(R.id.backSpinner);
ArrayAdapter<CharSequence> adapter =
ArrayAdapter.createFromResource(
myContext, R.array.background,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource
(android.R.layout.simple_spinner_dropdown_item);
backSpinner.setAdapter(adapter);
Button okButton =
(Button) choosebackDialog.findViewById
(R.id.okButton);
okButton.setOnClickListener
(new View.OnClickListener(){
public void onClick(View view){
b = backSpinner.getSelectedItemPosition();
background(b);
view.invalidate();

choosebackDialog.dismiss();
}


});
choosebackDialog.show();

}



خط24 رو دقت کن

s a h a r70
دوشنبه 04 خرداد 1394, 13:38 عصر
بازم متغیر back تغییر میکنه ولی background عوض نمیشه:متفکر:

JYasProgramer
دوشنبه 04 خرداد 1394, 14:12 عصر
ببین باید متد onDraw رو فراخونی کنی
این فراخونی از طریق متد view.invalidate(); انجام میشه
داخل onDraw یه Log بنویس ببین که تووی لاگ کت نمایش داده میشه؟

s a h a r70
دوشنبه 04 خرداد 1394, 16:41 عصر
اوکی.....با این متد فراخوانی نشد Ondrow()

JYasProgramer
دوشنبه 04 خرداد 1394, 17:41 عصر
در کلاسی خارج از OneGame می بایست یک شی از همین کلاس بسازی و اونو به این صورت فراخوانی کنی مثلا

OneGame o = new OneGame();
o.invalidate()

اون وقت میشه متد onDraw رو اجرا کرد
لذا در کد نویسی دقت کن که دراپ داون لیستو رو در کلاسی دیگر اجرا کنی و پارامتر back رو به کلاس OneGame بفرستی تا در نیجه بک گراند صفحه مورد نظر یافت بشه
امید وارم کمکت کنه

s a h a r70
دوشنبه 04 خرداد 1394, 18:44 عصر
توی کلاسی که این custom view بهش بسط داده شده توی دکمه setting اول dialogbox و بعد ondrow رو فراخوانی کردم...ولی بازم دیالوگ باکس اجرا میشه ولی ondrow نه

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true;
}

if (keyCode == KeyEvent.KEYCODE_MENU) {
onegame = new OneGame(this);
onegame.showChoosebackDialog();

onegame.invalidate();


return true;
}
return super.onKeyDown(keyCode, event);
}