2018年抖音、快手、火山等短视频App比较火,最近自己做短视频项目时有个需求,就是类似抖音的点赞特效,单击屏幕时视频暂停,再次点击时视频恢复播放,双击或者连续多次点击时出现点赞特效(飘小心心特效),而且是全屏可以随意点击,都是可以响应双击及多击事件。我们的需求是点赞效果出现的同时请求接口,所以还是遇到很多问题的,这里记录一下.先放上一张抖音的点赞效果截图如下:

:

分析一下效果图:

1.当手指单击屏幕时,视频暂停播放,再次点击屏幕视频恢复播放.

2.当连续点击屏幕时,响应双击事件出现小心心特效,而且点击次数为两次或者两次以上.

3.单击暂停视频时和双击点赞同时可以响应,两个事件事件互不冲突.

4.点击整个屏幕都可以响应单击和双击事件.

5.多次点击时间间隔要设置在短时间内不响应,要不会出现多次响应,重复点赞(我们的需求是双击或者多击时请求点赞接口).

实现过程如下:

1.自定义点赞view

/**

* 作者: njb

* 时间: 2018/9/20 0020-上午 11:44

* 描述: 双击点赞心形动画

* 来源:

*/

public class Like extends RelativeLayout {
private Context mContext;
float[] num = {-30, -20, 0, 20, 30};//随机心形图片角度
//记录上一次的点击时间
private long  lastClickTime = 0;
//点击的时间间隔
private long INTERVAL = 200;
private MyClickListener.MyClickCallBack onClickListener;public Like(Context context) {super(context);initView(context);
}public Like(Context context, @Nullable AttributeSet attrs) {super(context, attrs);initView(context);
}public Like(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context);
}private void initView(Context context) {mContext = context;
}@Override
protected void dispatchDraw(Canvas canvas) {super.dispatchDraw(canvas);
}@Override
public boolean dispatchTouchEvent(MotionEvent event) {switch (event.getAction()){case MotionEvent.ACTION_DOWN://获取点击时间long currTime = System.currentTimeMillis();//判断点击之间的时间差long  interval = currTime - lastClickTime;lastClickTime = currTime;if(interval <INTERVAL ){//小于1秒,拦截事件,并做处理final ImageView imageView = new ImageView(mContext);//设置展示的位置,需要在手指触摸的位置上方,即触摸点是心形的右下角的位置LayoutParams params = new LayoutParams(300, 300);params.leftMargin = (int) event.getX() - 150;params.topMargin = (int) event.getY() - 300;//设置图片资源imageView.setImageDrawable(getResources().getDrawable(R.mipmap.sp_dianzanhou_da));imageView.setLayoutParams(params);//把IV添加到父布局当中addView(imageView);//设置控件的动画AnimatorSet animatorSet = new AnimatorSet();//缩放动画,X轴2倍缩小至0.9倍animatorSet.play(scale(imageView, "scaleX", 2f, 0.9f, 100, 0))//缩放动画,Y轴2倍缩放至0.9倍.with(scale(imageView, "scaleY", 2f, 0.9f, 100, 0))//旋转动画,随机旋转角.with(rotation(imageView, 0, 0, num[new Random().nextInt(4)]))//渐变透明动画,透明度从0-1.with(alpha(imageView, 0, 1, 100, 0))//缩放动画,X轴0.9倍缩小至.with(scale(imageView, "scaleX", 0.9f, 1, 50, 150))//缩放动画,Y轴0.9倍缩放至.with(scale(imageView, "scaleY", 0.9f, 1, 50, 150))//位移动画,Y轴从0上移至600.with(translationY(imageView, 0, -600, 800, 400))//透明动画,从1-0.with(alpha(imageView, 1, 0, 300, 400))//缩放动画,X轴1至3倍.with(scale(imageView, "scaleX", 1, 3f, 700, 400))//缩放动画,Y轴1至3倍.with(scale(imageView, "scaleY", 1, 3f, 700, 400));//开始动画animatorSet.start();//设置动画结束监听animatorSet.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);//当动画结束以后,需要把控件从父布局移除removeViewInLayout(imageView);}});}break;}return super.dispatchTouchEvent(event);
}/*** 缩放动画* @param view* @param propertyName* @param from* @param to* @param time* @param delayTime* @return*/
public static ObjectAnimator scale(View view, String propertyName, float from, float to, long time, long delayTime) {ObjectAnimator translation = ObjectAnimator.ofFloat(view, propertyName, from, to);translation.setInterpolator(new LinearInterpolator());translation.setStartDelay(delayTime);translation.setDuration(time);return translation;
}/*** 位移动画* @param view* @param from* @param to* @param time* @param delayTime* @return*/
public static ObjectAnimator translationX(View view, float from, float to, long time, long delayTime) {ObjectAnimator translation = ObjectAnimator.ofFloat(view, "translationX", from, to);translation.setInterpolator(new LinearInterpolator());translation.setStartDelay(delayTime);translation.setDuration(time);return translation;
}public static ObjectAnimator translationY(View view, float from, float to, long time, long delayTime) {ObjectAnimator translation = ObjectAnimator.ofFloat(view, "translationY", from, to);translation.setInterpolator(new LinearInterpolator());translation.setStartDelay(delayTime);translation.setDuration(time);return translation;
}/*** 透明度动画* @param view* @param from* @param to* @param time* @param delayTime* @return*/
public static ObjectAnimator alpha(View view, float from, float to, long time, long delayTime) {ObjectAnimator translation = ObjectAnimator.ofFloat(view, "alpha", from, to);translation.setInterpolator(new LinearInterpolator());translation.setStartDelay(delayTime);translation.setDuration(time);return translation;
}public static ObjectAnimator rotation(View view, long time, long delayTime, float... values) {ObjectAnimator rotation = ObjectAnimator.ofFloat(view, "rotation", values);rotation.setDuration(time);rotation.setStartDelay(delayTime);rotation.setInterpolator(new TimeInterpolator() {@Overridepublic float getInterpolation(float input) {return input;}});return rotation;
}public void setOnClickListener(MyClickListener.MyClickCallBack onClickListener) {this.onClickListener = onClickListener;
}public MyClickListener.MyClickCallBack getOnClickListener() {return onClickListener;
}

}

2.事件监听类MyClickListener

 

/**

* 作者: njb

* 时间: 2018/11/30 18:18

* 描述:单击和多次点击事件监听回调

* 来源:

*/

public class MyClickListener implements View.OnTouchListener {private static int timeout=400;//双击间四百毫秒延时private int clickCount = 0;//记录连续点击次数private Handler handler;private MyClickCallBack myClickCallBack;public interface MyClickCallBack{void oneClick();//点击一次的回调void doubleClick();//双击及连续多次点击的回调}public MyClickListener(MyClickCallBack myClickCallBack) {this.myClickCallBack = myClickCallBack;handler = new Handler();}@Overridepublic boolean onTouch(View v, MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {clickCount++;handler.postDelayed(new Runnable() {@Overridepublic void run() {if (clickCount == 1) {myClickCallBack.oneClick();}else if(clickCount>=2){myClickCallBack.doubleClick();}handler.removeCallbacksAndMessages(null);//清空handler延时,并防内存泄漏clickCount = 0;//计数清零}},timeout);//延时timeout后执行run方法中的代码}return false;//让点击事件继续传播,方便再给View添加其他事件监听}
}

3.布局文件代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/banner"><com.example.administrator.timertask.view.Likeandroid:id="@+id/like"android:layout_width="match_parent"android:layout_height="match_parent"></com.example.administrator.timertask.view.Like>
</android.support.constraint.ConstraintLayout>

4.Activity代码:

/*** 作者: njb* 时间: 2018/12/13 14:55* 描述:* 来源:*/
public class LikeActivity extends AppCompatActivity {private Like like;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_like);initView();}private void initView() {like = findViewById(R.id.like);like.setOnClickListener(new MyClickListener.MyClickCallBack() {@Overridepublic void oneClick() {Toast.makeText(LikeActivity.this,"单击事件",Toast.LENGTH_SHORT).show();}@Overridepublic void doubleClick() {Toast.makeText(LikeActivity.this,"双击或多击事件",Toast.LENGTH_SHORT).show();}});}
}

5.以上就是单击和双击及多击事件监听和点赞动画自定义view实现,由于时间问题后面会加上视频播放、单击暂停等,慢慢完善例子,并给出源码,写得不好,还望大家见谅,有问题大家可以提出一起探讨解决.

点赞动画源码地址:https://gitee.com/jackning_admin/LoveClick

Android自定义view之实现仿抖音双击点赞单击暂停特效相关推荐

  1. 仿抖音短视频源码,高仿抖音双击点赞效果之双击的问题

    仿抖音短视频源码中,实现仿抖音的双击点赞效果,相关代码如下: public class MyView extends View {private GestureDetector gestureDete ...

  2. 多图弹出最后变成心形html,【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)...

    效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...

  3. Android仿抖音双击点赞动画,Android仿抖音点击效果

    原标题:Android仿抖音点击效果 作者丨wish_xy https://www.jianshu.com/p/1d17c38a3db1 学习自定义view,想找点东西耍一下,刚好看到抖音的点赞效果不 ...

  4. pythoni屏幕连点_【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)

    效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...

  5. 【Flutter组件】仿抖音双击点赞弹出爱心效果(可连点)

    效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...

  6. Flutter组件:仿抖音双击点赞弹出爱心效果

    效果 简介 仿抖音点赞手势,单击暂停,双击点赞,可连续点击添加多个爱心,特点如下 全部效果为代码绘制(爱心图标来自Material Icon的图标) 套上在目标Widget外即可使用 提供单击与点赞的 ...

  7. Android 高仿抖音双击点赞效果

    最近遇到一个需求模仿抖音点赞效果  废话不多说,直接上代码 自定义一个view 在布局中引用它就可以 public class Love extends RelativeLayout {     pr ...

  8. java 特效_Android仿抖音双击点赞特效 java实现

    实现思路 首先分析该特效的实现思路和具体的表现.在抖音中短视频的播放界面,无论双击屏幕的无其他控件的位置都能够触发双击点赞的特效,因此这是一个自定义布局实现.其次,在双击完后会有一个心形产生并飘动,所 ...

  9. android抖音自动刷新,Android 使用SwipeRefreshLayout控件仿抖音做的视频下拉刷新效果...

    SwipeRefreshLayout(这个控件),我先跟大家介绍一下这个控件: 一.SwipeRefreshLayout简单介绍 •先看以下官方文档,已有了很详细的描述了. 官方文档说明 •这里我再大 ...

最新文章

  1. 修改Idea默认的全局设置,如Maven等
  2. python RuntimeError: maximum recursion depth exceeded
  3. Android复合控件创建与使用Demo
  4. Vue中使用input简易的上传图片
  5. Mysql中常用的函数汇总
  6. js距离单位换算_英语中常用的度量衡等单位,与我们用的不一样,这些差异点快收藏...
  7. B/S应用中的ActiveX数字签名相关问题杂谈
  8. 手把手教你用 Python 绘制酷炫的桑基图!
  9. 终端启动tomcat报错 command not found 解决方法 (含启动和关闭命令)
  10. 独角访谈 | 去中心化交易所领军人物–Loi Luu
  11. 重构28-Rename boolean method(重命名布尔方法)
  12. 产品读书.心理学《九型人格》
  13. 候客点选在哪大数据说了算 申城推广简易出租车候客站点
  14. 如何在Mac上使用QuickTime Player 录制影片?
  15. mas6a801 sw tree disp
  16. win7+Ubuntu双系统安装
  17. Zhishi.me - Weaving Chinese Linking Open Data
  18. IP切换代理 免费资源共享
  19. linux滚动升级版本,Linux发行基础滚动版本与标准版本 | MOS86
  20. 清华大学操作系统课程实验

热门文章

  1. DLL注入:远程线程注入
  2. Vue实战狗尾草博客管理平台第五章
  3. uni-app H5在公众号中关闭页面窗口
  4. 【观察】星环科技:布局行业大模型赛道,加速国产化替代进程
  5. 掌门1对1微服务体系Solar第1弹:全链路灰度蓝绿发布智能化实践
  6. 攻防世界 Misc高手进阶区 2分题 再见李华
  7. python交互式日历制作图片_2.利用Python制作电子版电影台历
  8. 微信小程序通过data-xxx获取不到dataset数据
  9. 企业邮箱发的“工资补贴”假邮件,又来了
  10. 为什么浏览器会使用多进程架构