trigonometricas trigonometria triangulos studio resolucion rectangulos programacion problemas móviles las julioprofe funciones desarrollo curso como aplicando aplicaciones android shapedrawable

trigonometria - ¿Android cómo crear formas de triángulos y rectángulos programáticamente?



problemas de resolucion de triangulos rectangulos aplicando las funciones trigonometricas (7)

¿Cómo podemos crear una forma de ballon drawable como abajo. Donde podemos cambiar su color dinámicamente.


Aquí es XML para triangle y rectangle . Guárdalo dentro de una carpeta dibujable.

triangle.xml

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item > <rotate android:fromDegrees="45" android:toDegrees="45" android:pivotX="-40%" android:pivotY="87%" > <shape android:shape="rectangle" > <stroke android:color="@android:color/transparent" android:width="10dp"/> <solid android:color="#000000" /> </shape> </rotate> </item> </layer-list>

rectangle.xml

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <solid android:color="#B2E3FA" /> </shape> </item> </layer-list>

y el diseño de la forma que necesita.

<RelativeLayout android:id="@+id/rlv1" android:layout_width="150dp" android:layout_height="50dp" android:background="@drawable/rectangle" /> <RelativeLayout android:id="@+id/rlv2" android:layout_width="50dp" android:layout_height="50dp" android:layout_below="@+id/rlv1" android:background="@drawable/triangle" android:rotation="180" />

establecer el margen de acuerdo a sus necesidades.

Source


Crea una vista personalizada y dibuja traingle con lienzo.

package com.example.dickbutt; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.view.View; public class TriangleShapeView extends View { public int colorCode = Color.MAGENTA; public int getColorCode() { return colorCode; } public void setColorCode(int colorCode) { this.colorCode = colorCode; } public TriangleShapeView(Context context) { super(context); } public TriangleShapeView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public TriangleShapeView(Context context, AttributeSet attrs) { super(context, attrs); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); int w = getWidth() / 2; int h = getHeight() / 2; Path path = new Path(); path.moveTo(0, 0); path.lineTo(w, 2 * h); path.lineTo(2 * w, 0); path.lineTo(0, 0); path.close(); Paint p = new Paint(); p.setColor(colorCode); p.setAntiAlias(true); canvas.drawPath(path, p); } }

Resultado

Uso

<TextView android:id="@+id/progress_value" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:background="@android:color/holo_purple" android:gravity="center_horizontal" android:text="200,0000000" android:textColor="#fff" /> <com.example.dickbutt.TriangleShapeView android:id="@+id/textView1" android:layout_width="10dp" android:layout_height="20dp" android:layout_below="@+id/progress_value" android:layout_centerHorizontal="true" android:background="@drawable/rectangle" android:gravity="center_horizontal" android:textSize="10sp" />

Ventajas

  • Cambiar la forma de acuerdo con el ancho y la altura de la vista.
  • Altamente posible la personalización.
  • Lucir mas limpio

La forma limpia y correcta de hacer esto mientras se mantiene dinámico es extender la clase de Vista.

Entonces en el onDraw harías algo como esto:

@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawBackground(canvas); } private void drawBackground(Canvas canvas) { int width = (int) mWidth; int height = (int) mHeight; Point a = new Point(0, 0); Point b = new Point(width, 0); Point c = new Point(width, height - mPointHeight);//mPointedHeight is the length of the triangle... in this case we have it dynamic and can be changed. Point d = new Point((width/2)+(mPointedHeight/2), height - mPointHeight); Point e = new Point((width/2), height);// this is the sharp point of the triangle Point f = new Point((width/2)-(mPointedHeight/2), height - mPointHeight); Point g = new Point(0, height - mPointHeight); Path path = new Path(); path.moveTo(a.x, a.y); path.lineTo(b.x, b.y); path.lineTo(c.x, c.y); path.lineTo(d.x, d.y); path.lineTo(e.x, e.y); path.lineTo(f.x, f.y); path.lineTo(g.x, g.y); canvas.drawPath(path, mPointedBackgroundPaint);// mPointedBackgroundPaint is whatever color you want as the fill. }

Ahí lo tienes, no hay capas o códigos innecesarios que no sean dinámicos o limpios. También puede agregar el texto en el cuadro también.


Primero puedes crear un xml dentro de una carpeta drawable

Ese xml será responsable del color del borde de la forma del rectángulo.

Puede crear dicha forma de borde con el siguiente código

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <solid android:color="#B2E3FA" /> </shape> </item> <item android:left="5dp" android:bottom="5dp" android:top="5dp" > <shape android:shape="rectangle"> <solid android:color="#D8D8D8" /> </shape> </item> </layer-list>

Bueno, esto creará un borde requerido para la forma del rectángulo, debe asignar el fondo de esa forma del rectángulo con este dibujo como este.

android:background="@drawable/bg"

donde bg es el nombre de archivo xml que se ha guardado en una carpeta dibujable

Después de eso necesitas poner ese triángulo exactamente debajo del objeto rectángulo.

Espero que hayas entendido mi lógica


Si quieres un borde para tu diseño

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linear_root" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/text_message" android:layout_width="100dp" android:layout_height="wrap_content" android:background="@drawable/bg_rectangle" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="20dp" android:padding="8dp" android:text="Abc" /> <ImageView android:id="@+id/image_arrow" android:layout_marginTop="-1.5dp" android:layout_width="16dp" android:layout_height="16dp" android:layout_gravity="center_horizontal" android:background="@drawable/icon_arrow_down" /> </LinearLayout>

bg_rectangle

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#eaeaea" /> <stroke android:width="1dp" android:color="#f00" /> <corners android:radius="8dp" /> </shape>

icon_arrow_down , o puede crear triángulo por vector como here

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <rotate android:fromDegrees="45" android:pivotX="135%" android:pivotY="15%" android:toDegrees="45" > <shape android:shape="rectangle"> <solid android:color="#eaeaea"/> <stroke android:width="1dp" android:color="#f00" /> </shape> </rotate> </item> </layer-list>


Use Canvas en el método onDraw dentro de la clase de View personalizada.

Otra forma es usar la clase Path .


Utilice una imagen de triángulo y una imagen rectangular y alinéelos matemáticamente en el formato mencionado anteriormente. Utiliza el filtro de color para cambiar dinámicamente su color.

Incluso puede dibujarlos en una vista personalizada, usando gráficos vectoriales, usando colores personalizados, y esa sería otra forma de resolver este problema.