2016-07-14 13 views
2

aufgerufen wird Dies ist mein Code für die Java-Klasse, in der ich drei Türme zeichne, auf die ich eine bestimmte Anzahl von Ringen platziere. In der onTouchEvent-Funktion merke ich Aktivität und vergrößere die Anzahl der Züge entsprechend, was wiederum auf dem Bildschirm angezeigt wird. Aber es wird nicht aktualisiert, bis ich zur vorherigen Aktivität gehe und zurückkomme.Canvas wird nicht mit den Änderungen aktualisiert, auch wenn es wiederholt

Number.java

package com.syncnlink.myapplication; 

public class Number { 
public static int tower1[] = new int[10]; 
public static int tower2[] = new int[10]; 
public static int tower3[] = new int[10]; 


public static void initialize() { 
    for (int i = 0; i < 10; i++) 
    { 
     tower1[i] = i+1; 
     tower2[i] = -1; 
     tower3[i] = -1; 
    } 
} 
public static int numelements(int arr[]) { 
    int count = 0; 
    for (int i = 0; i < 10; i++) 
    { 
     if (arr[i] > 0) 
      count++; 
     else 
      continue; 
    } 
    return count; 
} 

public static void setit(int arr[], int a) 
{ 
    arr[a]=-1; 
} 

public static void setit1(int a) 
{ 
    tower1[a]=-1; 
} 

public static boolean isEmpty(int arr[]) 
{ 
    for(int i=0;i<5;i++) 
     if(arr[i]>-1) 
     { 
      return false; 
     } 
    return true; 
} 

} 

newgame Aktivität

package com.syncnlink.myapplication; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

public class NewGame extends Activity { 

public CustomRectangle cr; 
static float x,y,width, height; 
public static int moves =0; 
private static Bitmap background; 
static Canvas canvas; 
public int ff=0,initialized=0; 
public static int t1,t2,t3; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    background = BitmapFactory.decodeResource(getResources(),R.drawable.background); 
    super.onCreate(savedInstanceState); 
    CustomRectangle cr = new CustomRectangle(this); 
    setContentView(cr); 
    Number.initialize(); 


    t1 = Number.numelements(Number.tower1); 
    t2 = Number.numelements(Number.tower2); 
    t3 = Number.numelements(Number.tower3); 
} 

public static class CustomRectangle extends View { 

    CustomRectangle(Context c) { 
     super(c); 
     invalidate(); 
    } 

    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     NewGame n = new NewGame(); 
     if(n.initialized == 0) 
     { 
      Number.initialize(); 
     } 
     Paint p[]= new Paint[11]; 
     for(int i=0;i<11;i++) 
      p[i] = new Paint(); 
     p[0].setColor(Color.YELLOW); 
     p[1].setColor(Color.BLUE); 
     p[2].setColor(Color.CYAN); 
     p[3].setColor(Color.RED); 
     p[4].setColor(Color.GRAY); 
     p[5].setColor(Color.MAGENTA); 
     p[6].setColor(Color.BLUE); 
     p[7].setColor(Color.CYAN); 
     p[8].setColor(Color.RED); 
     p[9].setColor(Color.GRAY); 
     p[10].setColor(Color.MAGENTA); 
     canvas.drawBitmap(background,0,0,null); 

     p[0].setStrokeWidth(24); 

     height = getHeight(); 
     width = getWidth(); 
     float w = width/1794; 
     float h = height/1008; 

     canvas.drawLine(100*(width/1794),1000*(height/1008),500*(width/1794),1000*(height/1008),p[0]); 
     canvas.drawLine(300*(width/1794),1000*(height/1008),300*(width/1794),400,p[0]); 
     canvas.drawLine((100+600)*(width/1794),1000*(height/1008),(500+600)*(width/1794),1000*(height/1008),p[0]); 
     canvas.drawLine((300+600)*(width/1794),1000*(height/1008),(300+600)*(width/1794),400*(height/1008),p[0]); 
     canvas.drawLine((100+1200)*(width/1794),1000*(height/1008),(500+1200)*(width/1794),1000*(height/1008),p[0]); 
     canvas.drawLine((300+1200)*(width/1794),1000*(height/1008),(300+1200)*(width/1794),400*(height/1008),p[0]); 

     int j=0; 
     for (int i = 0; i < 10; i++) { 
      if(Number.tower1[i]<0) 
      continue; 
      else { 
       canvas.drawRect((150 + (i * 14))*w, (942 - (j * 44))*h, (450 - (i * 14))*w, (987 - (j * 44))*h, p[i + 1]); 
       j++; 
      } 
     } 

     j=0; 
     for (int i = 0; i < 10; i++) { 
      if(Number.tower2[i]<0) 
       continue; 
      else { 
       canvas.drawRect((150 + (i * 14) + 600)*w, (942 - (i * 44))*h, (450 + 600 - (i * 14))*w, (987 - (i * 44))*h, p[i + 1]); 
       j++; 
      } 
     } 

     j=0; 
     for (int i = 0; i < 10; i++) { 
      if(Number.tower3[i]<0) 
       continue; 
      else { 
       canvas.drawRect((150 + 1200 + (i * 14))*w, (942 - (i * 44))*h, (450 + 1200 - (i * 14))*w, (987 - (i * 44))*h, p[i + 1]); 
       j++; 
      } 
     } 

     p[0].setTextSize(48); 
     canvas.drawText(" No. of Moves " + moves ,100,40,p[0]); 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event1) { 
    try { 

     switch (event1.getAction()) { 
      case MotionEvent.ACTION_DOWN: { 
       x=event1.getX(); 
       y=event1.getY(); 

       if(x<width/3) 
       { 

        if(!Number.isEmpty(Number.tower1)) { 
         Toast.makeText(this, "Pop Tower1 " + t1--, Toast.LENGTH_SHORT).show(); 
         ff=0; 
         moves++; 
         Number.setit1(t1); 
         cr.invalidate(); 
        } 
        else { 
         Toast.makeText(this, "Empty! Nothing to Pop", Toast.LENGTH_SHORT).show(); 
         ff = 1; 
        } 
       } 
       else 
       if(x<width*2/3) { 
        if (!Number.isEmpty(Number.tower2)) { 
         Toast.makeText(this, "Pop Tower2 " + t2--, Toast.LENGTH_SHORT).show(); 
         Number.setit(Number.tower2, t2); 
         ff=0; 
         moves++; 
         cr.invalidate(); 

        } else { 
         ff = 1; 
         Toast.makeText(this, "Empty! Nothing to Pop", Toast.LENGTH_SHORT).show(); 
        } 
       } 
       else 
       { 
        if(!Number.isEmpty(Number.tower3)) { 
         Number.setit(Number.tower3, t3); 
         Toast.makeText(this, "Pop Tower3 " + t3--, Toast.LENGTH_SHORT).show(); 
         moves++; 
         cr.invalidate(); 
         ff=0; 
        } 
        else { 
         Toast.makeText(this, "Empty! Nothing to Pop", Toast.LENGTH_SHORT).show(); 
         ff = 1; 
        } 
       } 
       break; 
      } 
      case MotionEvent.ACTION_UP: { 
       x=event1.getX(); 
       y=event1.getY(); 
       if(x<width/3) 
       { 
        if(ff==0) 
        { 
        Number.setit2(Number.tower1,++t1); 
        Toast.makeText(this, "Push Tower1 " + t1, Toast.LENGTH_SHORT).show(); 
       } 
       } 
       else 
       if(x<width*2/3) 
       { 
        if(ff==0) 
        { 
        Number.setit2(Number.tower2,++t2); 
        Toast.makeText(this, "Push Tower2 " + t2, Toast.LENGTH_SHORT).show(); 
       } 
       } 

       else 
       { 
        if(ff==0) { 
         Number.setit2(Number.tower3, ++t3); 
         Toast.makeText(this, "Push Tower3 " + t3, Toast.LENGTH_SHORT).show(); 
        } 
       } 

       break; 
      } 

     } 
    } 
    catch(Exception e) 
    { 

    } 
    return true; 
} 
} 

Also, ich alle Toasts auf dem Bildschirm sehen kann, und auch wenn ich einen Toast in OnDraw Aufmachungen() Ich kann sehen, dass es mehrmals aufgerufen wird, aber es aktualisiert die Informationen nicht oder zeichnet die neue Leinwand nicht über die vorherige. Jede Hilfe ist willkommen. Wurde jetzt

+0

http://stackoverflow.com/q/2865315/5733853 – HPbyP

Antwort

0

Ich glaube, Sie brauchen zu schaffen einige Setter auf Ihrem CustomRectangle.class

public void setSomething(Arguments) 
{ 
    // do your changes here 
    invalidate(); 
} 

und rufen Sie die Setter ändern den Zustand Ihrer zieht innerhalb des onTounch es für ein paar Tage fest.

case:MotionEvent.ACTION_DOWN: 
    cr.setSomething(Arguments); 
.... 
.... 

Wenn Sie die Setter aufrufen, aktualisieren sie die Zustände Ihrer Canvas nach dem Aufruf invalidate.

ich hoffe das hilft dir!

+0

Ich habe bereits den Setter verwendet in der "onTouchEvent" -Funktion. Also ich denke, es sollte die Staaten aktualisiert haben, wenn meine Leinwand nach Ungültigkeitsanruf.? Ist es erforderlich, dies in der CustomRectangle-Klasse zu tun? @AdrianoAlves –

+0

Dis Sie Invalidate() innerhalb Ihrer Setter aufrufen? Es muss Fall sein, es wird die letzte Zeile Ihres Setter sein –

0

Sie können das Problem beheben, indem Sie Ihre Invalidier in Ihrem Konstruktor Threading, die durch eine Änderung sein beheben wird es zu:

CustomRectangle(Context c) { 
      super(c); 
      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        while(true) { 
         try { 
          Thread.sleep(1000); 
          postInvalidate(); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 

        } 
       } 
      }); 

     thread.start(); 
     } 
+0

Danke, funktioniert wie ein Charme! : D @HPbyP –

+1

Ihr willkommen, aber es ist besser, es mit Abstimmen zu tun, anstatt einen Kommentar abzugeben. – HPbyP

+1

http://stackoverflow.com/q/2865315/5733853 – HPbyP