Разделитель теней между фрагментами Android
-
12-12-2019 - |
Вопрос
У меня есть макет, аналогичный приложению ICS Gmail для планшетов (ListFragment
слева, а содержимое справа), и мне было интересно, как можно построить макеты так, чтобы между двумя фрагментами был теневой разделитель (как в приложении Gmail, показанном ниже).
.
Кроме того, поскольку это применимо к этому вопросу, как мне разместить этот красивый маркер треугольника/стрелки в макете активного элемента списка?Я предполагаю, что для реализации этого сам ListView должен лежать выше теневой «слой», но я понятия не имею, как его создать.
Решение
Просто чтобы все знали (поскольку, похоже, информации по этой теме не хватает), это достигается с помощью XML-файла фонового селектора представления отдельных строк списка.Например, это макет главного экрана:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/list_item_selector">
...<!-- Rest of layout goes here -->
</RelativeLayout>
Но волшебство приходит в list_item_selector
:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/list_pressed" />
<item android:state_activated="true" android:drawable="@drawable/list_arrow_activated" />
<item android:drawable="@drawable/list_default" />
</selector>
Определив их как такие рисованные объекты с 9 патчами, вы можете заставить каждый элемент списка вносить свою ширину тени в эту линию в середине, и когда она активирована, этот сегмент тени будет заменен стрелкой.Надеюсь, это кому-то поможет, ведь мне это точно помогло!
Другие советы
Я хочу сделать то же самое, что и вы;создать эффект того, что один фрагмент оказывается «ближе» другого.
Ответ Робогая описывает, как установить «селектор» с белой стрелкой в элементе списка;Попробую более подробно рассказать о тенях.Еще один хороший пример использования селекторов фона можно увидеть в исходном коде приложения Google IO 2011. Получив исходный код, посмотрите на селекторы значков фрагмента_dashboard.xml.
Разделитель теней представляет собой градиент, применяемый к левой стороне изображения.Есть две части;
Сначала сама «тень»:
res/shadow_left.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:angle="0"
android:startColor="#55000000"
android:endColor="#00000000"
/>
</shape>
Затем, чтобы применить его к макету:
макет/my_lower_layer
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<View
android:layout_width="20dp"
android:layout_height="fill_parent"
android:background="@drawable/fragment_shadow_left" />
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
Это нужно сделать с помощью относительного макета (насколько мне известно).Если вы используете линейный макет, вы можете обернуть весь линейный макет внутри относительного макета, а затем добавить его с градиентом.
Обратите внимание, что если вы это сделаете, градиент <View>
должен опуститься ниже <LinearLayout>
;в противном случае градиент будет нарисован под линейным макетом, поэтому вы его не увидите.