安卓自定义形状

3

我知道可以制作一个类似这样的形状:

enter image description here

但我不知道如何开始。我能把它做成一个形状吗?还是我需要做其他事情?

敬礼


我认为这里最大的问题是:它是用来做什么的?从那里我们可以确定最好的方法来完成这个任务。如果你只需要形状,我会重写视图的ondraw方法,并在相同颜色下绘制椭圆和矩形。这种方法可能存在的一个问题是,如果您想要使用渐变填充,则无法实现。 - Quintin Balsdon
嘿,我将把它用作一些按钮的背景。是的...我会在上面加一个渐变。 - 7heViking
我想用代码创建它,这样我就可以确保它在所有设备上都能保持清晰。 - 7heViking
4个回答

5

哦,看来我错了——渐变不是问题:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.view.View;

public class ButtonShadow extends View {

    public ButtonShadow(Context context)
    {
        super(context);
    }

    @Override
    public void onDraw(Canvas canvas)
    {
        RectF space = new RectF(this.getLeft(), this.getTop(), this.getRight(), this.getBottom());

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        paint.setShader(new LinearGradient(0, getWidth(), 0, 0, Color.BLACK, Color.WHITE, Shader.TileMode.MIRROR));

        canvas.drawArc(space, 180, 360, true, paint);

        Rect rect = new Rect(this.getLeft(),this.getTop() + (this.getHeight() / 2),this.getRight(),this.getBottom());
        canvas.drawRect(rect, paint);
    }
}

想要了解更多关于渐变填充的内容,请看这里:如何在安卓中使用线性渐变来填充路径?


我该如何将这个添加到我的布局中? - 7heViking
当我使用 align_parent_bottom = true 时,视图消失了;我做错了什么? - 7heViking
嗯,不确定 - 可能需要尝试几次才能找到正确的成员来继承 - 如果将“extends View”更改为“extends TextView”,它应该仍然可以正常绘制,也许这样会解决问题。如果不行,请尝试“extends LinearLayout”。 - Quintin Balsdon
感谢某个地方的某人 - 您很快将在邮件中收到您的斗篷和超级英雄卡。当然,这段代码可能只是一个示例,需要开发人员自己动脑筋。 - Quintin Balsdon
我也遇到了同样的问题。我已经创建了一个形状,但无法在布局中使用它。请提供建议。 - Ashish Tiwari

4

请参考此文档,您需要使用图层列表

以下是与您的图片相符的代码:

custom_layer_list.xml

<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/topCircular" />

    <item
        android:drawable="@drawable/rect"
        android:top="20dp" />
</layer-list>

topCircular.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

<solid
    android:color="#000000" />
<corners
    android:topLeftRadius="25dp"
    android:topRightRadius= "25dp" />

</shape>

rect.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

<solid
    android:color="#000000" />

</shape>

这段代码已经在我的端上测试过了,请你在你的端上检查一下。以上三个XML文件都应该放在drawable文件夹中。 - Vineet Shukla
@Vineet Shukla,rect.xml无法工作,但topcircular.xml对于这个问题所要求的形状已经足够了。 - Sagar G.

1

你只能用形状来完成它:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#000000" />
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners  
        android:topLeftRadius="90dip"
        android:topRightRadius="90dip"
        android:bottomLeftRadius="0dip"
        android:bottomRightRadius="0dip" />
</shape>

1

可以这样做……但我不想那样做,这样我就可以确保图像无论在哪种设备上运行都是清晰和锐利的。 - 7heViking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接