Кнопки Android не отображаются поверх SurfaceView

Таким образом, в Activity у меня есть SurfaceView, который я использую как холст для рисования, и 2 макета для обеспечения функции пользовательского интерфейса. Есть кнопки, удерживающие LinearLayout, и RelativeLayout, который я использую позже (он УДАЛЕН с самого начала и называется VISIBLE позже).

Теперь строка кнопки не отображается правильно на экране. Все кнопки размыты, как если бы они оказались в ловушке за холстом. Я попытался установить альфа с:

 button.getBackground().setAlpha(255);

Я попытался сделать SurfaceView прозрачным, как и то, как сделать SurfaceView прозрачным, но ни один из них не сработал.

Интересно, что если я установлю фон кнопок на #ff000000 (как можно видеть на некоторых кнопках ниже, тестировал несколько идей), то он кажется полностью черным в верхней части холста, хотя, очевидно, теперь он потерял свою форму кнопки что не то, что я хочу!

Вот макет:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TopLevelView"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<!--  Drawing Surface -->
<stu.test.project.DrawingSurface
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/drawingSurface"/>

<!--  Button Row -->
<LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:id="@+id/ButtonRow">
        <!--  START BUTTON -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Start"
            android:visibility="gone"
            android:id="@+id/startDrawingButtonId"/>
        <!--  FINISH BUTTON -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Finish"
            android:visibility="gone"
            android:id="@+id/finishButtonId"/>
        <!--  RESET BUTTON -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#ff000000"
            android:text="Restart"
            android:visibility="gone"
            android:id="@+id/resetButtonId"/>
        <!--  HOME BUTTON -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Home"
            android:background="#ff000000"
            android:visibility="gone"
            android:id="@+id/homeButtonId"/>
        <!--  RESTART BUTTON -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Restart"
            android:background="#ff000000"
            android:visibility="gone"
            android:id="@+id/restartButtonId"/>
        <!--  SAVE BUTTON -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Save"
            android:background="#ff000000"
            android:visibility="gone"
            android:id="@+id/saveButtonId"/>
        <!--  STATS BUTTON -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Stats"
            android:visibility="gone"
            android:id="@+id/statsButtonId"/>
        <!--  EMAIL BUTTON -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Send email"
            android:visibility="gone"
            android:background="#ff000000"
            android:id="@+id/emailButtonId"/>
        <!--  LOAD BUTTON -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Load another record"
            android:visibility="gone"
            android:background="#ff000000"
            android:id="@+id/loadButtonId"/>
        <!--  MARKS BUTTON -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Add marks"
            android:visibility="gone"
            android:id="@+id/marksButtonId"/>       
</LinearLayout>

<!--  Here is the Marking Scheme Layout -->
<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="gone"
    android:background="@drawable/marks_background"
    android:id="@+id/marksRelativeLayout">
    <!--  Element Title -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:id="@+id/markTitle"
        android:padding="10dp"/>
    <!--  Instructions -->
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="Enter the score"
         android:id="@+id/markDescription"
         android:padding="10dp"
         android:layout_centerHorizontal="true"
         android:layout_below="@id/markTitle"/>
     <!--  Previous Button -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Previous"
        android:id="@+id/previousMarkButton"
        android:layout_below="@id/markDescription"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="10dp"/>
    <!--  Marking Scheme -->
    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="10dp"
        android:layout_below="@id/markDescription"
        android:layout_toRightOf="@id/previousMarkButton"
        android:id="@+id/marksRadioGroup">
        <RadioButton 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0"
            android:id="@+id/radioButton0"/>
        <RadioButton 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="1"
            android:id="@+id/radioButton1"/>
        <RadioButton 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="2"
            android:id="@+id/radioButton2"/>
    </RadioGroup>
    <!-- Next Button -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Next"
        android:id="@+id/nextMarkButton"
        android:layout_below="@id/markDescription"
        android:layout_marginRight="10dp"
        android:layout_toRightOf="@id/marksRadioGroup"/>
    <!--  Done Button -->
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Done"
        android:id="@+id/doneMarkButton"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="10dp"
        android:layout_below="@id/marksRadioGroup"/>
</RelativeLayout>

</FrameLayout>

Вот изображение:Как выглядят кнопкиС LinearLayout, имеющим красный фон

3 ответа

Решение

Ваша проблема связана с изображением по умолчанию, используемым в теме Holo на Android 3.0+; взгляните на эту ссылку, которая является фактическим 9-патчем, используемым в этой теме для кнопки по умолчанию. Заметьте, как сам PNG частично прозрачен? Это означает, что он будет частично отображаться на фоне, независимо от того, какой цвет вы используете под ним. Он был разработан для использования поверх темных фонов, присутствующих в этой теме.

Все кнопки в теме Holo частично прозрачны, даже кнопки в Holo.Light, так что вы получите этот эффект с любым фоном кнопок по умолчанию. Поскольку прозрачность на фоновом изображении, установка альфа Drawable не будет иметь никакого эффекта. Как вы уже обнаружили, вы можете установить фон кнопки на что-то твердое, и это больше не проблема.

Если вам нужна сплошная кнопка, которая по-прежнему сохраняет внешний вид Holo, я бы посоветовал извлечь изображения PNG из связанного источника, который я дал, и изменить 9-патчи, чтобы получить полностью сплошную цветную подложку.

НТН

Если вы хотите, чтобы "Строка кнопок" поверх макета просто добавлялась в LinearLayout:

android:layout_gravity="bottom"

По умолчанию представления добавляются в стеки FrameLayout.

Увидев ваш макет, я также заметил, что все кнопки имеют вид, чтобы УЖЕ. Чтобы проверить, находится ли строка поверх SurfaceView, добавьте фон в строку Button LinearLayout.

SurfaceView.setZOrderOnTop(false), надеюсь, это поможет вам

Другие вопросы по тегам