原创文章引用请注明出处,文章问题持续优化中。

  1. 以下的例子是模仿抖音的刷视频的单击播放、暂停,长按弹出框,连续点击是点赞的效果。连续点击视频时候,视频处于播放或者暂停是不会击穿事件导致视频播放或者暂停的,这个解决网上那些功能不全的问题。
  2. 鸿蒙TouchEvent已实现单击、连续、长按功能,安卓也可以模仿着原理实现(网上绝大多未实现不动长按),这个支持不动长按事件
  3. 网上很多的都是不支持不动长按的事件,这个支持不动长按的事件,滑动默认不支持长按,因为长按默认是不动的,如果发生移动的话不确定执行方向不明确这个方式是不可取的,因为滑动代表的不确定的执行的因素很多,在这里就不做滑动长按功能,若是需要该功能请自行修改代码。

import com.mytoutou.cehua.ResourceTable;
import ohos.agp.animation.Animator;
import ohos.agp.animation.AnimatorGroup;
import ohos.agp.animation.AnimatorProperty;
import ohos.agp.components.*;
import ohos.app.Context;import ohos.multimodalinput.event.TouchEvent;import java.util.*;/*** 点赞爱心监听Touch事件处理类**/
public class DzLoveListener implements Component.TouchEventListener {private static final int LOVE_WIDTH = 200;private static final int LOVE_HEIGHT = 200;//承载视频的页面private DirectionalLayout page;//点击idprivate int pointId;//创建的点赞爱心图标idprivate static int ImageLayoutId = 20210505;private int resourceId;private List<DirectionalLayout> listLove = new ArrayList<>();//承载视频上下文private Context context;//自定义点击的事件接口private MyDzClickedLoveListener myDzClickedLoveListener;//点击事件public interface MyDzClickedLoveListener {//连续点击事件void seriesClicked();//单击事件void singleClicked();//长按事件void longClicked();}public DzLoveListener(DirectionalLayout page, int resourceId, MyDzClickedLoveListener myDzClickedLoveListener) {this.myDzClickedLoveListener = myDzClickedLoveListener;this.page = page;this.resourceId = resourceId;page.setLongClickedListener(new Component.LongClickedListener() {@Overridepublic void onLongClicked(Component component) {myDzClickedLoveListener.longClicked();}});page.setClickedListener(new Component.ClickedListener() {@Overridepublic void onClick(Component component) {//单击或者连续点击事件singleOrSeriesClicked(page.getContext());}});}public List<DirectionalLayout> getListLove() {return listLove;}private TouchEvent touchEvent;@Overridepublic boolean onTouchEvent(Component component, TouchEvent ev) {context = page.getContext();touchEvent = ev;return true;}//点击的次数private int clickCount = 0;//判断当前线程是否在运行中---默认是不运行--存在线程就不再生成防止事件紊乱private boolean running = false;public void solveLike() {clickCount++;if (!running) {running = true;//渲染页面的时候是用UI主线context.getUITaskDispatcher().delayDispatch(runnable, 300L);}}public void singleOrSeriesClicked(Context context) {clickCount++;this.context = context;//running 是防止点击的时候多次创建线程if (!running) {running = true;//渲染页面的时候是用UI主线context.getUITaskDispatcher().delayDispatch(runnable, 300L);}}//处理单击或者双击事件的线程Runnable runnable = () -> {if (clickCount == 1) {myDzClickedLoveListener.singleClicked();} else {this.like(touchEvent);myDzClickedLoveListener.seriesClicked();}running = false;clickCount = 0;};//点在爱心private void like(TouchEvent touchEvent) {pointId = touchEvent.getPointerId(touchEvent.getIndex());//取中心---显示//创建一个点赞装下love的容器,在里面放一张love图片DirectionalLayout love = new DirectionalLayout(context);love.setWidth(LOVE_WIDTH);love.setHeight(LOVE_HEIGHT);Image image = new Image(context);image.setWidth(LOVE_WIDTH);image.setHeight(LOVE_HEIGHT);image.setPixelMap(ResourceTable.Media_dz_heart_1);love.addComponent(image);StackLayout pageStack = (StackLayout) page.findComponentById(resourceId);love.setId(ImageLayoutId);pageStack.addComponent(love);//点击多少次存入多少,防止动画停留在屏幕getListLove().add(love);//爱心所在的位置love.setContentPosition(touchEvent.getPointerPosition(pointId).getX(), touchEvent.getPointerPosition(pointId).getY() - love.getHeight() * 2);//随机左右倾斜一个角度--->向倾斜的方向移动并且移动过放大逐渐淡化消失float randomAngle = getRandomRotateValue(-35F, -25F, -0F, 25F, 35F);//创建一个属性动画AnimatorProperty loveProperty1 = new AnimatorProperty();AnimatorProperty loveProperty = new AnimatorProperty();//属性动画塞入需要执行的动画内容loveProperty1.setTarget(love);loveProperty.setTarget(love);AnimatorGroup group = new AnimatorGroup();group.setStateChangedListener(new Animator.StateChangedListener() {@Overridepublic void onStart(Animator animator) {}@Overridepublic void onStop(Animator animator) {}@Overridepublic void onCancel(Animator animator) {System.out.println("onCancel");}@Overridepublic void onEnd(Animator animator) {//动画结束之后将其移除掉,防止动画暂停于屏幕上----(待优化部分---动画消失过慢)for (int i = 0; i < getListLove().size(); i++) {Component component = pageStack.findComponentById(getListLove().get(i).getId());if (component != null) {pageStack.removeComponent(component);//将其移除掉}//将其移除掉防止内存泄露---单个移除防止动画不连续if (!getListLove().isEmpty()) {getListLove().remove(getListLove().get(i));}}}@Overridepublic void onPause(Animator animator) {System.out.println("onPause");}@Overridepublic void onResume(Animator animator) {System.out.println("onResume");}});loveProperty1.scaleX(2.4F)//向x轴放大2.5倍.scaleY(2.4F).setDuration(200);//向y轴放大2.5倍loveProperty.rotate(randomAngle)//每次随机旋转的角度.setDuration(600)//动画持续800ms(毫秒).scaleX(2.3F)//向x轴放大2.5倍.scaleY(2.3F)//向y轴放大2.5倍.moveByY(-400)//向上是负值,向下是正值---移动x个像素.alpha(0);//这个线性函数---理解渐渐消失group.runSerially(loveProperty1, loveProperty);group.start();}//随机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;}}

精简代码如下:

通用监听代码,随处可用,复制粘贴即可使用。

import ohos.agp.components.*;
import ohos.app.Context;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
import ohos.multimodalinput.event.TouchEvent;/*** 点赞爱心监听Touch事件处理类**/
public class LikeListener implements Component.TouchEventListener {private static final int DOMAIN = 0x001;static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, DOMAIN, "MY_TAG");private static final long DELAY_TIME = 250L;//自定义点击的事件接口private MyClickedListener myClickedListener;//点击事件public interface MyClickedListener {//连续点击事件void seriesClicked(TouchEvent touchEvent);//单击事件void singleClicked(TouchEvent touchEvent);//长按事件void longClicked();}public LikeListener(Component component, MyClickedListener myClickedListener) {this.myClickedListener = myClickedListener;component.setLongClickedListener(com -> {//长按事件myClickedListener.longClicked();});component.setClickedListener(com -> {//单击或者连续点击事件singleOrSeriesClicked(component.getContext());});}private TouchEvent touchEvent;@Overridepublic boolean onTouchEvent(Component component, TouchEvent ev) {touchEvent = ev;return true;}//点击的次数private volatile int clickCount = 0;//判断当前线程是否在运行中---默认是不运行--存在线程就不再生成防止事件紊乱private volatile boolean running = false;public void singleOrSeriesClicked(Context context) {new Thread(() -> clickCount++).start();if (!running) {running = true;synchronized (this) {context.getUITaskDispatcher().delayDispatch(() -> {if (clickCount == 1) {myClickedListener.singleClicked(touchEvent);} else {myClickedListener.seriesClicked(touchEvent);clickCount++;}clickCount = 0;running = false;}, DELAY_TIME + 80);}}}}

鸿蒙TouchEvent已实现单击、连续、长按功能,安卓也可以模仿着原理实现(网上绝大多未实现不动长按),这个支持不动长按事件相关推荐

  1. android微信分享长图功能,安卓分享9宫格图片到微信

    首先感谢@DCloud_Android_磊子,test_weixin_share_mul_pic这个是他写给我的,我只做了一点小改动 用法,先setShareMsg把当前页面的商品名称.相册存到全局变 ...

  2. c语言不定长参数函数,DEFUN 如何定义支持不定长参数的函数

    当前位置:我的异常网» C语言 » DEFUN 如何定义支持不定长参数的函数 DEFUN 如何定义支持不定长参数的函数 www.myexceptions.net  网友分享于:2015-07-15   ...

  3. 鸿蒙推送升级包,华为鸿蒙系统已陆续推送!安卓可无缝升级,升级包容量高达6GB...

    原标题:华为鸿蒙系统已陆续推送!安卓可无缝升级,升级包容量高达6GB 在上个月的华为开发者大会上,华为CEO王成录明确表示虽然今年华为手机由于硬件芯片不足可能会有一定的滞后,但华为重点目标将放在软件系 ...

  4. 鸿蒙能否解决安卓长时间卡顿,[财经]鸿蒙更能解决手机卡顿:王成录回应对比安卓无惧老化(2) - 南方财富网...

    在桌面体验上,HarmonyOS 呈现的是卡片设计,支持个性化定制,可大可小,可藏可显.用户上滑 App 图标即可生成万能卡片 ,在桌面呈现更丰富的信息,卡片信息支持实时更新,减少了 App 加载的时 ...

  5. 华为p8升级android8系统资源,华为鸿蒙系统已陆续推送! 安卓系统可无缝升级: 升级包容量高达6GB...

    原标题:华为鸿蒙系统已陆续推送! 安卓系统可无缝升级: 升级包容量高达6GB 相信大家都知道,自从华为手机业务遭受到芯片断供危机以后,也是直接将会把重点放在软件系统层面,很多花粉们都纷纷期待,华为鸿蒙 ...

  6. 鸿蒙处理器的手机有什么,华为重拳出击!首款鸿蒙手机已确认,网友:还买什么iPhone11?...

    原标题:华为重拳出击!首款鸿蒙手机已确认,网友:还买什么iPhone11? 随着国产手机市场的趋于饱和,市场的形式也逐渐的明朗化,华为手机凭借超强的实力牢牢占据着高端手机市场的绝大多数份额,不过9月1 ...

  7. 鸿蒙hms在哪儿更新,原创 华为鸿蒙系统已开始实施!华为EMUI10.1再更新:HMS将决定战略方向...

    原标题:华为鸿蒙系统已开始实施!华为EMUI10.1再更新:HMS将决定战略方向 [4月22日讯]相信大家都知道,自从华为鸿蒙OS系统发布以后,大家也都是非常期待华为鸿蒙OS系统能够早日在华为手机上投 ...

  8. 华为已注册商标鸿蒙,华为已注册华为鸿蒙商标:整本山海经都被华为注册了

    原标题:华为已注册华为鸿蒙商标:整本山海经都被华为注册了 华为注册了整本山海经?这是专属于中国人的终极浪漫!]24日,华为自研操作系统"鸿蒙"现身,全网欢呼. 华为已注册华为鸿蒙商 ...

  9. 华为鸿蒙应用名称,国产自主系统名字定了 华为鸿蒙商标已注册公告

    原标题:国产自主系统名字定了 华为鸿蒙商标已注册公告 华为鸿蒙 最近呼声很高的华为自主研发系统已经正式确定名字为华为鸿蒙,在商标网站上查询可以看出,华为鸿蒙已于去年8月24日申请商标,现在商标处于公告 ...

最新文章

  1. 盘点52个全球人工智能和机器学习重要会议
  2. franze kafka 游戏_The Franz Kafka Videogame
  3. 背景宽高随文本变化_中科大提出ContourNet:更准确的任意形状场景文本检测新方法...
  4. JeecgBoot版本4月份新版即将发布,抢先体验。。
  5. 信息学奥赛C++语言:输出浮点数(1)
  6. Expression.Blend.4 Chapter 图片和视频的使用
  7. webpack的五个核心概念---webpack工作笔记002
  8. 无主之地kill ajax,阿克斯顿 - 无主之地中文维基 - 灰机wiki
  9. 20191202_Apriori算法和FP-Growth算法python实现
  10. 广东南方地形地籍成图软件CASS10.1十大新亮点(资源下载在文尾)
  11. idm站点抓取不了html,IDM站点抓取功能使用详解(下)
  12. python3 安装 pillow报错
  13. 逻辑公式之吸收律理解
  14. html图片自然,PS制作自然逼真物体倒影图片效果
  15. 【UE4】HUD(蓝图)
  16. Javaweb google身份宝验证
  17. C#之Base64编码解码
  18. 第一部android手机,安卓手机诞生十年,第一部Android 一.零手机长这样
  19. 4.案例 - NIO实现TCP通信
  20. 【代码解析】mmaction2: SlowFast

热门文章

  1. linux查看网卡流量使用情况
  2. 教你一招,能解决90%的机房问题
  3. SBIO | 浙大陈云组综述农业中细菌与真菌的互作机制
  4. 动漫界的五大舔狗 舔龟双面、舔猫Tom、舔羊阿沸、卑微正男、舔虎小黑
  5. 在线打字系统php,页面源码 - 在线打字测试(dazi.kukuw.com)
  6. Elsevier期刊的Conflict of Interest Form网址
  7. 如何高效学习3D视觉?
  8. 数据中心液冷及冷却液行业分析:算力提升驱动,氟化液迎来机遇
  9. 2003打不开计算机管理,win10系统打不开word2003的修复教程
  10. 天道酬勤 幸福不会从天降