以下のように、バルーン描画可能シェイプを作成するにはどうすればよいですか。色を動的に変更することができます。
ここでは、XML
とtriangle
のrectangle
です。描画可能なフォルダー内に保存します。
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>
およびlayout必要な形状の場合。
<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" />
必要に応じてマージンを設定します。
レイアウトに境界線が必要な場合
<?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、または 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>
動的に保ちながらこれを行うためのクリーンで正しい方法は、Viewクラスを拡張することです。
次に、onDrawで次のようにします。
@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.
}
不要な階層化や動的またはクリーンでないコードはありません。ボックスにテキストを追加することもできます。
カスタムビューを作成し、キャンバスでトレイングルを描画する
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);
}
}
結果
使用法
<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" />
利点
三角形の画像と長方形の画像を使用し、上記の形式で数学的に整列させます。カラーフィルターを使用して、その色を動的に変更します。
ベクトルグラフィックス、カスタムカラーを使用して、カスタムビューにそれらを描画することもできます。これは、この問題を解決する別の方法です。
最初に、xml
フォルダー内にdrawable
を1つ作成できます
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>
<item Android:left="5dp" Android:bottom="5dp" Android:top="5dp" >
<shape Android:shape="rectangle">
<solid Android:color="#D8D8D8" />
</shape>
</item>
</layer-list>
さて、これは長方形の形状に必要な境界線を作成します。この長方形の背景をこのようなドロウアブルに割り当てる必要があります
Android:background="@drawable/bg"
bg
は、Drawableフォルダーに保存されたxmlファイル名です
その後、その三角形を長方形オブジェクトの真下に配置する必要があります。
あなたが私の論理を理解したことを願っています