Несколько прямоугольников не рисуются на холсте

Я пытаюсь создать структуру генеалогического древа в Android. Я использую холст для рисования прямоугольника и линии для имен членов семьи и соединительной линии.

Я рисую прямоугольник и линию следующим методом с помощью ">ссылка

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("#80123456"));

        //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("#80123456"));
    }
}

Теперь я пытаюсь добавить несколько представлений в LinearLayout с горизонтальной ориентацией, как показано ниже:

  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;
  }

Но когда я это делаю, на холст добавляется только один вид, а другие не видны. У меня нет опыта работы с холстом в Android, я был бы рад, если бы кто-нибудь помог мне с этой проблемой.


person Manishika    schedule 11.09.2016    source источник
comment
Ваш холст должен быть внутри представления, и вы рисуете все на холсте с помощью метода onDraw(). Вам не нужно несколько представлений на холсте. Каждый раз, когда вам нужно обновить холст, вы можете выполнить вызов invalidate(), который вызовет onDraw().   -  person Mobile Developer    schedule 14.09.2016
comment
Я думаю, что оба прямоугольника нарисованы в одном и том же xy. Вы можете проверить это или сделать один из прямоугольников вида больше другого и иметь разные цвета для прямоугольника, чтобы проверить, нарисованы ли оба прямоугольника.   -  person surya    schedule 18.09.2016
comment
не звони своему init() в onDraw   -  person FunkTheMonk    schedule 22.09.2016


Ответы (3)


Я пытался работать над вашим проектом, но он слишком широк, чтобы редактировать его в листе ответов. Я должен предложить посмотреть эти:

  1. Несколько прямоугольников.
  2. Прямоугольник с видом
person W4R10CK    schedule 20.09.2016

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

из приведенной выше строки кода вы устанавливаете условие выполнения строки.

и используйте оператор if.

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

Это заставляет код вводить оператор if при первом вызове.

    count1++;

Эта строка увеличивает значение count до 2, поэтому блок if больше не выполняется...

И значение y никогда не меняется, что приводит к наложению.

Может быть, вы пропустили регулярное увеличение y

   y+=something;

надеюсь, это поможет

person Positive    schedule 21.09.2016

Пожалуйста, проверьте, как я это сделал. Вы можете проверить здесь форма myapp, как это работает

// Как я вызываю рисование прямоугольника

Это SDV.класс

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();
}

Вот наш взгляд,

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;
}

}

Вот сенсорный слушатель,

 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;
    }
}
person Saveen    schedule 21.09.2016