Android how to create triangle and rectangle shape programmatically?

前端 未结 7 942
一整个雨季
一整个雨季 2020-11-29 01:15

How can we create ballon drawable shape as below. where we can change the color of it dynamically. \"enter

相关标签:
7条回答
  • 2020-11-29 01:47

    Create custom view and draw traingle with canvas

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

    Result

    Usage

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

    Advantages

    • Change shape according to width and height of view .
    • Highly customization possible.
    • Look cleaner
    0 讨论(0)
  • 2020-11-29 01:52

    Use a triangle image and a rectangular image and mathematically align them in the above mentioned format. Use color filtering to dynamically change its color.

    You can even draw them on a custom view, using vector graphics, using custom colors, and that would be another way of solving this problem.

    0 讨论(0)
  • 2020-11-29 01:54

    If you want a border for your layout

    <?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, or you can create triangle by vector like 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>
    
    0 讨论(0)
  • 2020-11-29 02:01

    Here it is XML for triangle and rectangle. save it inside drawable folder.

    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>
    

    and layout for shape you require.

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

    enter image description here

    set margin according you required.

    Source

    0 讨论(0)
  • 2020-11-29 02:01

    Use Canvas in onDraw method inside custom View class.

    Other way is to use Path class.

    0 讨论(0)
  • 2020-11-29 02:09

    First you can create one xml inside drawable folder

    That xml will be responsible for the border color of rectangle shape

    You can create such border shape with below code

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

    well this will create a required border to rectangle shape, you need to assign background of that rectangle shape with this drawable like this

    android:background="@drawable/bg"
    

    where bg is xml file name which has been saved on drawable folder

    After that you need to put that triangle exactly below to rectangle object.

    I hope you understood my logic

    0 讨论(0)
提交回复
热议问题