鸿蒙模仿抖音点赞-harmonyOS

 


import com.mytoutou.cehua.ResourceTable;
import ohos.agp.animation.Animator;
import ohos.agp.animation.AnimatorProperty;
import ohos.agp.components.*;
import ohos.multimodalinput.event.TouchEvent;

import java.util.Random;

public class MainPageListener implements Component.TouchEventListener {

    private DirectionalLayout page;

    private float lastY;
    private float lastX;
    private float currentY;
    private float currentX;

    private int pointId;
    private float distance;

    public MainPageListener(DirectionalLayout page) {
        this.page = page;

    }

    @Override
    public boolean onTouchEvent(Component component, TouchEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case TouchEvent.PRIMARY_POINT_DOWN:
                pointId = ev.getPointerId(ev.getIndex());
                lastY = currentY = ev.getPointerPosition(pointId).getY();
                lastX = currentX = ev.getPointerPosition(pointId).getX();
                //取中心---显示
                //创建一个点赞装下love的容器,在里面放一张love图片
                DirectionalLayout love = new DirectionalLayout(page.getContext());
                love.setWidth(200);
                love.setHeight(200);
                Image image = new Image(page.getContext());
                image.setWidth(200);
                image.setHeight(200);
                image.setPixelMap(ResourceTable.Media_dz_heart_1);
                love.addComponent(image);
                StackLayout pageStack = (StackLayout) page.findComponentById(ResourceTable.Id_page_a_stack);
                pageStack.addComponent(love);
                //随机左右倾斜一个角度--->向倾斜的方向移动并且移动过放大逐渐淡化消失
                //爱心所在的位置
                love.setContentPosition(lastX, lastY);
                //(1)、第一种方式
                float v = getRandomRotateValue(-35F, -25F, -0F, 25F, 35F);
                //创建一个属性动画
                AnimatorProperty animatorProperty = new AnimatorProperty();
                //属性动画塞入需要执行的动画内容
                animatorProperty.setTarget(love);
                animatorProperty.setStateChangedListener(new Animator.StateChangedListener() {
                    @Override
                    public void onStart(Animator animator) {

                    }

                    @Override
                    public void onStop(Animator animator) {

                    }

                    @Override
                    public void onCancel(Animator animator) {

                    }

                    @Override
                    public void onEnd(Animator animator) {
                        //动画结束之后将其移除掉
                        pageStack.removeComponent(love);
                    }

                    @Override
                    public void onPause(Animator animator) {

                    }

                    @Override
                    public void onResume(Animator animator) {

                    }
                });
                animatorProperty.rotate(v)//每次随机旋转的角度
                        .setDuration(800)//动画持续800ms(毫秒)
                        .scaleX(2.5F)//向x轴放大2.5倍
                        .scaleY(2.5F)//向y轴放大2.5倍
                        .moveByY(-300)//向上是负值,向下是正值---移动x个像素
                        .alpha(0)
                        .start();//这个线性函数---理解渐渐消失
                //(1)、第一种方式
                break;
            case TouchEvent.POINT_MOVE:
                currentY = ev.getPointerPosition(pointId).getY();
                distance = currentY - lastY;
                page.setMarginBottom(page.getMarginBottom() + (int) distance);
                break;
            case TouchEvent.PRIMARY_POINT_UP:
                break;
        }
        return true;
    }

    //随机1-5个数的角度
    private float getRandomRotateValue(float... rotate) {
        Random r = new Random();
        int a = r.nextInt(4) + 1;
        return randomZF() == 0 ? rotate[a] : -rotate[a];
    }

    //随机0或1是为了取角度正负数
    private float randomZF() {
        return new java.util.Random().nextBoolean() ? 1 : 0;
    }

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我来秋风扫落叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值