Освой Android играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Класс android.graphics.Color

В графике важную роль играет цвет, который представлен классом 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.

Класс Color

Кроме стандартной цветовой модели RGB используется также Цветовая модель HSV

Реклама