Форма наложения с возможностью рисования для Android

#android #android-layout #android-drawable #layer-list

#Android #android-макет #android-drawable #список слоев

Вопрос:

Я пытаюсь создать элемент управления формой наложения, который в основном будет иметь сплошную БЕЛУЮ рамку вверху, а затем оставшийся сегмент экрана будет иметь градиент от сплошного белого до полупрозрачного белого. Мы используем это для наложения на фоновое изображение, чтобы создать сплошную белую область сверху, а затем переходящую в фоновое изображение снизу.

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

     <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item>
            <shape xmlns:android="http://schemas.android.com/apk/res/android"
                android:shape="rectangle">
                <gradient
                    android:angle="270"
                    android:startColor="#ffffffff"
                    android:centerColor="#00ffffff"
                    android:endColor="#00ffffff"
                    android:centerY="0.6"
                    android:type="linear" />
            </shape>
        </item>
        <item>
            <shape xmlns:android="http://schemas.android.com/apk/res/android"
                android:shape="rectangle">
                <gradient
                    android:startColor="#ffffffff"
                    android:centerColor="#ffffffff"
                    android:endColor="#00ffffff"
                    android:centerY="-0.17"
                    android:gradientRadius="100%p"
                    android:type="radial" />
            </shape>
        </item>
    </layer-list>
  

Который создает отображение, подобное этому:

введите описание изображения здесь

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

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

     <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item >
        <shape
            android:shape="rectangle">
            <size android:height="100dp" />
            <solid android:color="#ffffffff"/>
        </shape>
    </item>
    <item android:top="100dp" >
        <shape
            android:shape="rectangle">
            <gradient
                android:angle="270"
                android:startColor="#ffffffff"
                android:centerColor="#00ffffff"
                android:endColor="#00ffffff"
                android:type="linear" />
        </shape>
    </item>
    <item android:top="100dp" >
        <shape
            android:shape="rectangle">
            <gradient
                android:startColor="#ffffffff"
                android:centerColor="#ffffffff"
                android:endColor="#00ffffff"
                android:centerY="-0.17"
                android:gradientRadius="100%p"
                android:type="radial" />
        </shape>
    </item>
</layer-list>
  

Кто-нибудь может сказать мне, что я делаю не так, или дать мне лучший способ сделать это.

Просто для получения дополнительной информации. Фактическое изображение применяется к фону базового представления LinearLayout. Затем другой вид накладывается поверх базового вида с этим набором для рисования в качестве фона на его LinearLayout, поэтому он действует как наложенная маска поверх фонового изображения.

Я ценю любую помощь, которую я могу получить по этому вопросу.

Комментарии:

1. Можете ли вы добавить два дочерних элемента линейных макетов к одному относительному родительскому макету. Должен ли верхний линейный макет иметь белый фон, а нижний — градиент? Я не совсем уверен, что правильно следую.

2. Спасибо ApolloSoftware, я изначально не хотел этого делать, поскольку этот дисплей используется на нескольких разных экранах в моем приложении, поэтому я надеялся сделать это в одном месте, например, в drawable. Но, взяв вашу идею, я смог найти, где я мог бы сделать это в базовом представлении макета, поэтому в настоящее время я думаю, что у меня все работает так, как мне нужно. Если я не получу никаких лучших ответов или информации, я постараюсь отметить ваш ответ как ответ.

3. Круто, я добавлю это в качестве ответа. Желаю удачи с этим. Я понимаю, о чем вы говорите. Поскольку у вас разные ориентации portriat / landscape, более высокие dpi и более высокое разрешение. макеты, получение их на всех устройствах — это боль!, это выйдет из-под контроля для всех типов устройств. Что отстойно в Android по сравнению с ios, автозапуск в iOS многое делает для вас, меньше настроек, но гораздо проще учитывать множество разных устройств с разными размерами! Один из компромиссов.

4. Хммм, я тут подумал. Не могли бы вы поместить логотип вашей компании в виде одного файла PNG с белым фоном и использовать вид изображения, определяющий его с помощью android:layout_width=»fill_parent» android:layout_height =»fill_parent» android: ориентация = «по вертикали». Я думаю, что вертикальная ориентация может помочь. Используйте относительный макет в качестве родительского, затем установите цвет фона вашего дочернего элемента LinearLayout как белый. Затем в следующем дочернем элементе LinearLayout вы размещаете остальные свои виджеты и т. Д. И добавляете свой градиент в качестве фона дочернего элемента. Не уверен, что это будет по-другому, но, возможно, стоит попробовать.

Ответ №1:

Вы можете добавить два дочерних линейных макета к одному относительному родительскому макету. Пусть верхний линейный макет будет иметь белый фон, а нижний — градиент.