Fazendo uma forma de triângulo usando definições xml?

133

Existe uma maneira de especificar uma forma de triângulo em um arquivo 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 fazer isso com uma forma de caminho ou algo assim? Eu só preciso de um triângulo equilátero.

obrigado

user291701
fonte
Você encontrou uma solução? Estou tendo o mesmo problema.
Mike Bevz
Isso parece ter funcionado para o cara que escreveu a orientação (e alguns comentadores): Android: Desenhe Equilateral Triangle Shapes Em Canvas
Diegum

Respostas:

166

Em este post eu descrevo como fazê-lo. E aqui está o triângulo definidor de 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 meu post se algo não estiver claro ou se você precisar de explicações sobre como ele é construído. É girado um retângulo de recorte :) é uma solução muito inteligente e que funciona bem.

EDIT: para criar uma seta apontando como -> use:

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

E para criar uma seta apontando como <- use:

android:fromDegrees="45"
android:toDegrees="45"
android:pivotX="87%"
android:pivotY="140%" >
Jacek Milewski
fonte
3
Sinto muito .. mas um triângulo equilátero nunca pode ser um triângulo de ângulo reto.
lilbyrdie
3
@JacekMilewski - muito obrigado! Gostaria de compartilhar quais são os seus parâmetros pivotX / pivotY para uma seta para baixo? Esquerda? Certo?
JohnnyLambada
2
Para rotacioná-lo, altero a rotação no arquivo xml de layout, não na definição do triângulo.
Jacek Milewski
1
-1. Isso não é bom. As dimensões reais da vista são maiores que o que aparece na tela. Deveria ter envolvido os limites.
Javanator
1
Você pode compartilhar como você derivou seus valores para fromDegrees, toDegrees, pivotX e pivotY? Eu tenho um caso de uso em que não é possível alterar a rotação no arquivo de layout.
Patrick Brennan
82
<TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="▼"/>

Você pode obter aqui mais opções.

Elhanan Mishraky
fonte
3
Como você coloca esse valor em xml?
user531069
2
Copie este TextView e colá-lo para o seu xml
Elhanan Mishraky
6
@ user531069: coloque isso no seu strings.xml:<string name="bottom_arrow">&#9660;</string>
1
Quero uma seta diferente do link, copio e colo & # 129032; como texto, mostra algum caractere desconhecido. ?
M. Usman Khan
2
Esta solução cria um novo problema de manipulação de Font Padding dentro da exibição de texto.
precisa saber é o seguinte
59

Você pode usar vectorpara fazer triângulo assim

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>

Então use-o como

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

Para alterar a cor e a direção, use android:tinteandroid: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

insira a descrição da imagem aqui

Para alterar a forma do vetor, você pode alterar a largura / altura do vetor. Exemplo de alteração de largura para 10dp

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

insira a descrição da imagem aqui

Phan Van Linh
fonte
obrigado, eu realmente não sei como esses vetores funcionam. Eu precisava do resultado
Hossein Shahdoost
como posso aumentar e diminuir o tamanho desses triângulos? Ao especificar a altura ea largura, ele não funciona
Aayushi
46

Você pode usar gavetas vetoriais .

Se sua API mínima for menor que 21, o Android Studio criará bitmaps PNG automaticamente para essas versões inferiores no momento da criação (consulte Vector Asset Studio ). Se você usa a biblioteca de suporte, o Android até gerencia "vetores reais" até a API 7 (mais sobre isso na atualização desta postagem na parte inferior).

Um triângulo vermelho apontando para cima seria:

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

Adicione-o ao seu layout e lembre-se de definir clipChildren = "false" se você girar o 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>

insira a descrição da imagem aqui

Altere o tamanho (largura / altura) do triângulo definindo os atributos Visualizações layout_width / layout_height. Dessa forma, você também pode obter uma triagle eqilateral se fizer as contas corretamente.

ATUALIZAÇÃO 25.11.2017

Se você usar a biblioteca de suporte, poderá usar vetores reais (em vez de criação de bitmap) já na API 7 . Basta adicionar:

vectorDrawables.useSupportLibrary = true

faça o seu defaultConfigno build.gradle do seu módulo.

Em seguida, defina o (vetor xml) desenhável da seguinte maneira:

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

Tudo está documentado muito bem na página do Vector Asset Studio .

Desde esse recurso, tenho trabalhado inteiramente sem bitmaps em termos de ícones. Isso também reduz um pouco o tamanho do APK.

Oliver Metz
fonte
1
postar um link e alguém vai enviá-lo para você :-)
GabrielOshiro
1
+1 vectorDrawables.useSupportLibrary = truetem a vantagem extra que você pode usar cores definidas no colors.xml, porque bitmaps são criados durante a construção (quando as cores definidas não estão disponíveis).
Rob
39

Eu definitivamente iria implementar uma View neste 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);
    }
}

Faça uso dele em seus layouts da seguinte maneira:

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

O uso desta implementação fornecerá o seguinte resultado:

insira a descrição da imagem aqui

Peter
fonte
<com.your.path.to.view.TriangleShapeView ... />
trabalhou
isso é ótimo. Como posso mudar a cor do triângulo. dizer que a cor inicial é cinza, mas muda para vermelho ao onTouch ou onClick?
Fshamri
Isto é muito melhor do que o hack em xml
dorsz
@ Peter Hi. você pode me ajudar com pequenas melhorias? Eu preciso do canto superior direito para ser arredondado. como posso conseguir isso?
Barterio # 6/16
1
Como eu adicionaria texto dentro do triângulo?
Sakiboy 3/11
38

A solução de Jacek Milewski funciona para mim e, com base na solução dele, se você precisar de um triângulo inverso, poderá usar isso:

<?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
fonte
-1 Desta forma, você não pode obter o triângulo eqilateral. E de qualquer maneira, está tendo muitos problemas potenciais, isto é. stackoverflow.com/questions/20805826/…
j_kubik
21

Veja a resposta aqui: Setas personalizadas sem imagem: 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>

seta

zed
fonte
11

Posso ajudá-lo sem usar XML?


Simplesmente,

Layout personalizado (fatia):

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

Sua atividade (exemplo):

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

Exemplo de trabalho:

insira a descrição da imagem aqui


Outra Calculatefunção absolutamente simples que você pode interessar ..

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
fonte
11
+1 Sim, você pode. E obrigada. Há outras pessoas além de OP, que estão à procura de uma solução que não estão pedindo especificamente para XML - como am I.
johndodo
1
O onDraw não será chamado em classes derivadas do ViewGroup, não será o padrão. Você precisa ativar o desenho por setWillNotDraw (false) ou herdar de uma View.
Blago
11

Usando o vetor drawable:

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

insira a descrição da imagem aqui

Zygi
fonte
Usando Le zno final resolveu o meu problema, obrigado!
Oxied 23/10/19
6

Para quem deseja uma seta do triângulo retângulo, aqui está:

PASSO 1: Crie um arquivo XML desenhável, copie e cole o seguinte conteúdo XML em seu XML desenhável. (Esteja ciente de que você pode usar qualquer nome para o seu arquivo XML desenhável. No meu caso, chamo-o de "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>

ETAPA 2: No XML do seu layout, crie uma Visualização e vincule seu plano de fundo ao XML que você acabou de criar que você acabou de criar na ETAPA 1 . Para o meu caso, vinculo v_right_arrow à propriedade background da minha View.

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

Saída de amostra:

insira a descrição da imagem aqui

Espero que isso ajude, boa sorte!

Chong Chern Dong
fonte
6

Você pode adicionar o seguinte triângulo em segundo plano usando o seguinte 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>

Está toda a lógica para personalizar o design xml pathData. Considere o canto superior esquerdo como (0,0) e projete o layout conforme sua exigência. Verifique esta resposta.

Sanjay Sharma
fonte
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
fonte
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
fonte
3

Eu nunca fiz isso, mas pelo que entendi, você pode usar a classe PathShape: http://developer.android.com/reference/android/graphics/drawable/shapes/PathShape.html

Justin
fonte
2
Como usar a forma do caminho em XML?
Sebastian Roth
Isso foi útil para encontrar a parte certa a ser usada, mas não oferece explicações suficientes sobre como usá-la. Obrigado mesmo assim.
Navarr
Desculpe Sebastian e Navarr ... Eu indiquei na minha resposta que nunca o usei, então não tenho certeza de como usá-lo. Parece apenas a turma que faria o trabalho. Concordo, porém, que não há documentação suficiente para isso.
Justin Justin
3
PathShape não parece ter uma sintaxe XML associada. A tag XML Shape suporta apenas retângulo, oval, linha e anel. developer.android.com/guide/topics/resources/…
Nilzor
3

Estou atrasado para a festa e me deparei com o mesmo problema, e o Google me indicou esse segmento do StackOverflow como primeiro resultado.

Eu tentei usar a maneira xml para adicionar triângulo e descobrir um problema que a forma do triângulo via abordagem xml está tomando mais espaço do que parece.

Veja a captura de tela com limites de layout

insira a descrição da imagem aqui

Então, acabamos criando essa classe de exibição personalizada, que pode desenhar Triângulo de qualquer um dos seguintes tipos: -

  1. apontando
  2. apontando para baixo
  3. esquerda apontando &
  4. apontando certo

como ... como

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

Você pode simplesmente usá-lo no layout xml como este

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

Eu sei OP quer soluções em solução xml, mas como apontei problema com a abordagem xml. Espero que ajude alguém.

Hitesh Sahu
fonte
2

Usando a solução de Jacek Milewski , fiz um ângulo orientado para baixo com um fundo 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>

Você pode mudar android:pivotXe android:pivotYmudar o ângulo.

Uso:

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

insira a descrição da imagem aqui

Os parâmetros dependem do tamanho da imagem. Por exemplo, se ImageViewtiver tamanho 100dp * 80dp, você deve usar estas constantes:

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

insira a descrição da imagem aqui

CoolMind
fonte
2

Eu tento criar uma imagem triangular como o botão voltar da barra de navegação do Android, mas não encontrei nenhuma solução.

Agora, encontrei a solução comigo mesmo e gostaria de compartilhá-la.

barra de navegação triângulo android

use xml abaixo

<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
fonte
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
fonte
-1 Desta forma, você não pode obter o triângulo eqilateral. E de qualquer maneira, está tendo muitos problemas potenciais, isto é. stackoverflow.com/questions/20805826/…
j_kubik
0

O Google fornece um triângulo Equilateral aqui .
Escolha VectorDrawable para que o tamanho seja flexível.
É integrado ao Android Studio como plugin.

Se você tiver uma imagem SVG, poderá usá- la para convertê-la em VectorDrawable também.

Depois de ter um VectorDrawable, é fácil alterar sua cor e rotação, como outros já mencionaram.

ericn
fonte