Múltiples rectángulos que no dibujan sobre lienzo
Estoy tratando de crear un árbol familiar como estructura en android. Estoy usando la lona para dibujar el rectángulo y la línea para los nombres de los miembros de la familia y la línea que conecta.
Estoy dibujando rectángulo y línea por el siguiente método con la ayuda de enlace
- Android: dibujo en un nuevo lienzo
- Efecto de zoom en Android SurfaceView
- Obtención de mapa de bits desde SurfaceView personalizado
- La detección facial no detecta caras, Android
- Android, lienzo: ¿Cómo puedo borrar (eliminar contenidos de) un lienzo (= bitmaps), que viven en una surfaceView?
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")); } }
Ahora estoy intentando agregar vistas múltiples en LinearLayout con la orientación horizontal como abajo:
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; }
Pero cuando hago esto sólo se agrega una vista al lienzo y otras no son visibles. No tengo experiencia en el trabajo con lienzo en Android, me alegraría si alguien me podría guiar con este problema.
- Dibujar círculo mediante programación utilizando Android ShapeDrawable
- El lienzo SurfaceView de Android produce colores incorrectos
- Android IllegalArgumentException lockCanvas ()
- Cambio de lienzo de Android algunos píxeles de color
- Android: ¿Cómo hacer esta pintura enmarcada?
- Evite dibujar más allá del lienzo con SurfaceView
- Comprensión de los conceptos de lienzo y superficie
- Buscar coordenadas exactas de un solo carácter dentro de un TextView
Intenté trabajar en su proyecto, pero es demasiado amplio para editarlo en la hoja de respuestas. Debo sugerir a mirar estos:
- Múltiple rect.
- Rectángulo con vista
if (count1 < 2) { x = dirButton.getX(); y = dirButton.getY(); }
Desde la línea de código anterior, se establece la condición para cuando se ejecuta la línea.
Y usar si declaración.
int count1 = 1; //Count was initialized to 1
Esto hace que el código para introducir la instrucción if en la primera llamada
count1++;
Esta línea aumenta el valor de count a 2, por lo tanto el bloque if no se ejecuta de nuevo …
Y el valor de y nunca cambia que conduce a la superposición.
Puede ser lo que te perdiste es aumento regular de y
y+=something;
Espero que ayude
Por favor, compruebe cómo he hecho esto, Puede comprobar desde aquí myapp formulario, cómo funciona
// Cómo llamo para dibujar rectángulo
Esta es la clase 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(); }
Aquí está nuestra opinión,
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; }
}
Aquí está el oyente del tacto,
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; } }
- Cómo buscar mediante programación la dirección IP externa de un dispositivo sin utilizar host externo?
- Archivos espurios en el directorio de datos de mi aplicación