如何创建圆角EditText ?

如何创建一个EditText,有圆角而不是默认的矩形角?

348285 次浏览

在我看来,它已经有了圆角。

如果你想让它们更全面,你需要:

  1. 克隆构成EditText背景的所有九个补丁的PNG图像(在你的SDK中找到)
  2. 修改每一个都有更圆角
  3. 克隆XML StateListDrawable资源,将这些EditText背景组合成一个单独的Drawable,并将其修改为指向更全面的9个补丁的PNG文件
  4. 使用这个新的StateListDrawable作为你的EditText小部件的背景

有一种比CommonsWare编写的方法更简单的方法。只需创建一个可绘制资源,指定EditText将被绘制的方式:

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


<solid android:color="#FFFFFF" />
<corners
android:bottomRightRadius="15dp"
android:bottomLeftRadius="15dp"
android:topLeftRadius="15dp"
android:topRightRadius="15dp" />
</shape>

然后,在你的布局中引用这个drawable:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">


<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="5dip"
android:background="@drawable/rounded_edittext" />
</LinearLayout>

你会得到这样的东西:

alt text

编辑

根据Mark的评论,我想添加为EditText创建不同状态的方法:

<?xml version="1.0" encoding="utf-8"?>
<!-- res/drawable/rounded_edittext_states.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:state_enabled="true"
android:drawable="@drawable/rounded_focused" />
<item
android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/rounded_focused" />
<item
android:state_enabled="true"
android:drawable="@drawable/rounded_edittext" />
</selector>

这些是状态:

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


<solid android:color="#FFFFFF"/>
<stroke android:width="2dp" android:color="#FF0000" />
<corners
android:bottomRightRadius="15dp"
android:bottomLeftRadius="15dp"
android:topLeftRadius="15dp"
android:topRightRadius="15dp" />
</shape>

和…现在,EditText应该看起来像:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">


<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:background="@drawable/rounded_edittext_states"
android:padding="5dip" />
</LinearLayout>

下面是相同的解决方案(有一些额外的代码),只是在一个XML文件中:

<?xml version="1.0" encoding="utf-8"?>
<!--  res/drawable/edittext_rounded_corners.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">


<item android:state_pressed="true" android:state_focused="true">
<shape>
<solid android:color="#FF8000"/>
<stroke
android:width="2.3dp"
android:color="#FF8000" />
<corners
android:radius="15dp" />
</shape>
</item>


<item android:state_pressed="true" android:state_focused="false">
<shape>
<solid android:color="#FF8000"/>
<stroke
android:width="2.3dp"
android:color="#FF8000" />
<corners
android:radius="15dp" />
</shape>
</item>


<item android:state_pressed="false" android:state_focused="true">
<shape>
<solid android:color="#FFFFFF"/>
<stroke
android:width="2.3dp"
android:color="#FF8000" />
<corners
android:radius="15dp" />
</shape>
</item>


<item android:state_pressed="false" android:state_focused="false">
<shape>
<gradient
android:startColor="#F2F2F2"
android:centerColor="#FFFFFF"
android:endColor="#FFFFFF"
android:angle="270"
/>
<stroke
android:width="0.7dp"
android:color="#BDBDBD" />
<corners
android:radius="15dp" />
</shape>
</item>


<item android:state_enabled="true">
<shape>
<padding
android:left="4dp"
android:top="4dp"
android:right="4dp"
android:bottom="4dp"
/>
</shape>
</item>


</selector>

然后你只需将背景属性设置为edittext_rounded_corners.xml文件:

<EditText  android:id="@+id/editText_name"
android:background="@drawable/edittext_rounded_corners"/>

假如你要的只是弯角而不是整尾,则使用下面的代码。

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


<corners android:radius="10dp" />


<padding
android:bottom="3dp"
android:left="0dp"
android:right="0dp"
android:top="3dp" />


<gradient
android:angle="90"
android:endColor="@color/White"
android:startColor="@color/White" />


<stroke
android:width="1dp"
android:color="@color/Gray" />


</shape>

它只会弯曲EditText的四个角。

试试这个,

  1. 在Drawable中创建rounded_edittext.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" android:padding="15dp">
    
    
    <solid android:color="#FFFFFF" />
    <corners
    android:bottomRightRadius="0dp"
    android:bottomLeftRadius="0dp"
    android:topLeftRadius="0dp"
    android:topRightRadius="0dp" />
    <stroke android:width="1dip" android:color="#f06060" />
    </shape>
    
  2. 在xml文件中为你的EditText应用后台

    <EditText
    android:id="@+id/edit_expiry_date"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:background="@drawable/rounded_edittext"
    android:hint="@string/shop_name"
    android:inputType="text" />
    
  3. 你会得到这样的输出

enter image description here

谢谢Norfeldt的回答。我稍微改变了它的梯度,以获得更好的内阴影效果。

<item android:state_pressed="false" android:state_focused="false">
<shape>
<gradient
android:centerY="0.2"
android:startColor="#D3D3D3"
android:centerColor="#65FFFFFF"
android:endColor="#00FFFFFF"
android:angle="270"
/>
<stroke
android:width="0.7dp"
android:color="#BDBDBD" />
<corners
android:radius="15dp" />
</shape>
</item>

看起来很棒在一个光背景布局..

enter image description here

为了补充其他答案,我发现实现圆角的最简单的解决方案是将以下内容设置为Edittext的背景。

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


<solid android:color="@android:color/white"/>
<corners android:radius="8dp"/>


</shape>

在材质组件库中,你可以使用< >强MaterialShapeDrawable < / >强绘制自定义形状

使用EditText你可以做到:

    <EditText
android:id="@+id/edittext"
../>

然后创建MaterialShapeDrawable:

float radius = getResources().getDimension(R.dimen.default_corner_radius);


EditText editText = findViewById(R.id.edittext);
//Apply the rounded corners
ShapeAppearanceModel shapeAppearanceModel = new ShapeAppearanceModel()
.toBuilder()
.setAllCorners(CornerFamily.ROUNDED,radius)
.build();


MaterialShapeDrawable shapeDrawable =
new MaterialShapeDrawable(shapeAppearanceModel);
//Apply a background color
shapeDrawable.setFillColor(ContextCompat.getColorStateList(this,R.color.white));
//Apply a stroke
shapeDrawable.setStroke(2.0f, ContextCompat.getColor(this,R.color.colorAccent));


ViewCompat.setBackground(editText,shapeDrawable);

enter image description here

它需要库的版本1.1.0