Вход на сайт

Просмотр новости

Найдите то, что Вас интересует

DroidScript. Впечатления от года работы

Дата публикации: 23-10-2026 13:29:47

Хотим поделиться с вами своим небольшим опытом работы с IDE DroidScript, средой разработки под Android, которая была обнаружена на просторах Google Play, как инструмент, с которым можно работать непосредственно на смартфоне, т.к. в первую очередь, появилась необходимость программировать в дороге или просто не дома, например, в электричке или на улице. Ноутбук носить с собой не всегда хочется и "можется" - всё-таки лишняя тяжесть, да и время, пока достанешь и запустишь его, а тем более, прогрузится, например, Android Studio - среда, с которой мы работали ранее, тоже пройдёт не маленькое. Читать далее

Основное содержимое страницы с новостью.

Уровень сложностиПростой

Время на прочтение8 мин

Охват и читатели2.2K

Обзор

Хотим поделиться с вами своим небольшим опытом работы с IDE DroidScript, средой разработки под Android, которая была обнаружена на просторах Google Play, как инструмент, с которым можно работать непосредственно на смартфоне, т.к. в первую очередь, появилась необходимость программировать в дороге или просто не дома, например, в электричке или на улице. Ноутбук носить с собой не всегда хочется и "можется" - всё-таки лишняя тяжесть, да и время, пока достанешь и запустишь его, а тем более, прогрузится, например, Android Studio - среда, с которой мы работали ранее, тоже пройдёт не маленькое.

DroidScript же, как оказалось, запустить дело десяти секунд - взяли смартфон в руки, нашли заветную иконку с зелёным человечком, и практически моментально на экране вашего смартфона список ваших проектов. Выбрали нужный, и уже пишем :) Конечно, сначала у нас были некоторые неудобства, связанные с программированием без клавиатуры, печатать двумя руками на экране было неудобно, но это оказалось просто делом привычки. Плюс, особенно в начале работы, очень выручал браузерный вариант запуска среды разработки на компьютере. Тем более, что работая с DroidScript через браузер на нетбуке с процессором Intel Atom с 1 Гб ОЗУ, всё также быстро работает, как и с более мощными компьютерами, и без каких либо проблем, ведь дополнительных программ на жёсткий диск никаких устанавливать не нужно, вся работа ведётся по сути на вашем смартфоне через, например, Google Chrome, установленным на ПК.

Приложение, которое мы для ознакомления со средой решили написать с помощью DroidScript ("Ватерпас: Росинка" доступно для скачивания в Google Play - о нём мы уже писали ранее) использует встроенные в смартфон акселерометр, датчик освещённости, и магнетометер. Используя DroidScript, оказалось очень удобно разрабатывать такое интерактивное приложение, т.к. моментально можно увидеть результаты на экране своего аппарата - смартфон можно повращать в пространстве, или включить освещение в комнате, значения углов наклона и силы света будут изменяться на экране в реальном времени. Очень похоже на лабораторную работу в институте. Сразу можно видеть свои ошибки, или корректировать используемые в программе коэффициенты. Мы не большие специалисты по программированию, скорее любители, поэтому дорабатывать приложение на ходу, исправляя ошибки, для нас свойственно. 

Сама информация с датчиков считывается очень просто. Достаточно создать две функции, например, для акселерометра:

// Переменные для работы с акселерометром        
sampleCount = 10;                
updateInterval = 10;   

// Функция инициализации акселерометра
function accelerometerInitializing() {
 
    // Определяем датчик и запускаем АЦП
    snsAcc = app.CreateSensor( "Accelerometer", "Fast" );
    snsAcc.Start();
       
    // Запускаем обновление данных с датчика
    Update();
 }
 
 // Функция обновления данных с датчика
function Update() {

    // Считываем данные по трём осям акселерометра
    var vals = snsAcc.GetValues();
    var series = GetSeries( sampleCount, [vals[1],vals[2],vals[3]] );
     
    // Если хотим, выводим данные в ранее созданные текстовые поля
    txt1.SetText( "Axis_X= "  + vals[1] );
    txt2.SetText( "Axis_Y= "  + vals[2] );
    txt3.SetText( "Axis_Z= "  + vals[3] );
    
    // Снова вызываем функцию обновления данных
    setTimeout( Update, updateInterval );
}

Отметим также, что мы занимаемся только нативными приложениями с помощью JavaScript, но если нужно, в DroidScript есть возможность создавать и гибридные приложения, а также использовать Python. Нативные приложения на JS пишутся цельно, когда методы и объекты для создания графического интерфейса соседствуют внутри тела функции с методами обработки информации и вывода на экран. Зато очень удобно, можно скопировать текст всей программы, например, в текстовый файл, а затем в новом проекте скопировать и воссоздать, если потребуется подобный вариант решения задачи без дополнительных действий, связанных с UI.

Ниже приводим текст программы реализации нативного календарика, который создаётся с помощью массива кнопок-ячеек. Решение довольно громоздкое, и профессиональный программист сразу же обратит на это внимание, но тут достаточно строк, чтобы увидеть полноценную программу на DroidScript.

app.LoadPlugin( "UIExtras" );

// Переменные для изменения размеров элементов календаря
var width = 0.13; // ширина ячейки с датой
var height = 0.07; // высота ячейки с датой
var margin = 0; // расстояние между соседними ячейками
var rows = 6; // количество строчек в месяце
var columns = 7; // количество столбиков в месяцн
// Массив для дат текущего месяца
var datesArray = new Array(rows*columns+1);
var currentMonth = "";
var currentDay = new Date();
var btn = new Array(rows*columns+1);

// Массив ячеек-кнопок
var buttons = [];

function OnStart() {

    uix = app.CreateUIExtras();

    // Создаём линейный вертикальный экран
    layDOGanizer = app.CreateLayout( "Linear", "Vertical");

    // И первый линейный горизонтальный слой
    layHoriz = app.CreateLayout( "Linear", "Horizontal");
    layDOGanizer.AddChild( layHoriz );
   
    const today = new Date();
    currentDay = today;
  
    currentMonthDatesPositions( today );    
    
    txtTitle = app.CreateText( currentMonth );
    txtTitle.SetMargins(0.05, 0.05);
    txtTitle.SetTextSize( 20 );
    layHoriz.AddChild(txtTitle);
    
    txtYearTitle = app.CreateText( today.getFullYear() );
    txtYearTitle.SetMargins(0.05, 0.05);
    txtYearTitle.SetTextSize( 20 );
    layHoriz.AddChild(txtYearTitle);
    
    // Цикл для создания ячеек месяца
    for (var row = 0; row < rows; row++) {

       // Horizontal new line
       layHoriz = app.CreateLayout( "Linear", "Horizontal");
       layDOGanizer.AddChild( layHoriz );
    
       // Вертикальные ячейки
       for (var col = 0; col < columns; col++) {
 
             // Вычисление текущего индекса ячейки      
             let index = 1 + row * columns + col;
             
             // Создание кнопки-ячейки и добавление её к массиву
             btn[index] = app.CreateButton(datesArray[index], width, height);
             btn[index].SetTextSize( 11 );
             btn[index].SetMargins(0, margin);
             if ((col==5)||(col==6)) {
                btn[index].SetTextColor("red"); 
             } else {
                btn[index].SetTextColor("black");
             }
             if (datesArray[index]=="") {
                btn[index].SetBackColor("#E3F2FD");      
             } else {
                btn[index].SetBackColor("white"); 
             }
             btn[index].data = { index: index, customInfo: "Date: "+ row + ", " + col }; // Attach custom data
             btn[index].SetOnTouch(GenericButtonCallback);
             buttons.push(btn[index]);
          
             layHoriz.AddChild(btn[index]);
       }
    }
    
    // Новая горизонтальная строка
    layHoriz = app.CreateLayout( "Linear", "Horizontal");
    layDOGanizer.AddChild( layHoriz );
    btnBackMonth = app.CreateButton( "Back Month", 0.2, 0.1 );
    btnBackMonth.SetOnTouch( btnBackMonth_OnTouch );
    layHoriz.AddChild( btnBackMonth );
    
    btnPickDate = app.CreateButton( "Change year and month", 0.3, 0.1 );
    btnPickDate.SetOnTouch( btn_OnTouch );
    layHoriz.AddChild( btnPickDate );
    
    btnNextMonth = app.CreateButton( "Next Month", 0.2, 0.1 );
    btnNextMonth.SetOnTouch( btnNextMonth_OnTouch );
    layHoriz.AddChild( btnNextMonth );
    
    app.AddLayout( layDOGanizer );

}

function currentMonthDatesPositions( theDay ) {
 
    const pastDate = new Date(theDay);
    let dayOfMonth = theDay.getDate();
    let dateCount=0;
   
    currentMonth = monthAsWord(theDay.getMonth());
    let monthMaxDays = defineMonthMaxDays();
   
    for(let icount = 1; icount < rows*columns+1; icount++) {
    
        // Вычисление первого дня месяца
        pastDate.setDate(icount + pastDate.getDate() - dayOfMonth);
    
        //Finding the day of week for the date
        let dayOfWeek = pastDate.getDay();
        if( dayOfWeek == 0 ) {
            dayOfWeek = 7;   
        }
        
        // Когда первая дата
        if(icount==1) {
            
            for(let ifirstCount=0; ifirstCount<dayOfWeek; ifirstCount++) {
                datesArray[ifirstCount]="";
            }
            dateCount=dayOfWeek;
        }

        if(icount<=monthMaxDays) {
            datesArray[dateCount] = icount;
        } else {
            datesArray[dateCount] = "";            
        }
        
        dateCount++;
    }
}

function newMonthDatesAssignment() {
    
   // Снова цикл создания массива календаря
   for (var row = 0; row < rows; row++) {    
    for (var col = 0; col < columns; col++) {
       
        let index = 1 + row * columns + col; // Вычисление индекса Ячейки массиваю
             
        // Создание кнопки ибобавление её  к массиву
        btn[index].SetText(datesArray[index]);
        if ((col==5)||(col==6)) {
            btn[index].SetTextColor("red"); 
        } else {
            btn[index].SetTextColor("black");
        }
        if (datesArray[index]=="") {
            btn[index].SetBackColor("#E3F2FD");      
        } else {
            btn[index].SetBackColor("white"); 
        }

    }
   }
}

function defineMonthMaxDays() {
    
    let maxDays = 0;
    
    switch( currentMonth ) {
        case "Январь":
            maxDays = 31;
            break;
        case "Февраль":
            maxDays = 28;
            break;            
        case "Март":
            maxDays = 31;
            break;            
        case "Апрель":
            maxDays = 30;
            break;
        case "Май":
            maxDays = 31;
            break;            
        case "Июнь":
            maxDays = 30;
            break;            
        case "Июль":
            maxDays = 31;
            break;            
        case "Август":
            maxDays = 31;
            break;            
        case "Сентябрь":
            maxDays = 30;
            break; 
        case "Октябрь":
            maxDays = 31;
            break;            
        case "Ноябрь":
            maxDays = 30;
            break;            
        case "Декабрь":
            maxDays = 31;
            break;        
    }
    
    return maxDays;
            
}

function monthAsWord( monthAsNum ) {

    let monthName = "";

    switch(monthAsNum) {
        case 0:
            monthName = "Январь";
            break;
        case 1:
            monthName = "Февраль";
            break;
        case 2:
            monthName = "Март";
            break;
        case 3:
            monthName = "Апрель";
            break;
        case 4:
            monthName = "Май";
            break;
        case 5:
            monthName = "Июнь";
            break;
        case 6:
            monthName = "Июль";
            break;
        case 7:
            monthName = "Август";
            break;
        case 8:
            monthName = "Сентябрь";
            break;
        case 9:
            monthName = "Октябрь";
            break;
        case 10:
            monthName = "Ноябрь";
            break;
        case 11:
            monthName = "Декабрь";
            break;
    }
    
    return monthName;
}

function btnBackMonth_OnTouch() {
    
    currentDay.setMonth(currentDay.getMonth() - 1);
    currentMonthDatesPositions( currentDay );  
    newMonthDatesAssignment();
    
    // Изменение заголовка месяца
    txtTitle.SetText( currentMonth );
    txtYearTitle.SetText( currentDay.getFullYear() );
}

function btnNextMonth_OnTouch() {
     
    currentDay.setMonth(currentDay.getMonth() + 1);
    currentMonthDatesPositions( currentDay );  
    newMonthDatesAssignment();
    
    // Изменение заголовка месяца
    txtTitle.SetText( currentMonth );
    txtYearTitle.SetText( currentDay.getFullYear() );
}

function btn_OnTouch() {
    picker = uix.CreateDatePickerDialog( "Pick a Date" );
    picker.SetOnOk( picker_OnOk );
 
    picker.Show();
}

function picker_OnOk( year, month, day ) {
    var date = new Date();
    date.setFullYear( year, month, day);
 
    currentDay = date;
    currentMonthDatesPositions( currentDay );  
    newMonthDatesAssignment();
    
    //Set title of Month and Year in the calendar
    txtTitle.SetText( currentMonth );
    txtYearTitle.SetText( currentDay.getFullYear() );
 
    app.ShowPopup( date.toDateString() );
}

// When button of the gameField was pushed
function GenericButtonCallback() {

    app.ShowPopup("Date: " + datesArray[this.data.index]);
     
    calendarRecordWindow();
    
}

function calendarRecordWindow() {
    
        var dlgCalend = app.CreateDialog("Event record");
        var calendarLay = app.CreateLayout("Linear", "VLeft");
        dlgCalend.SetSize( 0.8, 0.5 );
        
        EventType = app.CreateTextEdit( "Whats today: " );
        EventType.SetTextSize( 20 );
        EventTime = app.CreateTextEdit( "In what time: " );
        EventTime.SetTextSize( 20 );
        NotificationReminder = app.CreateTextEdit( "Reminder: " );
        NotificationReminder.SetTextSize( 20 );
        EventDescription = app.CreateTextEdit( "Comment: " );
        EventDescription.SetTextSize( 20 );
        layHoriz = app.CreateLayout( "Linear", "Horizontal");
        
        var eventSaveBtn = app.CreateButton("Save");
        var calendarEventCloseBtn = app.CreateButton("Close");
        calendarEventCloseBtn.SetOnTouch( function() {
            
                dlgCalend.Hide();
            });
      
        calendarLay.AddChild( EventType );
        calendarLay.AddChild( EventTime );
        calendarLay.AddChild( NotificationReminder );
        calendarLay.AddChild( EventDescription );
        layHoriz.AddChild( eventSaveBtn );
        layHoriz.AddChild( calendarEventCloseBtn );
        calendarLay.AddChild( layHoriz );          
        dlgCalend.AddLayout( calendarLay );
        dlgCalend.Show();       
}

Что радует, в DroidScript имеется очень хороший встроенный Help, и большой набор примеров, которые можно моментально запустить или скопировать к себе, посмотреть как работает тот, или иной объект или метод, разобраться в программе. Если всё равно остаются вопросы, через Google группу, посвященную DroidScript, всегда можно задать вопрос непосредственно разработчику компании SoftCogs, или же получить ответ от таких же разработчиков. Ответы всегда быстрые и исчерпывающие, и всегда можно уточнить, что не понятно.

В примере с календариком используется плагин UIExtras. Мы пока сами не разрабатывали плагины, но считается, что с их помощью можно серьёзно расширить функционал DroidScript, и получить вообще универсальный профессиональный инструмент разработчика. Есть уже приличный набор плагинов, доступных для установки прямо внутри IDE. Это различные графические плагины для UI, дополнения связанные, например, с использованием pdf, excel файлов, Google карт, соединением с электроникой по Bluetooth, и даже такие экзотические плагины, как вычисления солнечных и лунных фаз ит.д.

Вообще, это удивительно! Никогда бы раньше не подумали, что смартфон может заменить компьютер, но пока убеждаемся в обратном. Конечно, остаются некоторые задачи, которые реализуются только на компьютере, кино также будешь смотреть на компьютере, если он есть под рукой из-за большего размера экрана. Но очень много такого, что можно теперь делать прямо на смартфоне, в т.ч. заниматься программированием. Смартфон не просто стал карманным компьютером, но и за счёт внутренних датчиков, он превратился в блок измерений с контроллером. И по-сути стал волшебной палочкой современности.

В особенности, если уметь творить небольшое волшебство с тем же DroidScript.

Если вам интересно последить за развитием IDE DroidScript.

Схожие новости

#Наименование новостиТональностьИнформативностьДата публикации
1Разработка на Авроре под Аврору: разворачиваем Coder в облаке и пишем плагин для VS Code07.7227-08-2026
2Публикуем .NET MAUI‑приложение в RuStore: от унаследованного Xamarin‑проекта до первого релиза08.9923-10-2026
3Сможет ли DB Client от OpenIDE заменить DataGrip?0516-07-2026
4Black Magic Probe на ESP32-C5: беспроводной отладчик без OpenOCD010.723-09-2026
5Как индексация строк изменила систему типов HydraScript08.0617-10-2026
6Мне надоело писать один и тот же код. Поэтому я сделал Featuregen3609-07-2026
7Проектирование меню в стесненных условиях09.0726-07-2026
8OpenIDE Pro: публичный релиз для всех! Java, Kotlin, Go, TypeScript, Python, PHP и DB-клиент в одном дистрибутиве5714-07-2026
9Cоздаю игру на Unity011.8802-10-2026
10Мобильная разработка за неделю #636 (22 — 28 июня)5728-06-2026

Классификация: . Схожих патентов: 0. Схожих новостей: 10. Тональность: 0. Информативность: 7.17. Источник: habr.com.