¿Hacer una forma de triángulo usando definiciones xml?

133

¿Hay alguna manera de que pueda especificar una forma de triángulo en un archivo xml?

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="triangle">
  <stroke android:width="1dip" android:color="#FFF" />
  <solid android:color="#FFF" />
</shape>

¿Podemos hacer esto con una forma de camino o algo así? Solo necesito un triángulo equilátero.

Gracias

usuario291701
fuente
¿Encontraste una solución? Estoy teniendo el mismo problema.
Mike Bevz
Esto parece haber funcionado para el tipo que escribió la guía (y algunos comentaristas): Android: Dibujar formas de triángulo equilátero en lienzo
Diegum

Respuestas:

166

En esta publicación describo cómo hacerlo. Y aquí está el triángulo que define 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="@color/transparent" android:width="10dp"/>
                <solid
                    android:color="@color/your_color_here" />
            </shape>
        </rotate>
    </item>
</layer-list>

Consulte mi publicación si algo no está claro o necesita una explicación de cómo está construido. Se gira un rectángulo recortado :) es una solución muy inteligente y que funciona bien.

EDITAR: para crear una flecha apuntando como -> use:

...
android:fromDegrees="45"
android:toDegrees="45"
android:pivotX="13%"
android:pivotY="-40%" >
...

Y para crear una flecha apuntando como <- use:

android:fromDegrees="45"
android:toDegrees="45"
android:pivotX="87%"
android:pivotY="140%" >
Jacek Milewski
fuente
3
Lo siento ... pero un triángulo equilátero nunca puede ser un triángulo rectángulo.
lilbyrdie
3
@JacekMilewski: ¡muchas gracias! ¿Le gustaría compartir cuáles son sus parámetros pivotX / pivotY para una flecha hacia abajo? ¿Izquierda? ¿Correcto?
JohnnyLambada
2
Para rotarlo, cambio la rotación en el archivo xml de diseño, no en la definición del triángulo en sí.
Jacek Milewski
1
-1. Esto no es bueno Las dimensiones reales de la vista son mayores que las que aparecen en la pantalla. Debería haber envuelto los límites.
Javanator
1
¿Puede compartir cómo obtuvo sus valores de fromDegrees, toDegrees, pivotX y pivotY? Tengo un caso de uso en el que no es posible cambiar la rotación en el archivo de diseño.
Patrick Brennan
82
<TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="▼"/>

Puedes obtener más opciones aquí .

Elhanan Mishraky
fuente
3
¿Cómo se pone ese valor en xml?
user531069
2
Copie este TextView y péguelo en su xml
Elhanan Mishraky
66
@ user531069: pon esto en tus cadenas.xml:<string name="bottom_arrow">&#9660;</string>
1
Quiero una flecha diferente del enlace, copio y pego & # 129032; como texto, muestra un carácter desconocido. ?
M. Usman Khan
2
Esta solución crea un nuevo problema al manejar el relleno de fuentes dentro de la vista de texto.
Salman Khakwani el
59

Puedes usar vectorpara hacer un triángulo como este

ic_triangle_right.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
    <path
        android:pathData="M0,12l0,12 11.5,-5.7c6.3,-3.2 11.5,-6 11.5,-6.3 0,-0.3 -5.2,-3.1 -11.5,-6.3l-11.5,-5.7 0,12z"
        android:strokeColor="#00000000"
        android:fillColor="#000000"/>
</vector>

Entonces úsalo como

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/ic_triangle_right"
    />

Para cambiar el color y la dirección, use android:tintyandroid:rotation

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/ic_triangle_right"
    android:rotation="180" // change direction
    android:tint="#00f" // change color
    />

Resultado

ingrese la descripción de la imagen aquí

Para cambiar la forma del vector, puede cambiar el ancho / alto del vector. Ejemplo de cambio de ancho a 10dp

<vector 
        android:width="10dp"
        android:height="24dp"
        >
       ...
</vector>

ingrese la descripción de la imagen aquí

Phan Van Linh
fuente
gracias, realmente no sé cómo funcionan estos vectores. Necesitaba el resultado
Hossein Shahdoost el
¿Cómo puedo aumentar y disminuir el tamaño de estos triángulos? Al especificar la altura y el ancho, no funciona
Aayushi
46

Puede usar vectores dibujables .

Si su API mínima es inferior a 21, Android Studio crea automáticamente mapas de bits PNG para esas versiones inferiores en el momento de la compilación (consulte Vector Asset Studio ). Si usa la biblioteca de soporte, Android incluso gestiona "vectores reales" hasta API 7 (más sobre eso en la actualización de esta publicación en la parte inferior).

Un triángulo rojo que apunta hacia arriba sería:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="100dp"
    android:width="100dp"
    android:viewportHeight="100"
    android:viewportWidth="100" >
    <group
        android:name="triableGroup">
        <path
            android:name="triangle"
            android:fillColor="#FF0000"
            android:pathData="m 50,0 l 50,100 -100,0 z" />
    </group>
</vector>

Agréguelo a su diseño y recuerde configurar clipChildren = "false" si gira el triángulo.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false">

    <ImageView
        android:layout_width="130dp"
        android:layout_height="100dp"
        android:rotation="0"
        android:layout_centerInParent="true"
        android:background="@drawable/triangle"/>

</RelativeLayout>

ingrese la descripción de la imagen aquí

Cambie el tamaño (ancho / alto) del triángulo estableciendo los atributos Vistas layout_width / layout_height. De esta manera también puede obtener un triagle equilátero si hace los cálculos correctos.

ACTUALIZACIÓN 25.11.2017

Si usa la biblioteca de soporte, puede usar vectores reales (en su lugar, si se crea un mapa de bits) desde API 7 . Simplemente agregue:

vectorDrawables.useSupportLibrary = true

haz tu defaultConfigen el build.gradle de tu módulo.

Luego configure el (vector xml) dibujable de esta manera:

<ImageView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    app:srcCompat="@drawable/triangle" />

Todo está muy bien documentado en la página de Vector Asset Studio .

Desde esta función, he estado trabajando completamente sin mapas de bits en términos de iconos. Esto también reduce bastante el tamaño del APK.

Oliver Metz
fuente
1
publica un enlace y alguien lo subirá por ti :-)
GabrielOshiro
1
+1 vectorDrawables.useSupportLibrary = truetiene el beneficio adicional de que puede usar los colores definidos colors.xml, porque los mapas de bits se crean durante la compilación (cuando los colores definidos no están disponibles).
Rob
39

Definitivamente optaría por implementar una Vista en este caso:

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

        Path path = new Path();
        path.moveTo( w, 0);
        path.lineTo( 2 * w , 0);
        path.lineTo( 2 * w , w);
        path.lineTo( w , 0);
        path.close();

        Paint p = new Paint();
        p.setColor( Color.RED );

        canvas.drawPath(path, p);
    }
}

Úselo en sus diseños de la siguiente manera:

<TriangleShapeView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff487fff">
</TriangleShapeView>

El uso de esta implementación le dará el siguiente resultado:

ingrese la descripción de la imagen aquí

Peter
fuente
<com.your.path.to.view.TriangleShapeView ... />
trabajó el
Eso es genial. ¿Cómo puedo cambiar el color del triángulo? ¿dice que el color inicial es gris pero cambia a rojo en onTouch o onClick?
Fshamri
Esto es mucho mejor que el hack en XML
Dorsz
@Peter Hola. ¿Me pueden ayudar con una pequeña mejora? Necesito la esquina superior derecha para ser redondeada. ¿Cómo puedo lograr esto?
Barterio
1
¿Cómo agregaría texto dentro del triángulo?
Sakiboy el
38

La solución de Jacek Milewski funciona para mí y, en función de su solución, si necesita un triángulo inverso, puede usar esto:

<?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="135%" 
            android:pivotY="15%">
            <shape android:shape="rectangle">    
                <solid android:color="@color/aquamarine" />
            </shape>
        </rotate>
    </item>
</layer-list>
senechaux
fuente
-1 De esta manera no puedes obtener un triángulo equilátero. Y de todos modos, está teniendo muchos problemas potenciales, es decir. stackoverflow.com/questions/20805826/…
j_kubik
21

Ver respuesta aquí: Flechas personalizadas sin imagen: Android

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="32dp"
        android:height="24dp"
        android:viewportWidth="32.0"
        android:viewportHeight="24.0">
    <path android:fillColor="#e4e4e8"
          android:pathData="M0 0 h32 l-16 24 Z"/>
</vector>

flecha

zed
fuente
11

¿Puedo ayudarte sin usar XML?


Simplemente,

Diseño personalizado (sector):

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.View;

public class Slice extends View {

    Paint mPaint;

    Path mPath;

    public enum Direction {
        NORTH, SOUTH, EAST, WEST
    }

    public Slice(Context context) {
        super(context);
        create();
    }

    public Slice(Context context, AttributeSet attrs) {
        super(context, attrs);
        create();
    }

    public void setColor(int color) {
        mPaint.setColor(color);
        invalidate();
    }

    private void create() {
        mPaint = new Paint();
        mPaint.setStyle(Style.FILL);
        mPaint.setColor(Color.RED);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        mPath = calculate(Direction.SOUTH);
        canvas.drawPath(mPath, mPaint);
    }

    private Path calculate(Direction direction) {
        Point p1 = new Point();
        p1.x = 0;
        p1.y = 0;

        Point p2 = null, p3 = null;

        int width = getWidth();

        if (direction == Direction.NORTH) {
            p2 = new Point(p1.x + width, p1.y);
            p3 = new Point(p1.x + (width / 2), p1.y - width);
        } else if (direction == Direction.SOUTH) {
            p2 = new Point(p1.x + width, p1.y);
            p3 = new Point(p1.x + (width / 2), p1.y + width);
        } else if (direction == Direction.EAST) {
            p2 = new Point(p1.x, p1.y + width);
            p3 = new Point(p1.x - width, p1.y + (width / 2));
        } else if (direction == Direction.WEST) {
            p2 = new Point(p1.x, p1.y + width);
            p3 = new Point(p1.x + width, p1.y + (width / 2));
        }

        Path path = new Path();
        path.moveTo(p1.x, p1.y);
        path.lineTo(p2.x, p2.y);
        path.lineTo(p3.x, p3.y);

        return path;
    }
}

Su actividad (ejemplo):

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;

public class Layout extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Slice mySlice = new Slice(getApplicationContext());
        mySlice.setBackgroundColor(Color.WHITE);
        setContentView(mySlice, new LinearLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    }
}

Ejemplo de trabajo

ingrese la descripción de la imagen aquí


Otra Calculatefunción absolutamente simple que le puede interesar.

private Path Calculate(Point A, Point B, Point C) {
    Path Pencil = new Path();
    Pencil.moveTo(A.x, A.y);
    Pencil.lineTo(B.x, B.y);
    Pencil.lineTo(C.x, C.y);
    return Pencil;
}
Ahmed Ghoneim
fuente
11
+1 Sí, puedes. Y gracias. Hay otras personas además de OP, que están en busca de una solución que no estén solicitando específicamente para XML - igual que yo
johndodo
1
onDraw no se llamará en las clases que derivan de ViewGroup, no será predeterminado. Debe habilitar el dibujo mediante setWillNotDraw (falso) o heredar de una vista.
Blago
11

Usando vector dibujable:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
   android:width="24dp"
   android:height="24dp"
   android:viewportWidth="24.0"
   android:viewportHeight="24.0">
   <path
        android:pathData="M0,0 L24,0 L0,24 z"
        android:strokeColor="@color/color"
        android:fillColor="@color/color"/>
</vector>

ingrese la descripción de la imagen aquí

Zygi
fuente
Usando Ly zal final solucionó mi problema, ¡gracias!
oxidado el
6

Para aquellos que quieren una flecha de triángulo rectángulo, aquí van:

PASO 1: Cree un archivo XML dibujable, copie y pegue el siguiente contenido XML en su XML dibujable. (Tenga en cuenta que puede usar cualquier nombre para su archivo XML dibujable. Para mi caso, lo llamo "v_right_arrow")

<?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="15%"
            android:pivotY="-36%" >
            <shape
                android:shape="rectangle"  >
                <stroke android:color="@android:color/transparent" android:width="1dp"/>
                <solid
                    android:color="#000000"  />
            </shape>
        </rotate>
    </item>
</layer-list>

PASO 2: en el XML de su diseño, cree una Vista y vincule su fondo al XML dibujable que acaba de crear en el PASO 1 . Para mi caso, asocio v_right_arrow a la propiedad de fondo de mi Vista.

<View
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:background="@drawable/v_right_arrow">
</View>

Salida de muestra:

ingrese la descripción de la imagen aquí

Espero que esto ayude, buena suerte!

Chong Chern Dong
fuente
6

Puede agregar el siguiente triángulo en segundo plano usando el siguiente xml

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="100dp"
    android:width="100dp"
    android:viewportHeight="100"
    android:viewportWidth="100" >
    <group
        android:name="triableGroup">
        <path
            android:name="triangle"
            android:fillColor="#848af8"
            android:pathData="M 0,20 L 0,0 L 100,0 L 100,20 L 54,55  l -1,0.6  l -1,0.4  l -1,0.2  l -1,0   l -1,-0  l -1,-0.2  l -1,-0.4  l -1,-0.6    L 46,55   L 0,20 -100,-100 Z" />
    </group>
</vector>

Toda la lógica para personalizar el diseño xml está en pathData. Considere la esquina superior izquierda como (0,0) y diseñe el diseño según sus requisitos. Mira esta respuesta.

Sanjay Sharma
fuente
4
<?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="0dp"/>
                <solid
                    android:color="#fff" />
            </shape>
        </rotate>
    </item>
</layer-list>
Arunkumar
fuente
4
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <rotate
                android:fromDegrees="45"
                android:pivotX="135%"
                android:pivotY="1%"
                android:toDegrees="45">
                <shape android:shape="rectangle">
                    <stroke
                        android:width="-60dp"
                        android:color="@android:color/transparent" />
                    <solid android:color="@color/orange" />
                </shape>
            </rotate>
        </item>
    </layer-list>
Shivam Kumar
fuente
3

Nunca he hecho esto, pero por lo que entiendo, puede usar la clase PathShape: http://developer.android.com/reference/android/graphics/drawable/shapes/PathShape.html

Justin
fuente
2
¿Cómo usar la forma de la ruta en XML?
Sebastian Roth
Esto fue útil para encontrar la parte correcta para usar, pero no ofrece una explicación suficiente sobre cómo usarlo. Gracias de todos modos, sin embargo.
Navarr
Lo siento, Sebastian y Navarr ... Indiqué en mi respuesta que nunca lo había usado, así que no estoy seguro de cómo hacerlo. Esto simplemente parece la clase que haría el trabajo. Sin embargo, estoy de acuerdo en que no hay suficiente documentación para ello.
Justin
3
PathShape no parece tener una sintaxis XML asociada. La etiqueta de forma XML solo admite rectángulo, óvalo, línea y anillo. developer.android.com/guide/topics/resources/…
Nilzor
3

Llegué tarde a la fiesta y me encontré con el mismo problema y Google me señaló este hilo de StackOverflow como primer resultado.

Intenté usar la forma xml para agregar un triángulo y descubrí un problema de que la forma del triángulo a través del enfoque xml está ocupando más espacio del que parece.

Ver captura de pantalla con límites de diseño en

ingrese la descripción de la imagen aquí

Así que terminé haciendo esta clase de vista personalizada que puede dibujar Triángulo de cualquiera de los siguientes tipos:

  1. apuntando hacia arriba
  2. apuntando hacia abajo
  3. apuntando a la izquierda y
  4. apuntando a la derecha

asas

package com.hiteshsahu.materialupvotewidget;    
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.View;

public class TriangleShapeView extends View {

    private int colorCode = Color.DKGRAY;

    public int getColorCode() {
        return colorCode;
    }

    public void setColorCode(int colorCode) {
        this.colorCode = colorCode;
    }

    public TriangleShapeView(Context context) {
        super(context);
        if (isInEditMode())
            return;
    }

    public TriangleShapeView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if (isInEditMode())
            return;
    }

    public TriangleShapeView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        if (isInEditMode())
            return;
    }


    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int w = getWidth() / 2;
        int h = getHeight() / 2;

        //Choose what type of triangle you want here
        Path path = getLeftTriangle(w, h);

        path.close();
        Paint p = new Paint();
        p.setColor(colorCode);
        p.setAntiAlias(true);

        canvas.drawPath(path, p);
    }

    @NonNull
    /**
     * Return Path for down facing triangle
     */
    private Path getInvertedTriangle(int w, int h) {
        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(w, 2 * h);
        path.lineTo(2 * w, 0);
        path.lineTo(0, 0);
        return path;
    }

    @NonNull
    /**
     * Return Path for Up facing triangle
     */
    private Path getUpTriangle(int w, int h) {
        Path path = new Path();
        path.moveTo(0, 2 * h);
        path.lineTo(w, 0);
        path.lineTo(2 * w, 2 * h);
        path.lineTo(0, 2 * h);
        return path;
    }

    @NonNull
    /**
     * Return Path for Right pointing triangle
     */
    private Path getRightTriangle(int w, int h) {
        Path path = new Path();
        path.moveTo(0, 0);
        path.lineTo(2 * w, h);
        path.lineTo(0, 2 * h);
        path.lineTo(0, 0);
        return path;
    }

    @NonNull
    /**
     * Return Path for Left pointing triangle
     */
    private Path getLeftTriangle(int w, int h) {
        Path path = new Path();
        path.moveTo(2 * w, 0);
        path.lineTo(0, h);
        path.lineTo(2 * w, 2 * h);
        path.lineTo(2 * w, 0);
        return path;
    }
}

Simplemente puede usarlo en un diseño xml como este

 <com.hiteshsahu.materialupvote.TriangleShapeView
            android:layout_width="50dp"
            android:layout_height="50dp"></com.hiteshsahu.materialupvote.TriangleShapeView>

Sé que OP quiere soluciones en solución xml, pero como señalé un problema con el enfoque xml. Espero que pueda ayudar a alguien.

Hitesh Sahu
fuente
2

Usando la solución de Jacek Milewski , hice un ángulo orientado hacia abajo con un fondo transparente.

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

Puede cambiar android:pivotXy android:pivotYcambiar el ángulo.

Uso:

<ImageView
    android:layout_width="10dp"
    android:layout_height="10dp"
    android:src="@drawable/ic_angle_down"
    />

ingrese la descripción de la imagen aquí

Los parámetros dependen del tamaño de la imagen. Por ejemplo, si ImageViewtiene un tamaño de 100dp * 80dp, debe usar estas constantes:

<rotate
    android:fromDegrees="135"
    android:pivotX="64.5%"
    android:pivotY="19%"
    android:toDegrees="135"
    >

ingrese la descripción de la imagen aquí

CoolMind
fuente
2

Intento crear una imagen triangular como el botón Atrás de la barra de navegación de Android, pero no he encontrado ninguna solución.

Ahora, encontré la solución conmigo mismo y me gustaría compartirla.

barra de navegación triangular android

usa xml a continuación

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:bottom="20dp"
    android:left="480dp"
    android:right="60dp"
    android:top="20dp">
    <shape>
        <size android:width="60dp" />
        <corners android:radius="80dp"/>
        <solid android:color="#AAA" />
    </shape>
</item>
<item
    android:bottom="480dp"
    android:right="70dp"
    android:top="20dp">
    <rotate
        android:fromDegrees="-28"
        android:pivotX="96%"
        android:pivotY="50%"
        android:toDegrees="-20">
        <shape>
            <corners android:radius="80dp"/>
            <size android:height="60dp" />
            <solid android:color="#AAA" />
        </shape>
    </rotate>
</item>

<item
    android:bottom="20dp"
    android:right="70dp"
    android:top="480dp">
    <rotate
        android:fromDegrees="28"
        android:pivotX="96%"
        android:pivotY="50%"
        android:toDegrees="-20">
        <shape>
            <corners android:radius="80dp"/>
            <size android:height="60dp" />
            <solid android:color="#AAA" />
        </shape>
    </rotate>
</item>

rattisuk
fuente
0
  <LinearLayout
        android:id="@+id/ly_fill_color_shape"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_gravity="center"
        android:background="@drawable/shape_triangle"
        android:gravity="center"
        android:orientation="horizontal" >
    </LinearLayout>

<item>
    <rotate
        android:fromDegrees="45"
        android:pivotX="-15%"
        android:pivotY="77%"
        android:toDegrees="45" >
        <shape android:shape="rectangle" >
            <stroke
                android:width="2dp"
                android:color="@color/black_color" />

            <solid android:color="@color/white" />

            <padding android:left="1dp" />
        </shape>
    </rotate>
</item>
<item android:top="200dp">
    <shape android:shape="line" >
        <stroke
            android:width="1dp"
            android:color="@color/black_color" />

        <solid android:color="@color/white" /> 
    </shape>
</item>

Kena Patel
fuente
-1 De esta manera no puedes obtener un triángulo equilátero. Y de todos modos, está teniendo muchos problemas potenciales, es decir. stackoverflow.com/questions/20805826/…
j_kubik
0

Google proporciona un triángulo equilátero aquí .
Elija VectorDrawable para que el tamaño sea flexible.
Está integrado en Android Studio como complemento.

Si usted tiene una imagen SVG, puede utilizar este para convertirlo en VectorDrawable también.

Una vez que tenga un VectorDrawable, cambiar su color y rotación es fácil como otros han mencionado.

ericn
fuente