Créer une forme de triangle en utilisant des définitions XML?

133

Existe-t-il un moyen de spécifier une forme de triangle dans un fichier 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>

pouvons-nous faire cela avec une forme de chemin ou quelque chose? J'ai juste besoin d'un triangle équilatéral.

Merci

user291701
la source
Avez-vous trouvé une solution? J'ai le même problème.
Mike Bevz
Cela semble avoir fonctionné pour le gars qui a écrit les conseils (et quelques commentateurs): Android: Dessinez des formes triangulaires équilatérales dans la toile
Diegum

Réponses:

166

Dans cet article, je décris comment le faire. Et voici le triangle de définition 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>

Reportez-vous à mon article si quelque chose n'est pas clair ou si vous avez besoin d'explications sur la façon dont il est construit. Il est tourné un rectangle de découpe :) c'est une solution très intelligente et qui fonctionne bien.

EDIT: pour créer une flèche pointant comme -> utilisez:

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

Et pour créer une flèche pointant comme <- utilisez:

android:fromDegrees="45"
android:toDegrees="45"
android:pivotX="87%"
android:pivotY="140%" >
Jacek Milewski
la source
3
Je suis désolé ... mais un triangle équilatéral ne peut jamais être un triangle à angle droit.
lilbyrdie
3
@JacekMilewski - merci beaucoup! Voulez-vous partager vos paramètres pivotX / pivotY pour une flèche vers le bas? La gauche? Droite?
JohnnyLambada
2
Pour le faire pivoter, je change la rotation dans le fichier XML de mise en page, pas dans la définition du triangle elle-même.
Jacek Milewski
1
-1 . Ce n'est pas bon. Les dimensions réelles de la vue sont plus grandes que ce qui apparaît à l'écran. Il aurait dû boucler les limites.
Javanator
1
Pouvez-vous s'il vous plaît partager comment vous avez dérivé vos valeurs pour fromDegrees, toDegrees, pivotX et pivotY? J'ai un cas d'utilisation où il n'est pas possible de changer la rotation dans le fichier de mise en page.
Patrick Brennan
82
<TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="▼"/>

Vous pouvez obtenir ici plus d'options.

Elhanan Mishraky
la source
3
Comment mettez-vous cette valeur en XML?
user531069
2
Copiez ce TextView et collez-le dans votre xml
Elhanan Mishraky
6
@ user531069: mettez ceci sur votre strings.xml:<string name="bottom_arrow">&#9660;</string>
1
Je veux une flèche différente du lien, je copie et colle & # 129032; sous forme de texte, il montre un caractère inconnu. ?
M. Usman Khan
2
Cette solution crée un nouveau problème de gestion du remplissage des polices dans la vue de texte.
Salman Khakwani
59

Vous pouvez utiliser vectorpour faire un triangle comme celui-ci

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>

Ensuite, utilisez-le comme

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

Pour changer la couleur et la direction, utilisez android:tintetandroid: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
    />

Résultat

entrez la description de l'image ici

Pour changer la forme du vecteur, vous pouvez changer la largeur / hauteur du vecteur. Exemple de changement de largeur à 10dp

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

entrez la description de l'image ici

Phan Van Linh
la source
merci, je ne sais pas vraiment comment fonctionnent ces vecteurs. J'avais besoin du résultat
Hossein Shahdoost
comment puis-je augmenter et diminuer la taille de ces triangles? En spécifiant la hauteur et la largeur, cela ne fonctionne pas
Aayushi
46

Vous pouvez utiliser des dessins vectoriels .

Si votre API minimale est inférieure à 21, Android Studio crée automatiquement des bitmaps PNG pour ces versions inférieures au moment de la construction (voir Vector Asset Studio ). Si vous utilisez la bibliothèque de support, Android gère même les "vrais vecteurs" jusqu'à l'API 7 (plus à ce sujet dans la mise à jour de cet article en bas).

Un triangle rouge pointant vers le haut serait:

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

Ajoutez-le à votre mise en page et n'oubliez pas de définir clipChildren = "false" si vous faites pivoter le triangle.

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

entrez la description de l'image ici

Modifiez la taille (largeur / hauteur) du triangle en définissant les attributs Views layout_width / layout_height. De cette façon, vous pouvez également obtenir un triagle eqilatéral si vous faites le calcul correctement.

MISE À JOUR 25.11.2017

Si vous utilisez la bibliothèque de support, vous pouvez utiliser des vecteurs réels (à la place de la création de bitmap) aussi loin que l'API 7 . Ajoutez simplement:

vectorDrawables.useSupportLibrary = true

faites votre defaultConfigdans build.gradle de votre module.

Ensuite, définissez le dessinable (vector xml) comme ceci:

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

Tout est très bien documenté sur la page de Vector Asset Studio .

Depuis cette fonctionnalité, je travaille entièrement sans bitmaps en termes d'icônes. Cela réduit également un peu la taille de l'APK.

Oliver Metz
la source
1
poster un lien et quelqu'un le mettra en ligne pour vous :-)
GabrielOshiro
1
+1 vectorDrawables.useSupportLibrary = trueprésente l'avantage supplémentaire que vous pouvez utiliser les couleurs définies dans colors.xml, car les bitmaps sont créés pendant la construction (lorsque les couleurs définies ne sont pas disponibles).
Rob
39

J'irais certainement pour implémenter une vue dans ce cas:

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

Utilisez-le dans vos mises en page comme suit:

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

L'utilisation de cette implémentation vous donnera le résultat suivant:

entrez la description de l'image ici

Peter
la source
<com.your.path.to.view.TriangleShapeView ... />
travaillé
c'est super. comment puis-je changer la couleur du triangle. dire que la couleur initiale est grise mais passe au rouge sur onTouch ou onClick?
Fshamri
C'est bien meilleur que le hack en xml
dorsz
@Peter Salut. pouvez-vous m'aider avec une petite amélioration? J'ai besoin que le coin supérieur droit soit arrondi. comment puis-je y parvenir?
Barterio
1
Comment ajouter du texte à l'intérieur du triangle?
Sakiboy
38

La solution de Jacek Milewski fonctionne pour moi et, sur la base de sa solution, si vous avez besoin d'un triangle inversé, vous pouvez utiliser ceci:

<?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
la source
-1 De cette façon, vous ne pouvez pas obtenir de triangle équilatéral. Et de toute façon, il y a beaucoup de problèmes potentiels, c'est-à-dire. stackoverflow.com/questions/20805826/…
j_kubik
21

Voir la réponse ici: Flèches personnalisées sans image: 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>

La Flèche

zed
la source
11

Puis-je vous aider sans utiliser XML?


Simplement,

Disposition personnalisée (tranche):

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

Votre activité (exemple):

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

Exemple de travail:

entrez la description de l'image ici


Une autre Calculatefonction absolument simple qui pourrait vous intéresser.

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
la source
11
+1 Oui, vous pouvez. Et merci. Il y a d'autres personnes en plus d'OP qui recherchent une solution qui ne demandent pas spécifiquement XML - comme je le suis
johndodo
1
onDraw ne sera pas appelé sur les classes qui dérivent de ViewGroup, pas par défaut. Vous devez soit activer le dessin par setWillNotDraw (false) ou hériter d'une vue à la place.
Blago
11

Utilisation de vector 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>

entrez la description de l'image ici

Zygi
la source
L'utilisation Let zà la fin a résolu mon problème, merci!
oxied
6

Pour ceux qui veulent une flèche triangulaire droite, c'est parti:

ÉTAPE 1: Créez un fichier XML dessinable, copiez et collez le contenu XML suivant dans votre XML dessinable. (Veuillez noter que vous pouvez utiliser n'importe quel nom pour votre fichier XML pouvant être dessiné. Pour mon cas, je le nomme "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>

ÉTAPE 2: Dans le XML de votre mise en page, créez une vue et liez son arrière-plan au XML dessinable que vous venez de créer à l' ÉTAPE 1 . Dans mon cas, je lie v_right_arrow à la propriété d'arrière-plan de ma vue.

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

Exemple de sortie:

entrez la description de l'image ici

En espérant que ça aide, bonne chance!

Chong Chern Dong
la source
6

Vous pouvez ajouter le triangle suivant en arrière-plan en utilisant le xml suivant

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

Toute la logique de personnalisation de la conception xml est dans pathData. Considérez en haut à gauche comme (0,0) et concevez la mise en page selon vos besoins. Vérifiez cette réponse.

Sanjay Sharma
la source
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
la source
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
la source
3

Je n'ai jamais fait cela, mais d'après ce que j'ai compris, vous pouvez utiliser la classe PathShape: http://developer.android.com/reference/android/graphics/drawable/shapes/PathShape.html

Justin
la source
2
Comment utiliser la forme de chemin en XML?
Sebastian Roth
Cela a été utile pour trouver la bonne pièce à utiliser, mais n'offre pas suffisamment d'explications sur la façon de l'utiliser. Merci quand même.
Navarr
Désolé Sebastian et Navarr ... J'ai indiqué dans ma réponse que je ne l'ai jamais utilisé, donc je ne sais pas comment m'en servir. Cela semble être la classe qui ferait le travail. Je suis d'accord cependant qu'il n'y a pas assez de documentation pour cela.
Justin
3
PathShape ne semble pas avoir de syntaxe XML associée. La balise XML Shape ne prend en charge que le rectangle, l'ovale, la ligne et l'anneau. developer.android.com/guide/topics/resources/…
Nilzor
3

Je suis en retard pour faire la fête et j'ai rencontré le même problème et Google m'a indiqué ce fil StackOverflow comme premier résultat.

J'ai essayé d'utiliser la méthode xml pour ajouter un triangle et découvrir un problème selon lequel la forme du triangle via l'approche xml prend plus de place qu'il n'y paraît.

Voir la capture d'écran avec les limites de mise en page activées

entrez la description de l'image ici

Alors fini par créer cette classe de vue personnalisée qui peut dessiner Triangle de l'un des types suivants: -

  1. pointant vers le haut
  2. pointant vers le bas
  3. pointant vers la gauche &
  4. pointant vers la droite

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

Vous pouvez simplement l'utiliser dans une mise en page XML comme celle-ci

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

Je sais que OP veut des solutions en solution xml, mais comme je l'ai souligné, un problème avec l'approche xml. J'espère que cela pourrait aider quelqu'un.

Hitesh Sahu
la source
2

En utilisant la solution de Jacek Milewski, j'ai fait un angle orienté vers le bas avec un fond transparent.

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

Vous pouvez modifier android:pivotXet android:pivotYdécaler l'angle.

Usage:

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

entrez la description de l'image ici

Les paramètres dépendent de la taille de l'image. Par exemple, si la ImageViewtaille est de 100dp * 80dp, vous devez utiliser ces constantes:

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

entrez la description de l'image ici

CoolMind
la source
2

J'essaie de créer une image triangulaire comme le bouton de retour de la barre de navigation Android mais je n'ai trouvé aucune solution.

Maintenant, j'ai trouvé la solution avec moi-même et j'aimerais la partager.

barre de navigation triangle android

utilisez xml ci-dessous

<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
la source
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
la source
-1 De cette façon, vous ne pouvez pas obtenir de triangle équilatéral. Et de toute façon, il y a beaucoup de problèmes potentiels, c'est-à-dire. stackoverflow.com/questions/20805826/…
j_kubik
0

Google fournit un triangle équilatéral ici .
Choisissez VectorDrawable pour que la taille soit flexible.
Il est intégré dans Android Studio en tant que plugin.

Si vous avez une image SVG, vous pouvez utiliser ce pour le convertir en VectorDrawable aussi.

Une fois que vous avez un VectorDrawable, changer sa couleur et sa rotation est facile comme d'autres l'ont mentionné.

Ericn
la source