Рисование верхней границы формы на Android
Я создаю пользовательский индикатор выполнения (расположенный под WebView
), и то, что я хотел бы сделать, - это линия длиной 1 дк между 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
?
Ответы
Ответ 1
Я потратил некоторое время, пытаясь понять это. Надеюсь, есть лучший способ сделать это, но вот метод, который я использовал, который также является хакерским, но в случае, если это помогает кому-то, я думал, что поделюсь.
Первый элемент в вашем списке слоев должен быть сплошным цветом любого цвета, которым вы хотите быть вашей границей. Следуя за этим, вы должны иметь границу с пометкой на любой стороне, на которой вы хотите, чтобы граница была включена.
Например:
<?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", но в списке слоев это больше смещения.
Ответ 2
Я проходил все связанные темы, но никто не мог решить мою проблему. Но некоторые из них были очень полезны для понимания того, как работают параметры слоя или формы.
Моя проблема заключалась в том, чтобы определить кнопку с линейным градиентом и нарисовать верхнюю и нижнюю строку в разных цветах. В конце концов я взломал это решение. Я сохранил файл 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>
Ответ 3
Вы пытались компенсировать это чем-то вроде этого
http://android.amberfog.com/?p=9
Ответ 4
Мое решение состоит в том, чтобы добавить 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>