Главная страница
Навигация по странице:

  • Теоретическая часть

  • Описание функциональности приложения

  • Практическая часть

  • Отчет Расчетнографическое задание По дисциплине Конструирование и тестирование программного обеспечения Тема Android. Разработка приложения с динамической разметкой Факультет автф


    Скачать 0.76 Mb.
    НазваниеОтчет Расчетнографическое задание По дисциплине Конструирование и тестирование программного обеспечения Тема Android. Разработка приложения с динамической разметкой Факультет автф
    Дата24.02.2023
    Размер0.76 Mb.
    Формат файлаdocx
    Имя файлаKiTPO_RGZ_AVT-942_Vedentsov.docx
    ТипОтчет
    #953306

    МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

    «НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

    ФАКУЛЬТЕТ АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ

    КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ




    Отчет

    Расчетно-графическое задание

    По дисциплине: «Конструирование и тестирование программного обеспечения»

    Тема: «Android. Разработка приложения с динамической разметкой»


    Факультет: АВТФ

    Преподаватель: Романов Е. Л.

    Группа: АВТ-942




    Студенты: Веденцов М.Д.





    Задание


    РГР. Вариант 1. Разработка приложения с динамической разметкой. Согласовано с преподавателем – подброс монетки.

    Введение


    Android — это операционная система с открытым исходным кодом, созданная для мобильных устройств на основе модифицированного ядра Linux. Эта ОС разработана консорциумом Open Handset Alliance, состоящим из крупных технологических компаний при организующей роли Google. Исходный код ОС представлен как часть проекта Android Open Source Project (AOSP) с лицензией Apache. Выпущенный на рынок в 2007 году Android вскоре стал самой продаваемой операционной системой в истории, благодаря своей открытой модели разработки и удобному интерфейсу. Последняя версия Android 13 вышла в 2022 году.

    Ход работы


    1. Теоретическая часть

    Монета может использоваться как для игры в "Орел или Решка" (Орлянку), так и при необходимости принятия случайного решения из двух одинаково приемлемых вариантов (например, при жеребьёвке в различных видах спорта).

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


    1. Описание функциональности приложения

    В приложении будет возможность выбора количества подбрасываемых монет, до миллиона. Также будет возможность подбросить все монеты разом. Подброс монет будет анимированным.


    1. Практическая часть

    В проекте реализована архитектура MVVM, что позволяет обойти проблему Android – пересоздание компонентов при смене ориентации или прочих системных изменениях.

    2.1 Файловая структура проекта




    Рисунок 1. Файловая структура проекта

    2.2 Основной Фрагмент




    Рисунок 2. CoinFragment – onCreateView()

    В проект был добавлен биндинг, для упрощения достижения полей разметки UI. Также на рис. 2 можно увидеть инициализацию вьюмодели.



    Рисунок 3. View-Model variable

    В коде разметки с помощью variable необходимо прописать модель, чтобы в бедующем передать на неё ссылку. Это необходимо, чтобы связать жизненный цикл фрагмента и её модели.

    Сама модель создаётся с помощью дополнительной библиотеки Google ViewModelProvider.

    coinViewModel = ViewModelProvider(this).get(CoinViewModel::class.java)
    Модель максимально простая.

    class CoinViewModel : ViewModel() {
    val tossPressed = MutableLiveData()
    fun onTossPressed() { tossPressed.value = true }
    fun onTossPressedFinished() { tossPressed.value = false }
    fun getRandomList(n: Int): List
    {
    return List(n){
    when(Random.nextInt(1, 3)) {
    1 -> PhotoType.HEADS
    else -> PhotoType.TAILS
    }
    }
    }
    }
    Она хранит в себе LiveData состояния кнопки подброса монетки, два метода управления этим состоянием и метод генерации рандомного результата подброса монетки.

    Далее во врагменте необходимо просто подписаться на изменения состояния LiveData:

    coinViewModel.tossPressed.observe(viewLifecycleOwner) {
    Дале в обработчике содержится логика проверки пустоты кол-ва монет. Предупреждение пользователя о неожидаемом состоянии происходит через Snackbar.

    if (editTest.isEmpty()) {
    Snackbar.make(
    requireView(),
    requireContext().getString(R.string.valid_number),
    Snackbar.LENGTH_SHORT
    ).show()
    coinViewModel.onTossPressedFinished()
    return@observe
    }
    Следом в обработчике состояния идёт логика отрисовки сетки монеток.

    if (numberCoins >= 3)
    binding.coinsList.layoutManager = GridLayoutManager(activity, 3)
    else
    binding.coinsList.layoutManager = GridLayoutManager(activity, numberCoins)
    Далее для списка, который пользователь может прокручивать необходимо реализовать Adapter.
    class PhotoTypeAdapter : RecyclerView.Adapter
    () {
    var data = listOf
    ()
    set(value) {
    field = value
    notifyDataSetChanged()
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PhotoTypeHolder {
    return PhotoTypeHolder.from(parent)
    }
    override fun onBindViewHolder(holder: PhotoTypeHolder, position: Int) {
    holder.bind(data[position])
    }
    override fun getItemCount() = data.size
    }

    class PhotoTypeHolder private constructor(private val binding: SimpleImageBinding): RecyclerView.ViewHolder(binding.root){
    fun bind(photoType: PhotoType) {
    binding.image.setImageResource(when (photoType) {
    PhotoType.HEADS -> R.drawable.heads
    PhotoType.TAILS -> R.drawable.tails
    })
    }

    companion object {
    fun from(parent: ViewGroup): PhotoTypeHolder {
    val layoutInflater = LayoutInflater.from(parent.context)
    val binding = SimpleImageBinding.inflate(layoutInflater, parent, false)
    return PhotoTypeHolder(binding)
    }
    }
    }
    Адаптер занимается отрисовкой элементов на экране, а элемент RecyclerView позволяет прокручивать монетки.

    Следом по клику на кнопку подброса запускается анимация подброса монет, перекручивание их вокруг оси. Реализовано это стандартной анимацией Android. Кодом запускаем анимацию у списка на каждый элемент:

    binding.coinsList.scheduleLayoutAnimation()
    android:id="@+id/coins_list"
    android:layoutAnimation="@anim/coin_list_animation"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@id/editTextNumber" />


    layoutAnimation – параметр, куда указываем правила анимации, которые прописаны в другом файле. Правила анимации:


    android:repeatCount="2"
    android:repeatMode="reverse"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromXScale="1.0" android:toXScale="1.0"
    android:fromYScale="1.0" android:toYScale="0.0"
    android:pivotX="50%" android:pivotY="50%"
    android:fillEnabled="true"
    android:fillAfter="true"
    android:duration="60" />


    2.3 Пример работы программы




    Рисунок2. Результат подброса монет



    Рисунок3. 1 кадр анимации


    Рисунок4. 2 кадр анимации


    Рисунок5. 3 кадр анимации


    Рисунок6. 4 кадр анимации

    Вывод


    В работе было реализовано Android приложение, которое позволит пользователю решить какой-либо спор, подбросом монетки. По сути, всё сводится к простому – рандом-функция. А всё остальное – просто обёртка для приятного пользовательского опыта при решении спора.


    Новосибирск, 2022 г.


    написать администратору сайта