Как установить непрозрачность (альфа) для просмотра в Android

У меня есть кнопка, как в следующем:

<Button 
     android:text="Submit" 
     android:id="@+id/Button01" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content">
</Button>

В моем onCreate() Событие, я звоню Button01 так:

setContentView(R.layout.main);

View Button01 = this.findViewById(R.id.Button01);
Button01.setOnClickListener(this);

В приложении есть фон, и я хочу установить непрозрачность для этой кнопки отправки. Как я могу установить непрозрачность для этого представления? Это то, что я могу установить на стороне Java, или я могу установить в файле main.xml?

На стороне Java я пытался Button01.mutate().SetAlpha(100), но это дало мне ошибку.

13 ответов

Решение

Я только что нашел ваш вопрос, когда у меня была похожая проблема с TextView. Я смог решить эту проблему, расширив TextView и переопределив onSetAlpha, Может быть, вы могли бы попробовать что-то подобное с вашей кнопкой:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

public class AlphaTextView extends TextView {

  public AlphaTextView(Context context) {
    super(context);
  }

  public AlphaTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public AlphaTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  @Override
  public boolean onSetAlpha(int alpha) {
    setTextColor(getTextColors().withAlpha(alpha));
    setHintTextColor(getHintTextColors().withAlpha(alpha));
    setLinkTextColor(getLinkTextColors().withAlpha(alpha));
    return true;
  }
}

Я поражен гораздо более сложными ответами всех остальных.

XML

Вы можете очень просто определить альфа в определении цвета кнопки (или любого другого представления) в вашем xml:

android:color="#66FF0000"    // Partially transparent red

В приведенном выше примере цвет будет частично прозрачным красным.

При определении цвета вида формат может быть #RRGGBB или же #AARRGGBB, где AA шестнадцатеричное альфа-значение FF будет полностью непрозрачным и 00 будет полностью прозрачным.

динамично

Если вам нужно динамически изменить прозрачность в вашем коде, используйте

myButton.getBackground().setAlpha(128);  // 50% transparent

Где INT варьируется от 0 (полностью прозрачный) для 255 (полностью непрозрачный).

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

btnMybutton.getBackground().setAlpha(45);

Здесь я установил непрозрачность на 45. Вы можете установить ее от 0(полностью прозрачный) до 255 (полностью непрозрачный).

Гораздо проще из вышесказанного. Для кнопки есть альфа-атрибут по умолчанию

android:alpha="0.5"

Диапазон между 0 для полной прозрачности и 1 для полной непрозрачности.

Я бы посоветовал вам создать собственный цвет ARGB в вашем файле colors.xml, например:

<resources>
<color name="translucent_black">#80000000</color>
</resources>

затем установите цвет фона кнопки:

android:background="@android:color/translucent_black"

Другая вещь, которую вы можете сделать, если вы хотите поиграть с формой кнопки, это создать ресурс рисования Shape, в котором вы устанавливаете свойства, как должна выглядеть кнопка:

файл: res/drawable/rounded_corner_box.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#80000000"
        android:endColor="#80FFFFFF"
        android:angle="45"/>
    <padding android:left="7dp"
        android:top="7dp"
        android:right="7dp"
        android:bottom="7dp" />
    <corners android:radius="8dp" />
</shape>

Затем используйте это как фон кнопки:

    android:background="@drawable/rounded_corner_box"

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

View v;
v.setAlpha(.5f);
android:background="@android:color/transparent"

Это то, что я знаю... Я думаю, что создание пользовательского класса кнопки - лучшая идея

Уровень API 11
Недавно я наткнулся на этот атрибут android: alpha xml, который принимает значение от 0 до 1. Соответствующий метод - setAlpha (float).

Хотя btnMybutton.getBackground().setAlpha(45); это хорошая идея, это просто применить альфа к фону, а не весь вид.

Если вы хотите применить альфа для просмотра использования btnMybutton.setAlpha(0.30f); вместо. Это применить непрозрачность для просмотра. Он принимает значение от 0 до 1.

Док говорит:

Устанавливает непрозрачность вида. Это значение от 0 до 1, где 0 означает, что вид полностью прозрачен, а 1 означает, что вид полностью непрозрачен. Если это представление переопределяет onSetAlpha (int) для возврата true, то это представление отвечает за применение самой прозрачности. В противном случае вызов этого метода эквивалентен вызову setLayerType (int, android.graphics.Paint) и установке аппаратного уровня. Обратите внимание, что установка альфа на полупрозрачное значение (0<альфа <1) может повлиять на производительность. Как правило, лучше использовать свойство alpha экономно и временно, как в случае анимации с замиранием.

Для просмотра вы можете установить прозрачность следующим образом.

view_name.setAlpha(float_value);

Недвижимость view.setAlpha(int) устарела для версии API больше 11. Отныне свойство типа .setAlpha(0.5f) используется.

Если вы используете Kotlin , очень легко установить альфа-версию, подобную этой

      imageView.alpha= 0.5F

где значение должно быть числом с плавающей запятой .

Я столкнулся с этой проблемой с ICS/JB, потому что кнопки по умолчанию для темы Holo состоят из изображений, которые немного прозрачны. Для фона это особенно заметно.

Пряники против ICS+:

Имбирный пряникICS

Копировать все нарисованные состояния и изображения для каждого разрешения и делать прозрачные изображения сплошными, поэтому я выбрал более грязное решение: заверните кнопку в держатель с белым фоном. Вот грубая отрисовка XML (ButtonHolder), которая делает именно это:

Ваш XML-файл

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              style="@style/Content">
  <RelativeLayout style="@style/ButtonHolder">
      <Button android:id="@+id/myButton"
              style="@style/Button"
              android:text="@string/proceed"/>
    </RelativeLayout>
</LinearLayout>

ButtonHolder.xml

<?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="@color/white"/>
    </shape>
  </item>

</layer-list>

styles.xml

.
.
.      
  <style name="ButtonHolder">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:background">@drawable/buttonholder</item>
  </style>

  <style name="Button" parent="@android:style/Widget.Button">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:textStyle">bold</item>
  </style>
.
.
.

Тем не менее, это приводит к появлению белой границы, потому что изображения кнопок Holo включают поля для учета нажатого пространства:

Слишком много белогоСлишком много белого прессованного

Таким образом, решение состоит в том, чтобы дать белому фону поле (4dp сработало для меня) и закругленные углы (2dp), чтобы полностью скрыть белый цвет, но сделать кнопку сплошной:

ButtonHolder.xml

<?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="@android:color/transparent"/>
    </shape>
  </item>

  <item android:top="4dp" android:bottom="4dp" android:left="4dp" android:right="4dp">
    <shape android:shape="rectangle">
      <solid android:color="@color/white"/>
      <corners android:radius="2dp" />
    </shape>
  </item>

</layer-list>

Конечный результат выглядит так:

Нет белогоНет белого нажата

Вы должны нацелиться на этот стиль для v14+, а также настроить или исключить его для Gingerbread/Honeycomb, потому что размеры их собственных кнопок отличаются от ICS и JB (например, этот точный стиль за кнопкой Gingerbread приводит к появлению небольшого белого цвета под кнопкой).

Для API < 11 для цвета textView я сделал следующее:

int textViewColor = textView.getTextColors().getDefaultColor(); 
textView.setTextColor(Color.argb(128, Color.red(textViewColor), Color.green(textViewColor), Color.blue(textViewColor))); //50% transparent

Немного громоздко, но эй, это работает:-)

Я знаю, что на это уже есть куча ответов, но я обнаружил, что для кнопок проще всего создать собственные селекторы.xml и установить их на фоне указанной кнопки. Таким образом, вы также можете изменить его состояние при нажатии или включении и так далее. Вот быстрый фрагмент того, который я использую. Если вы хотите добавить прозрачность к любому из цветов, добавьте начальное шестнадцатеричное значение (#XXcccccc). (XX == "Альфа цвета")

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#70c656" />
            <stroke
                android:width="1dp"
                android:color="#53933f" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#70c656"
                android:endColor="#53933f"
                android:angle="270" />
            <stroke
                android:width="1dp"
                android:color="#53933f" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>
Другие вопросы по тегам