多个矩形不在画布上绘图

时间:2016-09-11 10:55:35

标签: android android-canvas drawrect family-tree

我正在尝试在android中创建一个类似于结构的族树。我使用画布为家庭成员名称和连接线绘制矩形和线。

我在link

的帮助下通过以下方法绘制矩形和线条

DrawView.java

onDraw

现在我尝试在LinearLayout中添加多个视图,其方向水平如下:

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

但是当我这样做时,只有一个视图被添加到画布而其他视图不可见。我没有在android中使用canvas的经验,如果有人可以指导我解决这个问题,我会很高兴。

3 个答案:

答案 0 :(得分:0)

我尝试过你的项目,但它太宽泛,无法在答题纸上编辑。我必须建议看看这些:

  1. Multiple rect.
  2. Rectangle with view

答案 1 :(得分:0)

  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;

希望有所帮助

答案 2 :(得分:-1)

请检查我是怎么做到的, 您可以从here表单myapp查看其工作原理

//我如何调用绘制矩形

这是SDV.class

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