Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
В графике важную роль играет цвет, который представлен классом Color. Класс Color содержит несколько констант и методов для конвертации и извлечения цветового компонента.
Цвета можно описывать четырьмя числами в формате ARGB, по одному для каждого канала(Alpha, Red, Green, Blue). Каждый из каналов является восьмибитным целым числом и может принимать значения от 0 до 256. Обычно цвет упаковывают в 32-битное целое число. Стоит отметить, что использовать целые числа для цветов эффективнее, чем экземпляры класса Color.
Если все значения RGB-каналов установить равными 0, то получим чёрный цвет, если присвоить значения 255, то получим белый цвет.
Иногда значения указываются не в десятичной форме, а в шестнадцатеричной от 00 до FF, вместо 0 и 255. В этом случае обычно пишут не ARGB, а AARRGGBB. Например, красный цвет в данном формате будет равен FFFF0000 (AA = FF, RR = FF, GG = 00, BB = 00).
Для создания цвета можно использовать статические константы класса Color, например:
int redColor = Color.RED; // красный цвет
Таких констант немного, только для основных цветов.
Получить красную, зелёную и синюю составляющую цвета можно через методы red(), green, blue(). Получить нужный цвет из набора компонентов можно через методы rgb() и argb(), которые вернут вам int-значение цвета.
// Полупрозрачный пурпурный myColor = Color.argb(127, 255, 0, 255);
Метод parseColor() позволяет получить int-значение из шестнадцатеричной формы.
int parsedColor = Color.parseColor("#7FFF0000");
Лучше задавать цвет в ресурсах для большей гибкости. Всегда можно будет поменять в случае необходимости без вмешательства в код программы:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="mycolor">#7fff0033</color>
</resources>
В коде можно обратиться к цвету следующим образом:
color = getResources().getColor(R.color.myColor);
Создадим простейший пример для просмотра цветов.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Spinner
android:id="@+id/color_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Код для активности:
// Если этот код работает, его написал Александр Климов,
// а если нет, то не знаю, кто его писал.
package ru.alexanderklimov.colordemo;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private LinearLayout mBackgroundLinearLayout;
private String[] colors = { "BLUE", "CYAN", "DKGRAY",
"GRAY", "GREEN", "LTGRAY", "MAGENTA", "RED", "TRANSPARENT",
"WHITE", "YELLOW" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBackgroundLinearLayout = findViewById(R.id.linearLayout);
final Spinner colorSpinner = findViewById(R.id.color_spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplicationContext(),
android.R.layout.simple_spinner_item, colors);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
colorSpinner.setAdapter(adapter);
colorSpinner.setSelection(0);
colorSpinner
.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
setBackgroundColor(colorSpinner.getSelectedItem()
.toString());
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
}
private void setBackgroundColor(String strColor) {
Toast.makeText(this, strColor, Toast.LENGTH_SHORT).show();
if (strColor.equalsIgnoreCase("BLACK")) {
mBackgroundLinearLayout.setBackgroundColor(Color.BLACK);
} else if (strColor.equalsIgnoreCase("BLUE")) {
mBackgroundLinearLayout.setBackgroundColor(Color.BLUE);
} else if (strColor.equalsIgnoreCase("CYAN")) {
mBackgroundLinearLayout.setBackgroundColor(Color.CYAN);
} else if (strColor.equalsIgnoreCase("DKGRAY")) {
mBackgroundLinearLayout.setBackgroundColor(Color.DKGRAY);
} else if (strColor.equalsIgnoreCase("GRAY")) {
mBackgroundLinearLayout.setBackgroundColor(Color.GRAY);
} else if (strColor.equalsIgnoreCase("GREEN")) {
mBackgroundLinearLayout.setBackgroundColor(Color.GREEN);
} else if (strColor.equalsIgnoreCase("LTGRAY")) {
mBackgroundLinearLayout.setBackgroundColor(Color.LTGRAY);
} else if (strColor.equalsIgnoreCase("MAGENTA")) {
mBackgroundLinearLayout.setBackgroundColor(Color.MAGENTA);
} else if (strColor.equalsIgnoreCase("RED")) {
mBackgroundLinearLayout.setBackgroundColor(Color.RED);
} else if (strColor.equalsIgnoreCase("TRANSPARENT")) {
mBackgroundLinearLayout.setBackgroundColor(Color.TRANSPARENT);
} else if (strColor.equalsIgnoreCase("WHITE")) {
mBackgroundLinearLayout.setBackgroundColor(Color.WHITE);
} else if (strColor.equalsIgnoreCase("YELLOW")) {
mBackgroundLinearLayout.setBackgroundColor(Color.YELLOW);
}
}
}
Запустив проект, вы можете выбирать из выпадающего списка нужный цвет, чтобы закрасить им фон LinearLayout.
Кроме стандартной цветовой модели RGB используется также Цветовая модель HSV