2015-08-16 3 views
8

Ich versuche, einige rote Rechtecke innerhalb meiner vorhandenen Leinwand über bestimmte Felder genau wie das erwartete Ergebnis Bild, aber sie erscheinen überhaupt nicht als meine Code zeigt die aktuellen unerwünschten Ergebnis, wenn ich meine App bereitstellen. Mein Code besteht darin, 4 Rechtecke in der oberen Reihe und 4 Rechtecke in der unteren Reihe zu erzeugen, aber ich möchte nur, dass dies oben auf den Kästchen 2-6 hinzugefügt wird, aber ich weiß, dass zusätzlicher Code für die roten Rechtecke über Kästchen hinzugefügt werden muss 1 & 7. Weiß jemand, was ich falsch mache und wie ich das beheben kann? Alle Hilfe wäre willkommen.Hinzufügen von Rechtecken über vorhandenen Rechteck in Leinwand

public class RectangleTextView extends View { 
    private final Paint mBlackPaint = new Paint(); 
    private final Paint mRedPaint = new Paint(); 
    private final TextPaint mTextPaint; 

    public RectangleTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     int valueInDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics()); 
     int valueInSp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); 

     mRedPaint.setColor(Color.parseColor("#CC3333")); 

     mBlackPaint.setAntiAlias(false); 
     mBlackPaint.setColor(Color.BLACK); 
     mBlackPaint.setStrokeWidth(valueInDp); 
     mBlackPaint.setStyle(Paint.Style.STROKE); 

     mTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); 
     mTextPaint.setColor(Color.BLACK); 
     mTextPaint.setTextAlign(Paint.Align.CENTER); 
     mTextPaint.setTextSize(valueInSp); 

     mWindowPaint = new Paint(); 
     mWindowPaint.setColor(Color.parseColor("#CC3333")); 
     mWindowPaint.setStrokeWidth(valueInDp); 
    } 

    private Paint mWindowPaint; 

    @Override protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if (getWidth() == 0) 
      return; 

     //initialise red rectangles 
     int w = canvas.getWidth(); 
     int h = canvas.getHeight(); 

     int rectWidth = w/5; 
     int space = w/15; 
     int topRectHeight = getPaddingTop(); 
     int bottomRectHeight = getPaddingBottom(); 


     //draw end rectangles 
     int mSideRectWidth = 10; 
     canvas.drawRect(0, 0, mSideRectWidth, getHeight(), mRedPaint); //draw left end rectangle 
     canvas.drawRect(getWidth() - mSideRectWidth, 0, getWidth(), getHeight(), mRedPaint); //draw right end rectangle 

     //draw grey boxes 
     setBackgroundColor(Color.parseColor("#808080")); 
     int boxWidth = (getWidth() - mSideRectWidth)/7; 

     //draw text views 
     for (int i = 0; i < 7; i++) { 
      canvas.drawText(Integer.toString(i + 1), (i * boxWidth + 10) + (boxWidth/2), ((canvas.getHeight()/2) - ((mTextPaint.descent() + mTextPaint.ascent())/2)), mTextPaint); 
     } 

     //draw black lines 
     for (int i = 1; i < 7; i++) { 
      canvas.drawLine(mSideRectWidth + boxWidth * i, 0, mSideRectWidth + boxWidth * i, getHeight(), mBlackPaint); 
     } 

     //draw red windows 
     for (int i = 0; i < 4; i++) { 
      mWindowPaint.setStyle(Paint.Style.STROKE);//add this 
      int left = i * (rectWidth + space); 
      int right = left + rectWidth; 
      if (i == 1){ 
       mWindowPaint.setStyle(Paint.Style.FILL); // change to this 
      } 

      Rect rect = new Rect(left, 0, right, topRectHeight); 
      canvas.drawRect(rect, mWindowPaint); 
      Rect rect2 = new Rect(left, h - bottomRectHeight, right, h); 
      canvas.drawRect(rect2, mWindowPaint); 
     } 
    } 
} 

erwartetes Ergebnis enter image description here

Strom unerwünschtes Ergebnis enter image description here

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <com.apptacularapps.car.RectangleTextView 
     android:layout_width="100dp" 
     android:layout_height="45dp" 
     android:paddingTop="10dp" 
     android:paddingBottom="10dp" 
     android:background="#808080" 
     android:gravity="center"/> 

</RelativeLayout> 

MainActivity.java

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 
+0

Sie wollen 3x2 kleine Rechtecke i erste nDie und letzten wihle 4x2 in den 5-Center diejenigen? Funktionieren die Rechtecke als Schaltflächen oder nur als Sprites? Werden sie sich aufgrund von Eingaben irgendwie verändern? – Emz

+0

kannst du deine Aktivität auch posten? Ich gebe es einen Lauf ... – Theo

+0

Auch die Hauptaktivität? So dass ich es ausführen und lösen kann. – Theo

Antwort

1

das Problem war, dass man nur vier Rechtecke auf dem Bildschirm witdh Größe erstellt, nicht in der Anzahl der Zellgröße. hier ist der Code:

public class RectangleTextView extends View { 
    private final Paint mBlackPaint = new Paint(); 
    private final Paint mRedPaint = new Paint(); 
    private final TextPaint mTextPaint; 

    public RectangleTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     int valueInDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics()); 
     int valueInSp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); 

     mRedPaint.setColor(Color.parseColor("#CC3333")); 

     mBlackPaint.setAntiAlias(false); 
     mBlackPaint.setColor(Color.BLACK); 
     mBlackPaint.setStrokeWidth(valueInDp); 
     mBlackPaint.setStyle(Paint.Style.STROKE); 

     mTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); 
     mTextPaint.setColor(Color.BLACK); 
     mTextPaint.setTextAlign(Paint.Align.CENTER); 
     mTextPaint.setTextSize(valueInSp); 

     mWindowPaint = new Paint(); 
     mWindowPaint.setColor(Color.parseColor("#CC3333")); 
     mWindowPaint.setStrokeWidth(valueInDp); 
    } 

    private Paint mWindowPaint; 
    Rect rect = new Rect(); 
    Rect rect2 = new Rect(); 

    @Override protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if (getWidth() == 0) 
      return; 

     //initialise red rectangles 
     int w = canvas.getWidth(); 
     int h = canvas.getHeight(); 

     int rectWidth = ((w - 20)/7)/5; 
     int space = ((w - 20)/7)/15; 
     int topRectHeight = getPaddingTop(); 
     int bottomRectHeight = getPaddingBottom(); 


     //draw end rectangles 
     int mSideRectWidth = 10; 
     canvas.drawRect(0, 0, mSideRectWidth, getHeight(), mRedPaint); //draw left end rectangle 
     canvas.drawRect(getWidth() - mSideRectWidth, 0, getWidth(), getHeight(), mRedPaint); //draw right end rectangle 

     //draw grey boxes 
     setBackgroundColor(Color.parseColor("#808080")); 
     int boxWidth = (getWidth() - mSideRectWidth)/7; 

     //draw text views 
     for (int i = 0; i < 7; i++) { 
      canvas.drawText(Integer.toString(i + 1), (i * boxWidth + 10) + (boxWidth/2), ((canvas.getHeight()/2) - ((mTextPaint.descent() + mTextPaint.ascent())/2)), mTextPaint); 
     } 

     //draw black lines 
     for (int i = 1; i < 7; i++) { 
      canvas.drawLine(mSideRectWidth + boxWidth * i, 0, mSideRectWidth + boxWidth * i, getHeight(), mBlackPaint); 
     } 

     //draw red windows 
     for (int index = 0; index < 7; index++) { 

      if (index == 0 || index == 6) { 
       for (int i = 0; i < 3; i++) { 
        mWindowPaint.setStyle(Paint.Style.STROKE);//add this 

        int left = (i * (rectWidth + space)) + (index * boxWidth) + 13 + rectWidth/2 + space/2; 
        int right = left + rectWidth; 

        rect.set(left, 0, right, topRectHeight); 
        canvas.drawRect(rect, mWindowPaint); 

        if (index == 0 && i == 1) { 
         mWindowPaint.setStyle(Paint.Style.FILL); // change to this 
        } 
        rect2.set(left, h - bottomRectHeight, right, h); 
        canvas.drawRect(rect2, mWindowPaint); 

       } 

      } else { 
       for (int i = 0; i < 4; i++) { 
        mWindowPaint.setStyle(Paint.Style.STROKE);//add this 
        int left = (i * (rectWidth + space)) + (index * boxWidth) + 13; 
        int right = left + rectWidth; 

        rect.set(left, 0, right, topRectHeight); 

        canvas.drawRect(rect, mWindowPaint); 

        rect2.set(left, h - bottomRectHeight, right, h); 
        canvas.drawRect(rect2, mWindowPaint); 
       } 
      } 
     } 
    } 
} 

dies ist der vollständige Code perfekt für mich arbeiten. wenn Sie irgendwelche Fragen haben oder Zweifel fühlen sich frei, es zu schreiben :)

das ist, wie ich sie sehe: enter image description here

+0

Ok, aber aus irgendeinem Grund erscheinen sie immer noch nicht & ich erhalte auch eine Warnung 'Vermeiden Sie Objektzuweisungen während des Zeichnens/Layouts (Vorabzuweisen und wiederzuverwenden)'. Bitte sehen Sie diesen Link zum Screenshot meiner Beweise: http://picpaste.com/Screen_Shot_2015-08-27_at_14.41.13-WKbVDEPA.png – MacaronLover

+0

@MacaronLover Ich habe einen Bildschirm auf, wie ich sie sehe, die Warnung war da, auch wenn ich kopierte Ihr Code zu meinem Editor, nicht neu nach meinen Änderungen: S –

+0

Boxen 1, 2, 6 & 7 sind falsch. Bitte sehen Sie sich das Bild unter ** erwartetes Ergebnis ** an. Ich möchte, dass die Zeichnung genau so aussieht. – MacaronLover

1

Sie sind alle der Rechtecke zeichnen, aber es sieht aus wie Sie alle „odd“ Rechtecke überspringen wollen - oder jedes zweite Rechteck ... und sicher sein, zu ändern die Farbe „rot“ - so etwas wie folgt aus:

//draw red windows 
    for (int i = 0; i < 4; i++) { 
     mWindowPaint.setStyle(Paint.Style.STROKE);//add this 
     int left = i * rectWidth; 
     int right = left + rectWidth; 
     if (i == 1){ 
      mWindowPaint.setStyle(Paint.Style.FILL); // change to this 
     } 

     if (i % 2 == 0) { 
      Rect rect = new Rect(left, 0, right, topRectHeight); 
      canvas.drawRect(rect, mRedPaint); 
      Rect rect2 = new Rect(left, h - bottomRectHeight, right, h); 
      canvas.drawRect(rect2, mRedPaint); 
     } 
    } 
} 

EDIT:

ich denke, die „gefüllt“ Rechteck auf dem Boden sein soll eher wie:

//draw red windows 
    for (int i = 0; i < 4; i++) { 
     int left = i * rectWidth; 
     int right = left + rectWidth; 

     mWindowPaint.setStyle(Paint.Style.STROKE);//add this 
     if (i % 2 == 0) { 
      Rect rect = new Rect(left, 0, right, topRectHeight); 
      canvas.drawRect(rect, mRedPaint); 
      if (i == 1){ 
       mWindowPaint.setStyle(Paint.Style.FILL); // change to this 
      } 
      Rect rect2 = new Rect(left, h - bottomRectHeight, right, h); 
      canvas.drawRect(rect2, mRedPaint); 
     } 
    } 
} 
+0

Das eigentliche Problem sind die roten Rechtecke selbst, da sie gar nicht wie im ** erwarteten Ergebnis ** oben erscheinen. – MacaronLover

+0

Ich habe einen Schnitt gemacht ... erzeugt irgendein Code, den Sie haben, ein rotes Rechteck? Ursprünglich dachte ich, dass das Weglassen dieses "neuen" Codes zu einem abgeschnittenen Anfang/Ende führte. – Jim

+0

Der Code, den ich habe, erzeugt keinerlei rote Rechtecke. Genau das Gleiche wie im Screenshot. – MacaronLover

3

Versuchen Sie folgendes:

enter image description here

public class RectangleTextView extends View { 
    private final Paint mBlackPaint = new Paint(); 
    private final Paint mRedPaint = new Paint(); 
    private final TextPaint mTextPaint; 

    public RectangleTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     int valueInDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics()); 
     int valueInSp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); 

     mRedPaint.setColor(Color.parseColor("#CC3333")); 

     mBlackPaint.setAntiAlias(false); 
     mBlackPaint.setColor(Color.BLACK); 
     mBlackPaint.setStrokeWidth(valueInDp); 
     mBlackPaint.setStyle(Paint.Style.STROKE); 

     mTextPaint = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); 
     mTextPaint.setColor(Color.BLACK); 
     mTextPaint.setTextAlign(Paint.Align.CENTER); 
     mTextPaint.setTextSize(valueInSp); 

     mWindowPaint = new Paint(); 
     mWindowPaint.setColor(Color.parseColor("#CC3333")); 
     mWindowPaint.setStrokeWidth(valueInDp); 
    } 

    private Paint mWindowPaint; 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if (getWidth() == 0) 
      return; 

     //initialise red rectangles 
     int h = canvas.getHeight(); 


     int topRectHeight = getPaddingTop(); 
     int bottomRectHeight = getPaddingBottom(); 


     //draw end rectangles 
     int mSideRectWidth = 10; 
     canvas.drawRect(0, 0, mSideRectWidth, getHeight(), mRedPaint); //draw left end rectangle 
     canvas.drawRect(getWidth() - mSideRectWidth, 0, getWidth(), getHeight(), mRedPaint); //draw right end rectangle 

     //draw grey boxes 
     setBackgroundColor(Color.parseColor("#808080")); 
     int boxWidth = (getWidth() - mSideRectWidth)/7; 


     int redRectWidth = boxWidth/5; 
     int redRectSpace = redRectWidth/3; 

     //draw text views 
     for (int i = 0; i < 7; i++) { 
      canvas.drawText(Integer.toString(i + 1), (i * boxWidth + 10) + (boxWidth/2), ((canvas.getHeight()/2) - ((mTextPaint.descent() + mTextPaint.ascent())/2)), mTextPaint); 

      int baseStartX = i * boxWidth; 

      //draw red windows 
      for (int j = 0; j < 4; j++) { 
       mWindowPaint.setStyle(Paint.Style.STROKE);//add this 
       int left = mSideRectWidth + baseStartX + (j * (redRectWidth + redRectSpace)); 
       int right = left + redRectWidth; 
       if (j == 1) { 
        mWindowPaint.setStyle(Paint.Style.FILL); // change to this 
       } 

       Rect rect = new Rect(left, 0, right, topRectHeight); 
       canvas.drawRect(rect, mWindowPaint); 
       Rect rect2 = new Rect(left, h - bottomRectHeight, right, h); 
       canvas.drawRect(rect2, mWindowPaint); 
      } 
     } 

     //draw black lines 
     for (int i = 1; i < 7; i++) { 

      int startX = mSideRectWidth + boxWidth * i; 
      int startY = 0; 
      int stopX = mSideRectWidth + boxWidth * i; 
      int stopY = getHeight(); 
      canvas.drawLine(startX, startY, stopX, stopY, mBlackPaint); 

     } 
    } 
} 
+0

Aus irgendeinem Grund erscheinen die Rechtecke nicht auf meinem Emulator noch Gerät überhaupt. Auch basierend auf deinem Screenshot suche ich nicht danach. Ich möchte nur, dass die Boxen 2-6 vier Rechtecke in den oberen und unteren Reihen haben und die Boxen 1 und 7 drei Rechtecke in der oberen und unteren Reihe haben. Ein spezifisches Rechteck muss ebenfalls ausgefüllt werden, aber ich habe bereits den Code dafür. – MacaronLover

Verwandte Themen