Создание приложения, которое перебирает все возможные цветовые комбинации RGBA - PullRequest
0 голосов
/ 25 октября 2019

Мне было интересно, как сделать так, чтобы при нажатии на кнопку запускался цикл, который циклически перебирает все возможные комбинации цветов RGBA с использованием генератора случайных чисел. Я пытался сделать это, создав объектный класс, который создает все возможные комбинации и помещает их в ArrayList, который затем случайным образом выбирает одну возможную комбинацию RGBA.

Вот мой код для моей MainActivity

package com.example.safteyprecautions;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
import java.util.Random;

public class MainActivity extends AppCompatActivity
{
    private Random rand1;
    private Random rand2;
    private Random rand3;
    private Random rand4;
    private int r;
    private int g;
    private int b;
    private int a;
    private RGBASelector rgba;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button pressMe = findViewById(R.id.pressMe);
        final LinearLayout layout = findViewById(R.id.LinearLayout);
//        rand1 = new Random(255);
//        rand2 = new Random(255);
//        rand3 = new Random(255);
//        rand4 = new Random(100);
        rgba = new RGBASelector(255, 255, 255, 100);
        pressMe.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {

                r = rgba.getR();
//                g = rgba.getG();
//                b = rgba.getB();
//                a = rgba.getA();
                layout.setBackgroundColor(Color.argb(100, r, 0, 0));
                Toast toast = Toast.makeText(getApplicationContext(), "Let the fun begin!", Toast.LENGTH_SHORT);
                toast.show();
            }
        });
    }
}

Мой класс объектов

package com.example.safteyprecautions;

import java.util.ArrayList;
import java.util.Random;

public class RGBASelector
{
    private int r;
    private int g;
    private int b;
    private int a;
    private int[] RGBAValues;
    private ArrayList <Integer> RGBA;
    private Random rand;

    public RGBASelector(int rRange, int gRange, int bRange, int aRange)
    {
        r = rRange;
        g = gRange;
        b = bRange;
        a = aRange;
        rand = new Random(255);
        RGBAValues = new int[rRange];
        RGBA = new ArrayList <>();
        for (int i = 0; i < r; i++)
        {
            RGBAValues[i] = i;
            RGBA.add(RGBAValues[i]);
        }
    }

//    public void createRGBAValues()
//    {
//        for (int i = 0; i < r; i++)
//        {
//            RGBAValues[i] = i;
//        }
//    }

    public int getR()
    {
        r = rand.nextInt();
        return RGBA.get(r);
    }

    public int getG()
    {
        return g;
    }

    public int getB()
    {
        return b;
    }

    public int getA()
    {
        return a;
    }
}

И мой activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/LinearLayout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/welcome"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Welcome to "
        android:fontFamily="cursive" />

    <Button
        android:id="@+id/pressMe"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="PRESS ME!!!"
        android:fontFamily="cursive" />

</LinearLayout>

1 Ответ

0 голосов
/ 25 октября 2019

Вы можете использовать обработчик для создания цикла событий, в котором вы повторно вызываете метод. и вы можете проверить состояние кнопки, а затем либо обновить, либо нет. Мой в Котлине, но близко. Создано быстрое доказательство концепции. Для моего макета это просто макет ограничения с простым View, который занимает все и кнопку.

class MainActivity : AppCompatActivity() {
var pressed = false
val handler = Handler()
lateinit var task: Runnable

val colors = arrayOf(Color.RED, Color.BLACK,Color.BLUE)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val bg: View = findViewById(R.id.background)
    val button: Button = findViewById(R.id.doThings)

    button.setOnClickListener {
        pressed = !pressed
        if (pressed)
            handler.post(task)
    }

        task= Runnable {
            if (pressed){
                bg.setBackgroundColor(colors[Random.nextInt(colors.size)])

                handler.post(task)
            }
        }
    }
}

Создайте задание, которое, если оно будет активно, выполнит свою работу, и повторно вызовите его самостоятельно.

в обработчике кнопок. установить состояние кнопки и, если она активна, вызвать задачу. Задержки могут быть добавлены, если цвета слишком быстрые.

...