当前位置:   article > 正文

Android 模仿小红书双击点赞动画_android 点赞动画

android 点赞动画

 直接上代码,就一个简单的自定义View

  1. public class Love extends RelativeLayout {
  2. private Context mContext;
  3. float[] num = {-30, -20, 0, 20, 30};//随机心形图片角度
  4. //记录上一次的点击时间
  5. private long lastClickTime = 0;
  6. //点击的时间间隔
  7. private long INTERVAL = 300;
  8. private static final long SINGLE_CLICK_DELAY = 300; // 单击延时时间
  9. private OnClickListener clickListener; // 外部点击事件监听器
  10. private Handler handler = new Handler();
  11. private boolean singleClickPending = false;
  12. private float downX, downY;
  13. public interface OnLoveClickListener {
  14. void onSingleClick(); // 单击事件回调
  15. void onDoubleClick(); // 双击事件回调
  16. }
  17. private OnLoveClickListener loveClickListener;
  18. public void setOnLoveClickListener(OnLoveClickListener listener) {
  19. this.loveClickListener = listener;
  20. }
  21. public Love(Context context) {
  22. super(context);
  23. initView(context);
  24. }
  25. public Love(Context context, @Nullable AttributeSet attrs) {
  26. super(context, attrs);
  27. initView(context);
  28. }
  29. public Love(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  30. super(context, attrs, defStyleAttr);
  31. initView(context);
  32. }
  33. private void initView(Context context) {
  34. mContext = context;
  35. clickListener = new OnClickListener() {
  36. @Override
  37. public void onClick(View v) {
  38. // 默认单击事件处理,可以自行替换为你的逻辑
  39. if (loveClickListener != null) {
  40. if (singleClickPending) {
  41. handler.removeCallbacksAndMessages(null);
  42. singleClickPending = false;
  43. } else {
  44. loveClickListener.onSingleClick();
  45. }
  46. }
  47. }
  48. };
  49. }
  50. @Override
  51. protected void dispatchDraw(Canvas canvas) {
  52. super.dispatchDraw(canvas);
  53. }
  54. @Override
  55. public boolean dispatchTouchEvent(MotionEvent event) {
  56. switch (event.getAction()) {
  57. case MotionEvent.ACTION_DOWN:
  58. downX = event.getX();
  59. downY = event.getY();
  60. // 获取点击时间
  61. long currTime = System.currentTimeMillis();
  62. // 判断点击之间的时间差
  63. long interval = currTime - lastClickTime;
  64. lastClickTime = currTime;
  65. if (interval > 0 && interval < INTERVAL) {
  66. final ImageView imageView = new ImageView(mContext);
  67. //设置展示的位置,需要在手指触摸的位置上方,即触摸点是心形的右下角的位置
  68. LayoutParams params = new LayoutParams(300, 300);
  69. params.leftMargin = (int) event.getX() - 150;
  70. params.topMargin = (int) event.getY() - 300;
  71. //设置图片资源
  72. ImgLoader.displayWebp(getContext(),R.drawable.main_webp_dianzanhou,imageView);
  73. imageView.setLayoutParams(params);
  74. //把IV添加到父布局当中
  75. addView(imageView);
  76. startDelayedRemoval(imageView,1500);
  77. L.e("Love", "------------onSingleClick--------------");
  78. if (loveClickListener != null) {
  79. handler.removeCallbacksAndMessages(null);
  80. singleClickPending = false;
  81. loveClickListener.onDoubleClick(); // 双击事件回调
  82. return true; // 拦截双击事件,不传递到子视图
  83. }
  84. } else {
  85. // 单击事件
  86. if (loveClickListener != null) {
  87. singleClickPending = true;
  88. handler.postDelayed(new Runnable() {
  89. @Override
  90. public void run() {
  91. // 如果延时期间没有第二次点击,则执行单击事件
  92. loveClickListener.onSingleClick();
  93. singleClickPending = false;
  94. }
  95. }, SINGLE_CLICK_DELAY);
  96. return true; // 拦截单击事件,不传递到子视图
  97. }
  98. }
  99. break;
  100. case MotionEvent.ACTION_CANCEL:
  101. // 如果移动距离超过阈值,取消单击事件的执行
  102. handler.removeCallbacksAndMessages(null);
  103. singleClickPending = false;
  104. break;
  105. }
  106. return super.dispatchTouchEvent(event);
  107. }
  108. // 设置点击事件监听器
  109. @Override
  110. public void setOnClickListener(OnClickListener l) {
  111. this.clickListener = l;
  112. }
  113. private void startDelayedRemoval(final ImageView imageView, long delayMillis) {
  114. new Handler().postDelayed(new Runnable() {
  115. @Override
  116. public void run() {
  117. // 当动画结束以后,需要把控件从父布局移除
  118. ImgLoader.display(getContext(), 0, imageView);
  119. removeViewInLayout(imageView);
  120. }
  121. }, delayMillis);
  122. }
  123. }

其中main_webp_dianzanhou是一个webp图片。当用户点击后直接播放就行了

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号