返回顶部
首页 > 资讯 > 移动开发 >Android实现点赞动画(27)
  • 729
分享到

Android实现点赞动画(27)

动画Android 2022-06-06 04:06:41 729人浏览 安东尼
摘要

本文实例为大家分享了Android使用入门第二十七篇点赞动画的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.like

本文实例为大家分享了Android使用入门第二十七篇点赞动画的具体代码,供大家参考,具体内容如下

MainActivity.java代码:


package siso.likeanimation;
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.graphics.drawable.BitmapDrawable;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
 private DivergeViewSecond mDivergeView;
 private Button mBtnStart;
 private ImageView mImageView;
 private ArrayList<Bitmap> mList;
 private int mIndex = 0;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 mBtnStart = (Button)findViewById(R.id.btnStart);
 mImageView = (ImageView)findViewById(R.id.iv_start);
 mList = new ArrayList<>();
 mList.add(((BitmapDrawable) ResourcesCompat.getDrawable(getResources(), R.drawable.ic_praise_sm1, null)).getBitmap());
 mList.add(((BitmapDrawable) ResourcesCompat.getDrawable(getResources(),R.drawable.ic_praise_sm2,null)).getBitmap());
 mList.add(((BitmapDrawable) ResourcesCompat.getDrawable(getResources(),R.drawable.ic_praise_sm3,null)).getBitmap());
 mList.add(((BitmapDrawable) ResourcesCompat.getDrawable(getResources(),R.drawable.ic_praise_sm4,null)).getBitmap());
 mList.add(((BitmapDrawable) ResourcesCompat.getDrawable(getResources(),R.drawable.ic_praise_sm5,null)).getBitmap());
 mList.add(((BitmapDrawable) ResourcesCompat.getDrawable(getResources(), R.drawable.ic_praise_sm6, null)).getBitmap());
 mBtnStart.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  if(mIndex == 5){
   mIndex = 0 ;
  }
  mDivergeView.startDiverges(mIndex);
  mIndex ++;
//  if (mDivergeView.isRunning()) {
//   mDivergeView.stop();
//  } else {
//
//  }
  }
 });
 mDivergeView = (DivergeViewSecond) findViewById(R.id.divergeView);
 mDivergeView.post(new Runnable() {
  @Override
  public void run() {
  mDivergeView.setEndPoint(new PointF(mDivergeView.getMeasuredWidth()/2,0));
  mDivergeView.setDivergeViewProvider(new Provider());
  }
 });
// mDivergeView.start();
 }
 @Override
 protected void onDestroy() {
 super.onDestroy();
 if(mList != null){
  mList.clear();
  mList = null;
 }
 }
 class Provider implements DivergeViewSecond.DivergeViewProvider{
 @Override
 public Bitmap getBitmap(Object obj) {
  return mList == null ? null : mList.get((int)obj);
 }
 }
}

DivergeViewSecond.java代码:


package siso.likeanimation;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.canvas;
import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
public class DivergeViewSecond extends View implements Runnable{
 public static final float mDuration = 0.010F;
 public static final int mDefaultHeight = 100;
 protected static final long MQueenDuration = 200;
 protected final Random mRandom = new Random();
 protected ArrayList<DivergeInfo> mDivergeInfos;
 protected List<Object> mQueen;
 protected PointF mPtStart;
 protected PointF mPtEnd;
 protected ArrayList<DivergeInfo> mDeadPool = new ArrayList<>();
 private Paint mPaint;
// private static final int mDefaultWidth = 100;
// private static final int mAlphaOffset = 50;
 private DivergeViewProvider mDivergeViewProvider;
 private long mLastAddTime = 0;
 private Thread mThread;
 private boolean mRunning = true;
 private boolean mIsDrawing = false;
 public DivergeViewSecond(Context context) {
 this(context, null);
 }
 public DivergeViewSecond(Context context, AttributeSet attrs) {
 this(context, attrs, 0);
 }
 public DivergeViewSecond(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 init();
 }
 
 @Override
 public void run() {
 while(mRunning){
  if(mDivergeViewProvider == null){
  continue;
  }
  if(mQueen == null){
  continue;
  }
  if(mIsDrawing){
  //如果正在绘制,不要处理数据
  continue;
  }
  if(mDivergeInfos == null){
  continue;
  }
  dealQueen();
  if(mDivergeInfos.size() == 0){
  continue;
  }
  dealDiverge();
  mIsDrawing = true;
  postInvalidate();
 }
 //停止
 release();
 }
 private void dealDiverge(){
 for (int i = 0; i < mDivergeInfos.size(); i++) {
  DivergeInfo divergeInfo = mDivergeInfos.get(i);
  float timeLeft = 1.0F - divergeInfo.mDuration;
  divergeInfo.mDuration += mDuration;
  float x, y;
  //二次贝塞尔
  float time1 = timeLeft * timeLeft;
  float time2 = 2 * timeLeft * divergeInfo.mDuration;
  float time3 = divergeInfo.mDuration * divergeInfo.mDuration;
  x = time1 * (mPtStart.x)
   + time2 * (divergeInfo.mBreakPoint.x)
   + time3 * (divergeInfo.mEndPoint.x);
  divergeInfo.mX = x;
  y = time1 * (mPtStart.y)
   + time2 * (divergeInfo.mBreakPoint.y)
   + time3 * (divergeInfo.mEndPoint.y);
  divergeInfo.mY = y;
  if (divergeInfo.mY <= divergeInfo.mEndPoint.y) {
  mDivergeInfos.remove(i);
  mDeadPool.add(divergeInfo);
  i--;
  continue;
  }
 }
 }
 private void dealQueen(){
 long now = System.currentTimeMillis();
 if(mQueen.size() > 0 && now - mLastAddTime > mQueenDuration){
  mLastAddTime = System.currentTimeMillis();
  DivergeInfo divergeInfo = null;
  if(mDeadPool.size() > 0){
  //死池里面有空闲的divergenode
  divergeInfo = mDeadPool.get(0);
  mDeadPool.remove(0);
  }
  if(divergeInfo == null){
  divergeInfo = createDivergeNode(mQueen.get(0));
  }
  divergeInfo.reset();
  divergeInfo.mType = mQueen.get(0);
  mDivergeInfos.add(divergeInfo);
  mQueen.remove(0);
 }
 }
 public interface DivergeViewProvider{
 public Bitmap getBitmap(Object obj);
 }
 private void init(){
 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 }
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 //不需要支持wrap_content
 }
 @Override
 protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
 super.onLayout(changed, left, top, right, bottom);
 }
 public void setDivergeViewProvider(DivergeViewProvider divergeViewProvider){
 mDivergeViewProvider = divergeViewProvider;
 }
 public PointF getStartPoint(){
 return mPtStart;
 }
 public boolean isRunning(){
 return mRunning;
 }
 public void startDiverges(Object obj){
 if(mDivergeInfos == null){
  mDivergeInfos = new ArrayList<>(30);
 }
 if(mQueen == null){
  mQueen = Collections.synchronizedList(new ArrayList<>(30));
 }
 mQueen.add(obj);
// for(Object obj : objs) {
//  mQueen.add(obj);
// }
 if(mThread == null) {
  mThread = new Thread(this);
  mThread.start();
 }
 }
 public void stop(){
 if(mDivergeInfos != null){
  mDivergeInfos.clear();
 }
 if(mQueen != null){
  mQueen.clear();
 }
 if(mDeadPool != null){
  mDeadPool.clear();
 }
 }
 public void release(){
 stop();
 mPtEnd = null;
 mPtStart = null;
 mDivergeInfos = null;
 mQueen = null;
 mDeadPool = null;
 }
 public void setStartPoint(PointF point){
 mPtStart = point;
 }
 public void setEndPoint(PointF point){
 mPtEnd = point;
 }
 @Override
 protected void onDetachedFromWindow() {
 super.onDetachedFromWindow();
 mRunning = false;
 }
 @Override
 protected void onDraw(Canvas canvas) {
 if(mRunning && mDivergeViewProvider != null && mDivergeInfos != null){
  for(DivergeInfo divergeInfo : mDivergeInfos){
  mPaint.setAlpha((int)(255 * divergeInfo.mY / mPtStart.y));
  canvas.drawBitmap(mDivergeViewProvider.getBitmap(divergeInfo.mType),
   divergeInfo.mX,
   divergeInfo.mY,
   mPaint);
  }
 }
 mIsDrawing = false;
 }
 private PointF getBreakPointF(int scale1, int scale2) {
 PointF pointF = new PointF();
 pointF.x = mRandom.nextInt((getMeasuredWidth() - getPaddingRight() + getPaddingLeft()) / scale1) + getMeasuredWidth() / scale2;
 pointF.y = mRandom.nextInt((getMeasuredHeight() - getPaddingBottom() + getPaddingTop()) / scale1) + getMeasuredHeight() / scale2;
 return pointF;
 }
 protected DivergeInfo createDivergeNode(Object type){
 PointF endPoint = mPtEnd;
 if(endPoint == null){
  endPoint = new PointF(mRandom.nextInt(getMeasuredWidth()),0);
 }
// int height = mDivergeViewProvider == null ? mDefaultHeight : mDivergeViewProvider.getBitmap(type).getHeight();
 if(mPtStart == null) {
  mPtStart = new PointF(getMeasuredWidth() / 2, getMeasuredHeight() - mDefaultHeight);//默认起始高度
 }
 return new DivergeInfo(
  mPtStart.x,
  mPtStart.y,
  getBreakPointF(2, 3),
  endPoint,
  type);
 }
 public class DivergeInfo {
 public float mDuration;
 public PointF mBreakPoint;
 public PointF mEndPoint;
 public float mX;
 public float mY;
 public Object mType;
 public float mStartX;
 public float mStartY;
 public DivergeInfo(float x, float y, PointF breakPoint, PointF endPoint, Object type){
  mDuration = 0.0f;
  mEndPoint = endPoint;
  mX = x;
  mY = y;
  mStartX = x;
  mStartY = y;
  mBreakPoint = breakPoint;
  mType = type;
 }
 public void reset(){
  mDuration = 0.0f;
  mX = mStartX;
  mY = mStartY;
 }
 }
}

activity_main.xml内容:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="Http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context="siso.likeanimation.MainActivity">
 <Button
 android:id="@+id/btnStart"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="开始"/>
 <siso.likeanimation.DivergeViewSecond
 android:id="@+id/divergeView"
 android:layout_alignParentBottom="true"
 android:layout_alignParentRight="true"
 android:layout_width="130dp"
 android:layout_height="300dp"/>
 <ImageView
 android:id="@+id/iv_start"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_marginRight="10dp"
 android:layout_alignParentBottom="true"
 android:layout_alignParentRight="true"
 android:background="@drawable/ic_praise_sm6"/>
</RelativeLayout>

运行结果如图:

您可能感兴趣的文章:简单实用的Android UI微博动态点赞效果Android 仿微信朋友圈点赞和评论弹出框功能Android项目开发 教你实现Periscope点赞效果Android中Listview点赞功能的实现Android中使用PopupWindow 仿微信点赞和评论弹出Android PraiseTextView实现朋友圈点赞功能Android Listview点赞问题关于图片重复问题Android实现朋友圈点赞列表Android高级UI特效仿直播点赞动画效果Android控件FlowLikeView实现点赞动画


--结束END--

本文标题: Android实现点赞动画(27)

本文链接: https://lsjlt.com/news/22392.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android实现点赞动画(27)
    本文实例为大家分享了Android使用入门第二十七篇点赞动画的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.like...
    99+
    2022-06-06
    动画 Android
  • Android实现简单点赞动画
    本文实例为大家分享了Android实现简单点赞动画的具体代码,供大家参考,具体内容如下 思路 1、找到Activity中DecorView的RootView 2、确定点赞控件位于屏幕...
    99+
    2024-04-02
  • Android怎么实现点赞动画效果
    今天小编给大家分享一下Android怎么实现点赞动画效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前言对接下来功能实...
    99+
    2023-06-29
  • 在Android项目中实现一个点赞动画
    在Android项目中实现一个点赞动画?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。具体内容如下MainActivity.java代码:package siso.likea...
    99+
    2023-05-31
    android roi 目中
  • iOS实现点赞动画特效
    本文实例为大家分享了iOS实现点赞动画特效的具体代码,供大家参考,具体内容如下 动画的基本使用 动画的实现基本上是基于对View控件和View的layer属性进行操作,对视图进行移动...
    99+
    2022-06-05
    iOS 点赞
  • Android实现仿今日头条点赞动画效果实例
    目录一、前言二、需求拆分三、实现方案1、点赞控件触摸事件处理2、点赞动画的实现2.1、点赞效果图片的获取和存储管理2.2、点赞表情图标动画实现2.3、点赞次数和点赞文案的绘制3、存放...
    99+
    2024-04-02
  • iOS实现抖音点赞动画效果
    本文实例为大家分享了iOS实现抖音点赞动画的具体代码,供大家参考,具体内容如下 1. 概述 最近看到抖音点赞爱心的动画效果比较好,出于好奇,自己也研究仿照动画效果写了一个,不喜欢的朋...
    99+
    2022-05-31
    iOS 抖音 点赞
  • 使用Vue transition 实现点赞动画效果
    要实现点赞动画效果,你可以使用Vue的过渡(transition)组件。下面是一个简单的示例代码:```html<templa...
    99+
    2023-09-21
    Vue
  • 利用Android实现一种点赞动画效果的全过程
    目录前言点击后的缩放效果拇指的散开效果示例总结前言 最近有个需求,需要仿照公司的H5实现一个游戏助手,其中一个点赞的按钮有动画效果,如下图: 分析一下这个动画,点击按钮后,拇指首先...
    99+
    2022-12-08
    android 点赞动画 android点赞效果 android点击动画
  • Vue transition实现点赞动画效果的示例
    目录效果一览爱心效果 数字滚动动画 点赞动画 效果一览 爱心效果 材料:爱心图标两个,没有我这种 icon 组件的用 png 图片代替 <transition :nam...
    99+
    2024-04-02
  • 小程序animate动画实现直播间点赞
    本文实例为大家分享了小程序animate动画实现直播间点赞的具体代码,供大家参考,具体内容如下 代码: <view class="listImg">     <b...
    99+
    2024-04-02
  • 通过JetpackCompose实现双击点赞动画效果
    目录实现步骤先红色画个爱心点击事件加动画完整代码效果图实现步骤 先红色画个爱心 Icon( Icons.Filled.Favorite, "爱心", Modi...
    99+
    2024-04-02
  • 如何用transition实现短视频APP的点赞动画
    这篇文章主要讲解了“如何用transition实现短视频APP的点赞动画”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用transition实现短视频A...
    99+
    2024-04-02
  • 使用HTML5怎么实现一个疯狂点赞动画
    这篇文章给大家介绍使用HTML5怎么实现一个疯狂点赞动画,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。<div class="praise_bubble"> &nbs...
    99+
    2023-06-09
  • 如何通过Jetpack Compose实现双击点赞动画效果
    这篇文章主要介绍如何通过Jetpack Compose实现双击点赞动画效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实现步骤先红色画个爱心Icon(    Ico...
    99+
    2023-06-28
  • Android中Listview点赞功能的实现
    最近这段时间一直在看Android,利用Listview去实现点赞功能,下面给大家介绍下基本思路。 基本思路: 进入界面–》获取数据–》 在Listview中显示–》 通过...
    99+
    2022-06-06
    listview Android
  • Python利用PyAutoGUI实现自动点赞
    目录前言思路实现总结前言 在上篇文章《Python自动操作 GUI 神器——PyAutoGUI》中,我跟大家讲解了一下 pyautogui ...
    99+
    2024-04-02
  • Android PraiseTextView实现朋友圈点赞功能
    PraiseTextView 说明 我是将朋友圈分成了几个独立模块单独自定义的View,通过回调完成交互,耦合性算是非常低了,主要有以下及部分: 1.评论布局(自定义TextV...
    99+
    2022-06-06
    朋友圈 Android
  • CSS怎么利用计数器来实现长按点赞累积动画
    这篇“CSS怎么利用计数器来实现长按点赞累积动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2024-04-02
  • 如何使用Redis实现点赞取消点赞
    这篇文章将为大家详细讲解有关如何使用Redis实现点赞取消点赞,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码实现:    private void&n...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作