2013-02-08 7 views
30

Я хочу найти цвет фона макета из моего кода. Есть ли способ найти его? что-то вроде linearLayout.getBackgroundColor()?Получить цвет фона макета

+0

Поскольку фон не может быть цвет, вы можете использовать linearLayout.getBackground(), который даст вы «Drawable». В частности, нет API для получения цвета фона. [Подробнее в документах для просмотра] (http://developer.android.com/reference/android/view/View.html#getBackground%28%29) –

+0

Но мне действительно нужно найти цвет макета. Должен быть какой-то другой путь! или можно получить его из «Drawable»? –

ответ

75

Это может быть выполнено только в API 11+, если ваш фон является сплошным цветом.

  int color = Color.TRANSPARENT; 
      Drawable background = view.getBackground(); 
      if (background instanceof ColorDrawable) 
       color = ((ColorDrawable) background).getColor(); 
+0

Я просто собирался отредактировать свой ответ и сказать, что конкретно это может сработать! Однако я не уверен, почему существует ограничение API 11+? 'ColorDrawable' кажется доступным с API 1, а также view.getBackground(). –

+0

Nevermind. Я вижу, что '.getColor' для ColorDrawable был добавлен в API 11. –

+0

Вы можете преобразовать« Drawable »в« Bitmap »и получить первый пиксель. 'int color = bitmap.getPixel (0, 0);' –

10

ColorDrawable.getColor() будет работать только с уровнем API выше 11, так что вы можете использовать этот код, чтобы поддерживать его от уровня API 1. С помощью отражения ниже уровня API 11.

public static int getBackgroundColor(View view) { 
     Drawable drawable = view.getBackground(); 
     if (drawable instanceof ColorDrawable) { 
      ColorDrawable colorDrawable = (ColorDrawable) drawable; 
      if (Build.VERSION.SDK_INT >= 11) { 
       return colorDrawable.getColor(); 
      } 
      try { 
       Field field = colorDrawable.getClass().getDeclaredField("mState"); 
       field.setAccessible(true); 
       Object object = field.get(colorDrawable); 
       field = object.getClass().getDeclaredField("mUseColor"); 
       field.setAccessible(true); 
       return field.getInt(object); 
      } catch (NoSuchFieldException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
     } 
     return 0; 
    } 
8

Для получить цвет фона макета:

LinearLayout lay = (LinearLayout) findViewById(R.id.lay1); 
ColorDrawable viewColor = (ColorDrawable) lay.getBackground(); 
int colorId = viewColor.getColor(); 

Если это RelativeLayout то просто найти свой идентификатор и использовать там объект вместо LinearLayout.

0

Самый простой способ сделать это:

view.getSolidColor(); 
0

Короткий и простой способ:

int color = ((ColorDrawable)view.getBackground()).getColor(); 
Смежные вопросы