Рисование верхней границы формы на Android

Я создаю пользовательский индикатор выполнения (позиционируется под WebView ), и то, что я хотел бы сделать, – это линия шириной 1 WebView между WebView и ProgressBar . Я изменяю существующий drawable, а именно progress_horizontal.xml , и пробовал что-то вроде этого:

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> (...) <item> <shape android:shape="line"> <stroke android:width="1dp" android:color="#FF000000" /> </shape> </item> </layer-list> 

Однако эта линия вертикально центрирована, но я хочу, чтобы она была нарисована поверх извлекаемой. Единственная идея, которую я мог придумать, – использовать этот «хакерский» градиент ниже:

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> (...) <item> <shape> <gradient android:startColor="#FF000000" android:centerColor="#00000000" android:centerY="0.01" android:endColor="#00000000" android:angle="270" /> </shape> </item> </layer-list> 

Есть ли у вас лучшие идеи, как рисовать одну линию, выровненную до вершины выталкиваемой, определенной layer-list ?

Solutions Collecting From Web of "Рисование верхней границы формы на Android"

Я потратил некоторое время, пытаясь понять это. Надеюсь, есть лучший способ сделать это, но вот метод, который я использовал, который также является хакерским, но на случай, если он кому-то поможет, я думал, что поделюсь.

Первый элемент в вашем списке слоев должен быть сплошным цветом любого цвета, который вы хотите быть вашей границей. После этого будет (-ы), что вы хотите иметь границу, с заполнением на любой стороне, на которой вы хотите, чтобы граница была включена.

Например:

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <solid android:color="YOUR BORDER COLOR" /> </shape> </item> <item android:top="YOUR TOP BORDER THICKNESS"> THE THING YOU WANT A BORDER ON </item> </layer-list> 

Идея состоит в том, что прокладка на предмет показывает твердую форму позади нее, придавая внешний вид границы. Вы можете добавить дополнение к любой стороне, чтобы добавить границу. Я думаю, вы могли бы стать более сложными и иметь разные цветные границы таким образом.

Кажется, что это взломать, но это сработало для меня.

EDIT: Я сказал «padding», но в списках слоев это скорее смещение.

Я проходил все связанные темы, но никто не мог решить мою проблему. Но некоторые из них были очень полезны для понимания того, как работают параметры слоя или формы.

Моя проблема заключалась в том, чтобы определить кнопку с линейным градиентом и нарисовать верхнюю и нижнюю линию в разных цветах. В конце концов я взломал это решение. Я сохранил файл unter res / drawable / blue_btn.xml

  <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" > <shape android:shape="rectangle"> <solid android:color="@color/blue_end" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> <stroke android:width="1dp" android:color="@color/bottomline_btn" /> </shape> </item> <item> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <solid android:color="@color/blue" /> <gradient android:startColor="@color/blue" android:endColor="@color/blue_end" android:angle="270" /> </shape> </item> <item android:top="0dp" android:bottom="-1dp" android:left="-1dp" android:right="-1dp"> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/topline_btn" /> <solid android:color="#00000000" /> <corners android:radius="0dp" /> </shape> </item> <item android:top="-1dp" android:bottom="0dp" android:left="-1dp" android:right="-1dp"> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/bottomline_btn" /> <solid android:color="#00000000" /> <corners android:radius="0dp" /> </shape> </item> </layer-list> </item> </selector> <color name="topline_btn">#31ffffff</color> <color name="bottomline_btn">#31000000</color> <color name="blue">#449def</color> <color name="blue_end">#2f6699</color> 1  <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" > <shape android:shape="rectangle"> <solid android:color="@color/blue_end" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> <stroke android:width="1dp" android:color="@color/bottomline_btn" /> </shape> </item> <item> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <solid android:color="@color/blue" /> <gradient android:startColor="@color/blue" android:endColor="@color/blue_end" android:angle="270" /> </shape> </item> <item android:top="0dp" android:bottom="-1dp" android:left="-1dp" android:right="-1dp"> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/topline_btn" /> <solid android:color="#00000000" /> <corners android:radius="0dp" /> </shape> </item> <item android:top="-1dp" android:bottom="0dp" android:left="-1dp" android:right="-1dp"> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/bottomline_btn" /> <solid android:color="#00000000" /> <corners android:radius="0dp" /> </shape> </item> </layer-list> </item> </selector> <color name="topline_btn">#31ffffff</color> <color name="bottomline_btn">#31000000</color> <color name="blue">#449def</color> <color name="blue_end">#2f6699</color> 1  <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" > <shape android:shape="rectangle"> <solid android:color="@color/blue_end" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> <stroke android:width="1dp" android:color="@color/bottomline_btn" /> </shape> </item> <item> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <solid android:color="@color/blue" /> <gradient android:startColor="@color/blue" android:endColor="@color/blue_end" android:angle="270" /> </shape> </item> <item android:top="0dp" android:bottom="-1dp" android:left="-1dp" android:right="-1dp"> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/topline_btn" /> <solid android:color="#00000000" /> <corners android:radius="0dp" /> </shape> </item> <item android:top="-1dp" android:bottom="0dp" android:left="-1dp" android:right="-1dp"> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/bottomline_btn" /> <solid android:color="#00000000" /> <corners android:radius="0dp" /> </shape> </item> </layer-list> </item> </selector> <color name="topline_btn">#31ffffff</color> <color name="bottomline_btn">#31000000</color> <color name="blue">#449def</color> <color name="blue_end">#2f6699</color> 1  <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_pressed="true" > <shape android:shape="rectangle"> <solid android:color="@color/blue_end" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> <stroke android:width="1dp" android:color="@color/bottomline_btn" /> </shape> </item> <item> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape android:shape="rectangle"> <solid android:color="@color/blue" /> <gradient android:startColor="@color/blue" android:endColor="@color/blue_end" android:angle="270" /> </shape> </item> <item android:top="0dp" android:bottom="-1dp" android:left="-1dp" android:right="-1dp"> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/topline_btn" /> <solid android:color="#00000000" /> <corners android:radius="0dp" /> </shape> </item> <item android:top="-1dp" android:bottom="0dp" android:left="-1dp" android:right="-1dp"> <shape android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/bottomline_btn" /> <solid android:color="#00000000" /> <corners android:radius="0dp" /> </shape> </item> </layer-list> </item> </selector> <color name="topline_btn">#31ffffff</color> <color name="bottomline_btn">#31000000</color> <color name="blue">#449def</color> <color name="blue_end">#2f6699</color> 

Вы пытались компенсировать это чем-то вроде этого

http://android.amberfog.com/?p=9

Мое решение состоит в том, чтобы добавить 9-патч в качестве последнего элемента слоя:

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape> <solid android:color="@color/tab_button_active_layer2" /> </shape> </item> <item android:bottom="@dimen/tab_button_active_bottom_bar_width"> <shape> <solid android:color="@color/tab_button_active_layer1" /> </shape> </item> <!-- 9-patch drawable --> <item android:drawable="@drawable/tab_button_border_top"/> </layer-list>