2016-12-19 3 views
0

Ich habe zwei Klassen: CustomView erweitert View und MainActivity erweitert Activity. In CustomView zeichne ich eine Reihe von abgerundeten Quadraten (canvas.drawRoundRect) mit einer Schleife. Ich weiß, wie man Klicks auf einem beliebigen Quadrat erkennt, aber ich weiß nicht, wie man die Farbe eines Quadrats ändert. Wie rufe ich die onDraw-Methode von MainActivity auf? Oder wenn es eine Update-Methode gibt, die ich verwenden kann, um die MainActivity-Klasse ungültig zu machen(). Unter dem Strich möchte ich wissen, wie ich die Farbe meiner Form ändern kann, wenn ich darauf klicke. Vielen Dank. VerfahrenAndroid: Ich habe viele Formen gezeichnet. Ich muss die Farbe eines Shapes ändern, wenn ich darauf klicke.

"Name of the object" .setbackgroundColor ("Name of the object" .getContext().GetResources(). GetColor (R.color. "Desired color") 
+1

es für Ansichten ein invalidate() -Methode, die die OnDraw-Methode aufrufen, wird https://developer.android.com/reference/android/view/View.html#invalidate() –

Antwort

0

Gehen Sie folgendermaßen: Sobald Sie genannt haben, und erklärt ihre Formen in Java-Code, können Sie es ändern, wenn das Objekt durch seinen Namen folgt anrufen und legen Sie die folgenden ziehen Sie Ihre Rechtecken, indem die Lackfarbe in einem varible

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    firstPaint.setColor(firstRectColor); 
    canvas.drawRoundRect(//..,firstPaint); 
    //.. 
    setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      if(motionEvent.getAction()==MotionEvent.ACTION_DOWN){ 
       if(((motionEvent.getX()>=firstRectX) && (motionEvent.getX()<=firstRectX+firstRectWidth))&&((motionEvent.getY()>=firstRectY) && (motionEvent.getY()<=firstRectY+firstRectHeight))){ 
       //touch point is inside first rectangle 
       //assign the color to firstRectColor variable and call invalidate to redraw 
       firstRectColor=getColorToChange(); 
       invalidate(); 
       }//..else if(){} 
      } 
      return true; 
     } 
    }); 
} 
0

In Ihrer OnDraw():

+0

Danke es funktioniert perfekt! – Sandman

+0

bitte als richtige Antwort markieren, wenn es funktioniert –

0

Dazu müssen Sie Farbe geklickt Pixel zu erhalten und dann unter Flood-Fill-Algorithmus verwenden, und übergeben Sie Ihre Bitmap, Punkte, die Sie auf Bitmap, Target angeklickt und Ersatzfarbcode.

private void FloodFill(Bitmap bmp, Point pt, int targetColor, int replacementColor) 
    { 
     Queue<Point> q = new LinkedList<Point>(); 
     q.add(pt); 
     while (q.size() > 0) { 
      Point n = q.poll(); 
      if (bmp.getPixel(n.x, n.y) != targetColor) 
       continue; 

      Point w = n, e = new Point(n.x + 1, n.y); 
      while ((w.x > 0) && (bmp.getPixel(w.x, w.y) == targetColor)) { 
       bmp.setPixel(w.x, w.y, replacementColor); 
       if ((w.y > 0) && (bmp.getPixel(w.x, w.y - 1) == targetColor)) 
        q.add(new Point(w.x, w.y - 1)); 
       if ((w.y < bmp.getHeight() - 1) 
         && (bmp.getPixel(w.x, w.y + 1) == targetColor)) 
        q.add(new Point(w.x, w.y + 1)); 
       w.x--; 
      } 
      while ((e.x < bmp.getWidth() - 1) 
        && (bmp.getPixel(e.x, e.y) == targetColor)) { 
       bmp.setPixel(e.x, e.y, replacementColor); 

       if ((e.y > 0) && (bmp.getPixel(e.x, e.y - 1) == targetColor)) 
        q.add(new Point(e.x, e.y - 1)); 
       if ((e.y < bmp.getHeight() - 1) 
         && (bmp.getPixel(e.x, e.y + 1) == targetColor)) 
        q.add(new Point(e.x, e.y + 1)); 
       e.x++; 
      } 
     } 
    } 

Sie können mehr über Flood Fill-Algorithmus für Batter Verständnis suchen.

https://github.com/latemic/ColorBooth/blob/master/src/com/colorbooth/FloodFill.java

Verwandte Themen