Android 高级自定义小部件

Android 高级自定义小部件,android,android-widget,custom-controls,Android,Android Widget,Custom Controls,我在谷歌上搜索了很多,花了很多时间试图弄清楚如何创建定制的Android UI小部件(代码和xml)。但是有一些限制我不知道如何绕过。因此,我模拟了一个虚构的按钮,并想知道如何实现它 这将对我有很大帮助,我相信我不是唯一一个在创建定制Android小部件时遇到问题的人 如果您选择创建自定义小部件,我建议您从android源代码中查看一个最相似的标准小部件,并对其进行修改关于多色背景,我使用shape drawables在这些方面取得了成功 例如,要定义灰色实体区域,然后是过渡到黑色的渐变和黑色实

我在谷歌上搜索了很多,花了很多时间试图弄清楚如何创建定制的Android UI小部件(代码和xml)。但是有一些限制我不知道如何绕过。因此,我模拟了一个虚构的按钮,并想知道如何实现它

这将对我有很大帮助,我相信我不是唯一一个在创建定制Android小部件时遇到问题的人


如果您选择创建自定义小部件,我建议您从android源代码中查看一个最相似的标准小部件,并对其进行修改

关于多色背景,我使用shape drawables在这些方面取得了成功

例如,要定义灰色实体区域,然后是过渡到黑色的渐变和黑色实体区域:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <corners android:radius="10px" />
        <solid android:color="#FF444444"/>
    </shape>
</item>
<item
    android:left="45dp">
    <shape android:shape="rectangle">
        <gradient
        android:angle="0"
        android:centerX="15%"
        android:startColor="#FF444444"
        android:centerColor="#FF000000"
        android:endColor="#FF000000"
        android:type="linear"/>
    </shape>
</item>
    <item>
    <shape android:shape="rectangle">
        <corners android:radius="10px" />
        <stroke
            android:width="2px"
            android:color="#FF444444" />
        <solid android:color="#00000000"/>
    </shape>
</item>
</layer-list>

这里最酷的是分层的形状(项目)。它应该允许您定义黄色三角形、红色三角形和绿色矩形

上述布局呈现为以下内容:


(图标和文本不是通过上述布局呈现的)

为背景创建一个形状:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle">
   <solid android:color="@color/GREEN"/>
   <stroke
        android:width="2dp"
        android:color="@color/GREEN"/>
</shape>

然后使用层列表创建一个显示图像的形状:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/GREEN"/>
        </shape>
    </item>
    <item
        android:left="15dp"
        android:top="15dp"
        android:right="15dp"
        android:bottom="15dp"
        android:drawable="@drawable/ic_image" />
</layer-list>

最后,您可以在按钮中使用上述形状:

<Button
        android:id="@+id/btnFavorite"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="15dp"
        android:layout_below="@id/btnWorkout"
        android:background="@drawable/selector_main_button"
        android:drawableRight="@drawable/shape_favorite"
        android:gravity="center"
        android:text="@string/favorite"
        android:textSize="@dimen/font_7"
        android:textColor="@color/ORANGE"
        android:textStyle="bold"
        android:onClick="onClick"/>


甚至,应该提到,您可以使用第一个形状作为选择器。

我认为使用一些线性布局和图像按钮是可行的。无需定制widgetsWhat关于从左下到右上的双色背景和圆角?使用,
圆角
确实可行。对于这两种颜色,形状确实支持<代码>渐变< /代码>,但我不确定是否可以使颜色边缘锐利。只有流畅的渐变是可能的,正如我所知道的那样,你是否考虑使用图像而不是绘制一个陡峭的渐变?这就是我通常所做的。但是如何在上面和圆角的模型中有一个类似bg的场景呢?我可以使用“形状”并告诉它有圆角,但我不能有自定义背景(据我所知)和圆角。由于背景从左下到右上,我无法使用“NinePatch”。当我开始修补时,我也在想,这不会那么难,但我目前还不能解决这个问题。你可以在所有者绘制的视图(onDraw)中做任何事情。画布支持常用的绘图原语和“形状”。我也玩过画布。自己绘制UI元素是相当耗时的(弄清楚如何绘制UI元素——web上的大多数教程只包含基本内容)。画一个有四个角的圆形矩形很容易,但是如果你只想要两个角呢???此外,您还遇到了UI度量的问题。最后,使用onDraw对我来说是不可行的。这可能是你了解Canvas和co的唯一机会。只需剪掉另一个圆角即可绘制两个圆角。然而,如果你找到了另一种方法,就接受它吧。“图层列表”不能创建三角形。另一个问题来自上面的模型,我不知道如何创建一个圆形按钮状的框,其中有一个笔划和两种颜色(没有渐变)。如果我在内部视图上设置背景色,它将过度绘制布局圆角。如果我使用两个具有两个不同形状项目的布局,分隔线(实体模型)的厚度将是我希望的两倍(2倍笔划宽度)。我使用两个可绘制工具绘制圆角:一个具有圆角和笔划轮廓,它实际上使用图层列表作为背景。关于三角形,我想我会尝试使用线性渐变(对角线),带有尖锐的过渡。这可能会奏效吗?