Android Drawable: указать ширину формы в процентах в файле XML?

Я пытаюсь создать простой Drawable, который я хочу установить в качестве фона для представления (используя setBackgroundDrawable). Я просто хочу разделить фон рисуемого на 2 равных прямоугольника (50% - 50%), первый хочу заполнить черным, второй - белым:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/back_color_1">
        <shape android:shape="rectangle">
          <solid android:color="#000000" />
        </shape>
    </item>
    <item android:id="@+id/back_color_2">
        <shape android:shape="rectangle">
          <solid android:color="#FFFFFF" />
        </shape>
    </item>
</layer-list>

Как я могу указать, что каждая фигура должна иметь ширину 50% в файле определения XML с возможностью рисования? Что-то вроде android:width="50%".

(Я работаю над Android 3.0, но думаю, что это общий вопрос Android.)

P.S. Вы можете сделать это в CSS или XAML.


person Alex Vang    schedule 19.05.2011    source источник


Ответы (5)


Вы не можете указать процент. Вам нужно указать для него значение Dimension.

android:width определяется здесь: http://developer.android.com/reference/android/R.attr.html#width :

(выделено мной)

Должно быть значением измерения, представляющим собой число с плавающей запятой, к которому добавляется единица измерения, например "14,5sp". Доступные единицы измерения: px (пиксели), dp (пиксели, не зависящие от плотности), sp (масштабированные пиксели на основе предпочтительного размера шрифта), in (дюймы), mm (миллиметры).

Определение каждого типа параметра см. на странице http://developer.android.com/guide/topics/resources/more-resources.html#Dimension

Вам нужно будет создать свой собственный атрибут (см. styleable) и выполнить расчеты сами в onDraw(...).

См. эти два вопроса и ссылки в них для примеров:

person Aleadam    schedule 19.05.2011

нет истинной процентной настройки, но вы можете приблизиться к ней.

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

единственный известный мне способ разделить что-либо — использовать 2 вида, каждый со своим цветом bg, и каждому присваивается одинаковое положительное значение атрибута android:layout_weight (т.е. 50/50). затем они разделят доступное пространство.

надеюсь это поможет!

person chris    schedule 19.05.2011

android:layout_weight=".20" - лучший способ реализовать в процентах

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
    android:id="@+id/logTextBox"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight=".20"
    android:maxLines="500"
    android:scrollbars="vertical"
    android:singleLine="false"
    android:text="@string/logText" >
</TextView>

</LinearLayout>
person Swapnil Kotwal    schedule 04.03.2013

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

    LayerDrawable bg = (LayerDrawable)getBackground();
    int h = getMeasuredHeight();
    bg.setLayerInset(1, 0, 0, 0, h/2);

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

person Skymt    schedule 11.10.2011

Как заявил swapnil, лучший способ — использовать layout_weight в LinearLayout. Если вы идете горизонтально, установите layout_width на «fill_parent», а затем установите layout_weight на процент, который вы хотите. Начните с чего-то вроде приведенного ниже и поэкспериментируйте со значениями layout_width, чтобы почувствовать это (или добавьте больше представлений, чтобы лучше понять).

<LinearLayout    
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:orientation = "horizontal" >

    <View
      android:layout_width="fill_parent"
      android:layout_height="30dip"
      android:layout_weight="0.5"
      android:background="#aaffaa" />
    <View
      android:layout_width="fill_parent"
      android:layout_height="30dip"
      android:layout_weight="0.5"
      android:background="#aaaaff" />
</LinearLayout>
person ajacian81    schedule 03.07.2013