如何创建一个EditText,有圆角而不是默认的矩形角?
EditText
在我看来,它已经有了圆角。
如果你想让它们更全面,你需要:
StateListDrawable
Drawable
有一种比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>
你会得到这样的东西:
根据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的四个角。
试试这个,
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>
<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" />
你会得到这样的输出
谢谢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>
看起来很棒在一个光背景布局..
为了补充其他答案,我发现实现圆角的最简单的解决方案是将以下内容设置为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 < / >强到绘制自定义形状。
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);
它需要库的版本1.1.0。