Android Draw在EditText,Spinner或Button之上绘制(在屏幕上绘制)

时间:2011-09-12 04:18:45

标签: android android-layout view android-widget

我想要实现的目标是:

enter image description here

正如您所看到的,EdiTtexts中有两个微小的黄色三角形(警告标志)。我读过,通过使用相对布局可以实现这一点,只需让图像与EditText重叠即可。然而,这不是一个选项,因为我正在编写一个库项目,并且无法将用户限制为一种特定的布局类型(例如RelativeLayout)。或者我读过,它可以在视图的onDraw方法中完成。但是,我将无法访问onDraw方法(或者更改为覆盖它的方法)。我可以访问的一件事是Views itslef(如Spinner,EditText)或者它们的包装视图(如LinearLayout等......)。我需要在EditText上设置这个小图标,但通常在Spinner,Button,EditText等视图上设置....

一个想法是简单地获取我想要绘制该警告标志的视图的x / y坐标,但是虽然我能够获得坐标但是我对如何实际绘制而感到很茫然在获得的观点上。

另外需要注意:我正在使用代码从非android layout-xml文件生成布局。这只是到目前为止,我担心基于android-layout-xml的解决方案不是一个选项。此外,我必须能够动态添加/删除这些图像叠加。

如果还有其他问题,请告诉我。

非常感谢你提前和最好的祝福, Ready4Android

修改

我有一个想法,但我不确定如何执行它:我可以确定我的窗口小部件的屏幕坐标(如Spinner,EditText,Button ...)然后我可以绘制那个小警告符号我的画布顶部 - 甚至没有碰到小部件。如果我只是想在屏幕上画画,那么解决起来会更容易吗?应该可以,非?

编辑2 (20.09)

我遵循了superM的建议但是由于Icon被拉伸,我试图在项目中使用位图。事情是:它将图标放在正确的位置(左边缘),但按钮的皮肤消失 - 我猜是因为它被位图取代...

这是原始按钮:

enter image description here

这里是Xml(不可见的形状与superM的帖子相同):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/sign_warning_overlay_shape"
        android:top="5dip" android:right="5dip" android:bottom="5dip"
        android:left="5dip" />
    <item>
        <bitmap android:src="@drawable/sign_warning" android:gravity="left" />
    </item>
</layer-list>

这就是它的样子:

enter image description here

使用superM的原始发布图层列表 - 这一个:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/sign_warning_overlay_shape"
        android:top="5dip" android:right="5dip" android:bottom="5dip"
        android:left="5dip" />
    <item android:drawable="@drawable/sign_warning" android:top="5dip"
        android:right="5dip" android:bottom="5dip" android:left="5dip" />
</layer-list>

Button看起来像这样(这里的图标似乎也取代了按钮皮肤):

enter image description here

可能是,我以错误的方式设置图层列表?在按钮上设置图层列表的正确代码是什么?我正在使用这个:

button.setBackgroundResource(R.drawable.sign_warning_overlay_layer_list);

编辑3 - 修改后的解决方案

此编辑基于已接受的答案 - 我决定使用嵌入项目中的位图,因为我遇到了图像被拉伸的问题 - 这是layer_list:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:drawable/btn_default"
        android:top="5dip" android:right="5dip" android:bottom="5dip"
        android:left="5dip" />
    <item>
        <bitmap android:src="@drawable/sign_warning" android:gravity="left" />
    </item>
</layer-list>

可以在按钮上设置如下:     button.setBackgroundDrawable(button.getResources()。getDrawable(R.drawable.layer_list));

并产生以下结果:

enter image description here

那就是人们:)!

感谢所有建议&amp;欢呼声,

Ready4Android

4 个答案:

答案 0 :(得分:2)

在您提及的情况下,我认为通过设置android:drawableLeft可以轻松完成您想要的工作。

答案 1 :(得分:1)

对于editText,它是editText.setCompoundDrawables(左,上,右,下),其中left,top,right和bottom是drawables或null。对于按钮,您可以使用图层列表和形状将图像设置为背景,其中第一层是透明的,应该“包裹”您的按钮,第二层是图像。这也可以通过其他视图完成。

以下是具有透明背景的图层列表示例:

<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@android:drawable/btn_default" <!--any default background from android:drawable-->
        android:top="5dip"
        android:right="5dip"
        android:bottom="5dip"
        android:left="5dip" />
    <item
        android:drawable="@drawable/my_drawable"
        android:top="0dip"
        android:right="0dip"
        android:bottom="0dip"
        android:left="0dip" />
</layer-list>

其中background_transparent是:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid 
        android:color="@android:color/transparent"/>
    <padding 
        android:top="0dip"
        android:left="3dip" 
        android:bottom="5dip"
        android:right="3dip" />
    <corners 
        android:radius="4dip" /> 
</shape>

答案 2 :(得分:0)

按钮:

只需设置文字

即可
  • 使用代码:

    button.setText("<img src=\"image_location\"/>Login");
    
  • 使用xml:

    android:text="@string/mystring"
    //mystring must be a string in strings.xml
    //with a value of <img src="image_location"/>Login
    

EditTexts:

你的问题不清楚100%...

如果您希望图像位于文本后面,那么实现此目的的最佳方法是将左侧的图像设置为背景,并使其成为扩展空白区域的9patch图像。

如果您希望图像在输入文本的情况下向右移动,那么您有几种方法可以实现它,一种简单的方法是使用一个监听器来输入文本,并始终确保在文末。我没有测试过这种方法,但我猜它工作正常。

答案 3 :(得分:0)

如果您确实需要能够对任何内容放置任意视图,可以查看PopupWindow并使用View.getLocationInWindow获取要叠加的视图的坐标。您可以查看一个Android标准用法,在TextView.setError

中将一个小错误标记浮动在textview上