1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/isrc_ohos-azexplosion_ohos

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Проект Azexplosion_ohos

Данный проект является результатом переноса и разработки на основе открытого проекта AZExplosion для использования в среде HarmonyOS. Исходный проект можно отследить по его тегам и адресу на GitHub (https://github.com/Xieyupeng520/AZExplosion).

Проект: Azexplosion_ohos

Серия: Адаптация и перенос сторонних компонентов HarmonyOS

Функции: Реализация эффекта разрушения частиц при нажатии на изображение, а также использование различных свойств анимации.

Различия в вызовах: Нет

Среда разработки: SDK5, DevEco Studio 2.1 beta3

Автор проекта: Ху Пэнда

Электронная почта: 824128845@qq.com

Адрес исходного документа Doc: https://github.com/Xieyupeng520/AZExplosion

Проект

Язык программирования: Java

Инструкция по установке

  1. Загрузите har-пакет AZExplosion под названием explosion.har из папки output.
  2. Запустите DevEco Studio и импортируйте загруженный har-пакет в каталог проекта «entry->libs».
  3. В файле build.gradle уровня модуля добавьте зависимость в разделе dependences, указав на jar-пакеты в каталоге libs.
  4. Щёлкните правой кнопкой мыши на импортированном har-пакете, выберите «Add as Library», укажите на нужный модуль и нажмите «OK» для успешной ссылки.
  5. После выполнения этих шагов проект готов к запуску в среде SDK5 и DevEco Studio 2.1 beta3.

Использование

  1. Необходимые ресурсы 1.1 Создание объекта: ```Java public class Particle { // По умолчанию ширина и высота маленького шара public static final int PART_WH = 5; // Координата x центра окружности частицы float cx; // Координата y центра окружности частицы float cy; // Радиус частицы float radius; // Цвет частицы int color; // Прозрачность частицы float alpha; Rect mBound; }
    1.2 Создание объекта ExplosionField, который наследуется от Component и используется как холст для набора частиц. Необходимо переопределить метод onDraw().
        ```Java
        public class ExplosionField extends Component {
          // Код опущен
        }
        ```
    1.3 Создание объекта ExplosionAnimator, который наследуется от ValueAnimator и используется для выполнения пользовательских анимаций.
        ```Java
         public class ExplosionAnimator extends AnimatorValue implements AnimatorValue.ValueUpdateListener {
           // Код опущен
         }
         ```
    1.4 Создание пустого изображения того же размера, что и исходный компонент, с помощью метода createPixelmap() класса PixelMap.
        ```Java
         private PixelMap getPixelMap(int resId) {
           // Код опущен
           return null;
         }
         ```
    1.5 Разделение изображения на несколько частиц, которые затем могут быть анимированы для создания эффекта взрыва.
        ```Java
         public static Particle generateParticle(int color, Rect bound, Point point) {
           // Код опущен
           Particle
         }
         ``` **particle = new Particle();**

particle.mBound = bound;
//粒子颜色
particle.color = color;
//粒子透明度
particle.alpha = 1f;
//把半径设为宽长
particle.radius = PART_WH;
//圆心坐标
particle.cx = bound.left + PART_WH * column;
particle.cy = bound.top + PART_WH * row;
return particle;
}

**1.6 В ExplosionAnimator через метод getAnimatedValue() можно непрерывно получать диапазон (обозначим как factor).**

Мы сначала в Particle получаем факторы изменения, после чего должны произойти изменения свойств. Можно перемещать cx влево и вправо, cy — вниз, причём расстояние связано с высотой view. radius уменьшается, alpha становится всё более прозрачной.

public void advance(float factor) {
    //Перемещение x-координаты частицы
    cx = cx + factor * random.nextInt(mBound.getWidth()) * (random.nextFloat() -0.5f);
    //Перемещение y-координаты частицы
    cy = cy + factor * random.nextInt(mBound.getHeight() / 2);
    //Радиус уменьшается
    radius = radius - factor * random.nextInt(2);
    //Прозрачность также постепенно меняется
    alpha = (1f - factor) * (1 + random.nextFloat());
}
}

**1.7 В ExplosionField создаём метод «взрыв», который нужно вызвать, передав Component.**

После этого выполняется animator.start(). Component, и будет выполнен эффект взрыва.

public void explode(final Component view) {
    //Получаем абсолютные координаты view на экране
    int[] positions = view.getLocationOnScreen();
    //Исправляем смещение из-за строки состояния
    positions[1] = positions[1] - 159;
    Rect rect = view.getComponentPosition();
    //Делаем размер изображения равным размеру разрушения
    rect.set(rect.left - 75, rect.top, rect.right + 75, rect.bottom + 150);
    final ExplosionAnimator animator = new ExplosionAnimator(this, createBitmapFromView(view), rect);
    explosionAnimators.add(animator);
}

**1.8 На верхнем уровне Activity накладываем прозрачный слой ExplosionField для отображения анимации частиц.**

private void attach2Activity(Ability activity) {
    ComponentContainer rootView = (ComponentContainer) activity.findComponentById(ResourceTable.Id_group1).getComponentParent().getComponentParent();
    ComponentContainer.LayoutConfig lp = new ComponentContainer.LayoutConfig(
            ComponentContainer.LayoutConfig.MATCH_PARENT, ComponentContainer.LayoutConfig.MATCH_PARENT);
    rootView.addComponent(this, lp);
}

**1.9 Вызываем метод addListener(), чтобы добавить прослушиватель к view, который должен реализовать эффект щелчка.**

public void addListener(Component view) {
    if (view instanceof ComponentContainer) {
        ComponentContainer viewGroup = (ComponentContainer) view;
        int count = viewGroup.getChildCount();
        for (int i = 0; i < count; i++) {
            addListener(viewGroup.getComponentAt(i));
        }
    } else {
        view.setClickable(true);
        view.setClickedListener(getOnClickListener());
    }
}

private ClickedListener getOnClickListener() {
    if (null == onClickListener) {
        onClickListener = new ClickedListener() {
            @Override
            public void onClick(Component component) {
                ExplosionField.this.explode(component);
            }
        };
    }
    return onClickListener;
}
}

**2. Макет и инициализация**

**2.1 XML-макет**

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos"
              ohos:id="$+id:root"
              ohos:width="match_parent"
              ohos:height="match_parent"
              ohos:orientation="vertical"
        >
    <Text
            ohos:width="match_content"
            ohos:text="Эффект разрушения"
            ohos:text_size="60vp"
            ohos:top_margin="10vp"
            ohos:left_margin="30vp"
            ohos:bottom_margin="15vp"
            ohos:right_padding="15vp"
            ohos:left_padding="15vp"
            ohos:height="match_content"/>

    <DirectionalLayout ohos:id="$+id:group1"
                  ohos:width="match_parent"
                  ohos:height="100vp"
                  ohos:top_margin="10vp"
                  ohos:orientation="horizontal"
            >

        <Image
            ohos:id="$+id:qq"
                ohos:width="match_content"
                ohos:height="match_content"
                ohos:image_src="$media:qq"
            ohos:left_margin="25vp"
            ohos:right_margin="25vp"
            ohos:top_margin="15vp"

            />
        <Image
            ohos:id="$+id:qzone" 2.2 Использование макета и инициализация в коде

    private PixelMap createBitmapFromView(Component view) {
        PixelMap.InitializationOptions options = new PixelMap.InitializationOptions();
        options.size = new Size(100, 100);
        PixelMap bitmap = PixelMap.create(options);

        if (view.getName().equals("Id_qq")) {
            bitmap = getPixelMap(ResourceTable.Media_qq);
        }

        if (view.getName().equals("Id_qzone")) {
            bitmap = getPixelMap(ResourceTable.Media_qzone);
        }

        if (view.getName().equals("Id_vx")) {
            bitmap = getPixelMap(ResourceTable.Media_vx);
        }

        if (view.getName().equals("Id_wb")) {
            bitmap = getPixelMap(ResourceTable.Media_wb);
        }

        if (view.getName().equals("Id_tb")) {
            bitmap = getPixelMap(ResourceTable.Media_tb);
        } ```
if(view.getName().equals("Id_baidu_map"))
    bitmap =getPixelMap(ResourceTable.Media_baidu_map);
if(view.getName().equals("Id_gaode_map"))
    bitmap =getPixelMap(ResourceTable.Media_gaode_map);
if(view.getName().equals("Id_qq_music"))
    bitmap =getPixelMap(ResourceTable.Media_qq_music);
return bitmap;
}

Версия: v0.1.0-alpha

Авторские права и лицензии: azexplosion_ohos лицензирован под Apache License, version 2.0.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления (1)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/isrc_ohos-azexplosion_ohos.git
git@api.gitlife.ru:oschina-mirror/isrc_ohos-azexplosion_ohos.git
oschina-mirror
isrc_ohos-azexplosion_ohos
isrc_ohos-azexplosion_ohos
master