Czy istnieje sposób, aby stworzyć EditText
zaokrąglone rogi?
284
Czy istnieje sposób, aby stworzyć EditText
zaokrąglone rogi?
Jest łatwiejszy sposób niż ten napisany przez CommonsWare. Po prostu utwórz zasób do rysowania, który określa sposób EditText
rysowania:
<?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>
Następnie po prostu odwołaj się do tego rysunku w swoim układzie:
<?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>
Otrzymasz coś takiego:
Na podstawie komentarza Marka chcę dodać sposób, w jaki możesz tworzyć różne stany dla 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>
Oto stany:
<?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>
A teraz EditText
powinno wyglądać następująco:
<?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>
EditText
ma inne tła dla skupionego, wyłączonego, wciśniętego i zaznaczonego, poza domyślnym. W szczególności skupienie się może być ważne w przyszłości, jeśli otrzymamy urządzenia z Androidem bez ekranów dotykowych, takie jak Google TV.android:radius
zamiast definiować 4 linieOto to samo rozwiązanie (z dodatkowym kodem bonusowym) w jednym pliku 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>
Następnie wystarczy ustawić atrybut tła na plik edittext_rounded_corners.xml:
<EditText android:id="@+id/editText_name" android:background="@drawable/edittext_rounded_corners"/>
źródło
topRightRadius
itopLeftRadius
wszystkie cztery rogi są zaokrąglone. Proszę pomóż. :(Spróbuj tego,
Utwórz
rounded_edittext.xml
plik w swoim Drawable<?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>
Zastosuj tło do
EditText
pliku w formacie XML<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" />
Otrzymasz takie wyniki
źródło
Dzięki za odpowiedź Norfeldta. Lekko zmieniłem jego gradient, aby uzyskać lepszy efekt wewnętrznego cienia.
<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>
Wygląda świetnie na jasnym tle.
źródło
Według mnie ma już zaokrąglone rogi.
Jeśli chcesz, aby były bardziej zaokrąglone, musisz:
EditText
tło (znalezione w Twoim SDK)StateListDrawable
zasób XML, który łączy teEditText
tła w jednoDrawable
i zmodyfikuj go, aby wskazywał na bardziej zaokrąglone pliki PNG z dziewięcioma łatamiStateListDrawable
jako tła dla swojegoEditText
widżetuźródło
Biblioteka komponentów materiałów
MaterialShapeDrawable
umożliwia rysowanie niestandardowych kształtów .Za pomocą
EditText
możesz:<EditText android:id="@+id/edittext" ../>
Następnie utwórz
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);
Wymaga wersji 1.1.0 biblioteki.
źródło
Jeśli chcesz, aby tylko róg był zakrzywiony, a nie cały koniec, użyj poniższego kodu.
<?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>
Zakrzywi tylko cztery kąty
EditText
.źródło
Aby dodać do innych odpowiedzi, stwierdziłem, że najprostszym rozwiązaniem, aby uzyskać zaokrąglone rogi, było ustawienie następującego tła jako tła dla twojego 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>
źródło