2016-09-11 5 views
8

J'essaie de créer une structure de type arbre généalogique dans android. J'utilise la toile pour dessiner le rectangle et la ligne pour les noms des membres de la famille et la ligne de connexion.Plusieurs rectangles ne dessinent pas sur la toile

Je dessine un rectangle et ligne par la méthode suivante avec l'aide de link

DrawView.java

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.Log; 
import android.view.View; 

public class DrawView extends View { 
    Paint paint = new Paint(); 
    float mx, my, mdensity; 
    Paint mBGPaint, mTXTPaint,mLINEPaint,mBRDPaint; 
    String text; 
    public DrawView(Context context, float x, float y, float density, String text) { 
     super(context); 
     paint.setColor(Color.RED); 
     paint.setStrokeWidth(8); 
     paint.setStyle(Paint.Style.STROKE); 

     mx = x; 
     my = y; 
     mdensity = density; 
     this.text = text; 
    } 
    @Override 
    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     init(); 

     mLINEPaint.setStrokeWidth(8); 

     //draw rect border 
     canvas.drawRect(100, 100, 200, 200, mBRDPaint); 
//  //draw text 
     canvas.drawText(text, 150, 150, mTXTPaint); 
//  //draw line 

     float x = mx+150; 

     canvas.drawLine(x, 10, x, 100, mLINEPaint); 

    } 
    public void init() { 

     //rectangle background 
     mBGPaint = new Paint(); 
     mBGPaint.setColor(Color.parseColor("#8")); 

     //your text 
     mTXTPaint = new Paint(); 
     mTXTPaint.setColor(Color.parseColor("#123456")); 

     //your line 
     mLINEPaint = new Paint(); 
     mLINEPaint.setColor(0xFFFF00FF); 

     //rectangle border 
     mBRDPaint = new Paint(); 
     mBRDPaint.setStyle(Paint.Style.STROKE); 
     mBRDPaint.setStrokeWidth(10); 
     mBRDPaint.setColor(Color.parseColor("#8")); 
    } 
} 

Maintenant, je suis en train d'ajouter plusieurs vues LinearLayout à l'horizontale d'orientation comme ci-dessous:

Mais quand je fais cela, une seule vue est ajoutée au canevas et d'autres ne sont pas visibles.
float density = getApplicationContext().getResources().getDisplayMetrics().density; 
    DrawView drawView; 

    float x = 100, y = 200; 
    int count1 = 1; 
    int id; 
    LinearLayout layout2 = new LinearLayout(this); 

    layout2.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
    layout2.setOrientation(LinearLayout.HORIZONTAL); 

    main_layout.addView(layout2); 

    DrawView drawView1; 
    CircleView circleView; 
    for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) { 

     String key = entry.getKey(); 
     if (count1 < 2) { 
      x = dirButton.getX(); 
      y = dirButton.getY(); 
     } 
     drawView1 = new DrawView(this, x, y, density, key); 
     drawView1.setId(butId++); 
     drawView1.setLayoutParams(params); 
     layout2.addView(drawView1); 

     count1++; 
     x = x + 100; 
    } 

Je n'ai aucune expérience dans le travail avec la toile dans Android, je serais heureux si quelqu'un pouvait me guider avec ce problème.

+1

Votre toile doit être à l'intérieur de la vue et vous dessiner tout sur la toile via la méthode onDraw(). Vous ne devriez pas avoir besoin de plusieurs vues sur une toile. Chaque fois que vous devez mettre à jour le canevas, vous pouvez lancer l'appel invalidate() qui déclenchera onDraw(). –

+0

Je pense que les deux rectangles sont dessinés à la même xy. Pouvez-vous vérifier cela ou faire un rectangle plus grand que l'autre et avoir des couleurs différentes pour le rectangle juste pour vérifier si les deux rectangles sont dessinés – surya

+0

ne pas appeler votre init () 'dans' onDraw' – FunkTheMonk

Répondre

0
if (count1 < 2) { 
     x = dirButton.getX(); 
     y = dirButton.getY(); 
    } 

de la ligne de code ci-dessus, vous définissez condition lorsque la ligne est exécutée.

et d'utiliser l'instruction if.

 int count1 = 1; //Count was initialized to 1 

Cela rend le code pour entrer dans l'instruction if le premier appel

count1++; 

Cette ligne augmente la valeur de comptage à 2, d'où le bloc si ne pas exécuter à nouveau ...

Et la valeur y ne change jamais ce qui conduit à la superposition.

peut être ce que vous avez manqué est increament régulière de y

y+=something; 

Hope qui aide

-1

S'il vous plaît vérifier comment je l'ai fait, Vous pouvez vérifier à partir here forme myapp, comment il fonctionne

// Comment appeler pour dessiner un rectangle

Ceci est le SDV.classe

public static boolean isDrawing = false; 

public static float mStartX; 
public static float mStartY; 

public static float mx; 
public static float my; 

public static void Shape14(float x, float y, float radius) { 
    Path path = new Path(); 
    y -= 2 * radius; 
    radius *= 2; 
    path.moveTo(x + radius, y + radius); 
    path.lineTo(x - radius, y + radius); 
    path.lineTo(x, y); 
    path.lineTo(x + radius, y + radius); 
    float div = (2 * radius)/5; 
    float top = y + radius; 
    RectF rect1 = new RectF(x + radius/4, y, x + radius/1.9f, y 
      + radius); 
    RectF rect2 = new RectF(x + div/2, top, x + div/2 + div, top + div 
      * 2); 
    RectF rect3 = new RectF(x - div/2 - div, top, x - div/2, top + div 
      * 2); 
    RectF rect4 = new RectF(x - div/2, top, x + div/2, top + div); 

    HashMap<String, Object> hm = new HashMap<String, Object>(); 
    hm.put("type", shape14); 
    hm.put("paint", new Paint(DrawingView.mColorPaint)); 
    hm.put("path", path); 

    hm.put("rect1", rect1); 
    hm.put("rect2", rect2); 
    hm.put("rect3", rect3); 
    hm.put("rect4", rect4); 
    al.add(hm); 
    Gmap.mDrawingView.invalidate(); 
} 

Voici notre avis,

public class DrawingView extends View { 

public static Paint mPaint; 
public static int mCurrentShape; 
Point p1, p2, p3, p4; 

public static Paint mDotedPaint; 
public static Paint mColorPaint; 

GoogleMap googleMap; 
SeekBar sbWidth; 
public static float sx, sy; 

public DrawingView(Context context, GoogleMap googleMap, SeekBar sbWidth) { 
    super(context); 
    this.googleMap = googleMap; 
    this.sbWidth = sbWidth; 

    mPaint = new Paint(Paint.DITHER_FLAG); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    mPaint.setColor(SDV.colorChoosen); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(SDV.width); 

    mDotedPaint = new Paint(Paint.DITHER_FLAG); 
    mDotedPaint.setAntiAlias(true); 
    mDotedPaint.setDither(true); 
    mDotedPaint.setColor(SDV.colorChoosen); 

    mDotedPaint.setStyle(Paint.Style.STROKE); 
    mDotedPaint.setStrokeJoin(Paint.Join.ROUND); 
    mDotedPaint.setStrokeCap(Paint.Cap.ROUND); 
    mDotedPaint.setStrokeWidth(SDV.width); 

    mColorPaint = new Paint(Paint.DITHER_FLAG); 
    mColorPaint.setAntiAlias(true); 
    mColorPaint.setDither(true); 
    mColorPaint.setFilterBitmap(true); 
    mColorPaint.setStyle(Paint.Style.FILL); 
    mColorPaint.setStrokeWidth(SDV.width); 
    mColorPaint.setColor(SDV.colorChoosen); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    sx = super.getWidth() * 0.5f; 
    sy = super.getHeight() * 0.5f; 

    if (SDV.isDrawing) { 
     new OnGoingDrawings().HandleAllOnGoingDrawings(mCurrentShape, 
       canvas); 
    } else { 
     new ShapeDrawer().DrawEverything(canvas, googleMap, sbWidth); 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    SDV.mx = event.getX(); 
    SDV.my = event.getY(); 
    switch (mCurrentShape) { 
    case SDV.shape14: 
     TouchEvents.Shape14(event); 
     break; 

    return true; 
} 

}

est ici auditeur contact,

public static void Shape14(MotionEvent event) { 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     SDV.isDrawing = true; 
     SDV.mStartX = SDV.mx; 
     SDV.mStartY = SDV.my; 
     Gmap.mDrawingView.invalidate(); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     Gmap.mDrawingView.invalidate(); 
     break; 
    case MotionEvent.ACTION_UP: 
     SDV.isDrawing = false; 
     float x = SDV.mStartX, 
     y = SDV.mStartY; 
     float DifX = Math.abs(SDV.mx - SDV.mStartX); 
     float DifY = Math.abs(SDV.my - SDV.mStartY); 
     float radius; 
     if (DifY > DifX) 
      radius = Math.abs(SDV.my - SDV.mStartY); 
     else 
      radius = Math.abs(SDV.mx - SDV.mStartX); 
     SDV.Shape14(x, y, radius); 
     break; 
    } 
}