Пишем код в Android Studio на Kotlin

Писать приложения для Android можно не только в среде разработки Processing, но и в Android Studio. При этом никто не мешает вам использовать язык Kotlin вместо Java.

Эта статья больше подойдёт тем, кто уже использует Android Studio и просто захочет побаловаться Processing.

Для начала нужно установит библиотеку. Я пробовал устанавливать через Gradle стандартным способом, чтобы библиотека подтягивалась через интернет. К сожалению, при таком способе возникала ошибка. Мы пойдём другим путём. Заходим на страницу https://github.com/processing/processing-android/releases и скачиваем файл AndroidMode.zip.

Внутри архива есть файл processing-core.zip, которому следует поменять расширение на jar и поместить в папку libs вашего модуля. Для удобства переключитесь в режим Project, чтобы увидеть эту папку в студии.

Создайте активность обычным способом с помощью мастера. При выборе шаблона укажите на желание использовать Kotlin.

Само рисование происходит на холсте, но нам нужно сначала указать, какой элемент послужит нам холстом. Я выбрал вариант FrameLayout, который поместил в ConstraintLayout.

Файл res/layout/activity_kotlin.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ru.alexanderklimov.helloworld.KotlinActivity">

    <FrameLayout
        android:id="@+id/canvas_container"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </FrameLayout>

</android.support.constraint.ConstraintLayout>

Теперь откроем файл класса активности и напишем код для рисования фигур.

package ru.alexanderklimov.helloworld

import android.graphics.Color
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_kotlin.*
import processing.android.PFragment
import processing.core.PApplet

class KotlinActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_kotlin)

        val myCanvas = object : PApplet() {
            override fun settings() {
                fullScreen()
            }

            override fun setup() {
                // Фон
                background(Color.parseColor("#FF8A80"))
            }

            override fun draw() {
                super.draw()

                // Находим центр
                val centerX = width / 2
                val centerY = height / 2
                stroke(Color.BLACK) // обводка
                fill(Color.MAGENTA) // заливка
                rect((centerX / 2).toFloat(), 100f, 500f, 300f)
                ellipse(centerX.toFloat(), 650f, 500f, 400f)
                rect(100f, 900f, 500f, 300f, 100f)
                stroke(Color.GREEN)
                fill(Color.BLUE)
                triangle(120f, 1600f, 300f, 1300f, 500f, 1600f)
            }
        }

        // Помещаем холст в фрагмент
        val myFragment = PFragment(myCanvas)

        // Выводим фрагмент
        myFragment.setView(canvas_container, this)
    }
}

Холст создаётся на основе PApplet. В функции settings() устанавливаем полноэкранный режим. В функции инициализации setup() устанавливаем фон, а в функции draw() рисуем необходимые фигуры.

Сам холст нужно добавить в фрагмент. Запускаем приложение и видим результат.

Если хотим добавить поддержку касаний экрана, то перепишем код в функции draw():

            override fun draw() {
                if (mousePressed) {
                    ellipse(mouseX.toFloat(), mouseY.toFloat(), 50F, 50F);
                }
            }

При движении пальца по экрану рисуется множество овалов. Результат.

В сети нашёл красивый пример, использующий массив пикселей для рисования красивой картинки.

override fun draw() {
    loadPixels() // Load array
    // loop through all valid coordinates
    for(y in 0..height - 1) {
        for(x in 0..width - 1) {
            // Calculate index
            val index = x + y * width
            // Update pixel at index with a new color
            pixels[index] = Color.rgb(x % 255, y % 255, (x*y) % 255)
        }
    }
    // Render pixels with new colors
    updatePixels()
}

Результат.

results matching ""

    No results matching ""