效果展示

原理分析

抛物线效果最主要的难点和原理在于贝塞尔曲线动画的生成,我们通过图片主要讲解贝塞尔曲线动画,这里用到的是二级贝塞尔曲线

1、需要找到贝塞尔曲线的三个点,开启点、结束点、控制点
2、通过二级贝塞尔曲线的公式计算,获取贝塞尔曲线的轨迹路径点
3、通过设置点赞图片X,Y坐标,从而形成点赞的效果

实现步骤

1、初始化变量

class Bezier2Layout : RelativeLayout, View.OnClickListener {private var startPoint = Point(0, 0)private var endPoint = Point(0, 0)private var controlPoint = Point(0, 0)private var currentPoint = Point(0, 0)private var valueAnimator: ValueAnimator? = nullprivate var imageView: ImageView? = nullprivate var layoutParams: RelativeLayout.LayoutParams =RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)constructor(context: Context?) : this(context, null)constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0)constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {initView()initPoint()setOnClickListener(this)}/*** 初始化视图*/private fun initView() {imageView = ImageView(context)imageView?.layoutParams = layoutParamsimageView?.visibility = View.INVISIBLEimageView?.setBackgroundResource(R.drawable.christmas05)addView(imageView)}/*** 初始化三个点*/fun initPoint() {this.startPoint = Point(0, 0)this.endPoint = Point(dp2px(context, 200f), dp2px(context, 200f))this.controlPoint = Point(dp2px(context, 100f), 0)}override fun onDetachedFromWindow() {super.onDetachedFromWindow()valueAnimator?.cancel()}/*** 点击开始动画*/override fun onClick(v: View?) {startAnimation()}fun dp2px(context: Context, dpVal: Float): Int {return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpVal, context.resources.displayMetrics).toInt()}
}

2、点赞效果的实现

fun startAnimation() {valueAnimator?.cancel()valueAnimator = ValueAnimator.ofObject(BezierEvaluator(controlPoint), startPoint, endPoint).apply {addUpdateListener {currentPoint = it.animatedValue as PointimageView?.x = currentPoint.x.toFloat()imageView?.y = currentPoint.y.toFloat()}addListener(object : Animator.AnimatorListener {override fun onAnimationRepeat(animation: Animator?) {}override fun onAnimationEnd(animation: Animator?) {imageView?.visibility = View.INVISIBLE}override fun onAnimationCancel(animation: Animator?) {imageView?.visibility = View.INVISIBLE}override fun onAnimationStart(animation: Animator?) {imageView?.visibility = View.VISIBLE}})interpolator = AccelerateInterpolator()duration = 1000start()}
}

3、贝塞尔曲线动画

它需要一个估值器,不断的计算它的运行轨迹,从起始点到终点开始计算,当中也一个支撑点进行辅助计算,这些都是由贝塞尔曲线的公式所决定的

open class BezierEvaluator : TypeEvaluator<Point> {var controlPoint: Pointconstructor(controlPoint: Point) {this.controlPoint = controlPoint}override fun evaluate(t: Float, startValue: Point, endValue: Point): Point {var x = (1 - t) * (1 - t) * startValue.x + 2 * t * (1 - t) * controlPoint.x + t * t * endValue.xvar y = (1 - t) * (1 - t) * startValue.y + 2 * t * (1 - t) * controlPoint.y + t * t * endValue.yreturn Point(x.toInt(), y.toInt())}
}

在不断的计算过程中,我们就可以一直获取它的轨迹点,从而执行我们的属性动画,实现贝塞尔曲线动画

addUpdateListener {currentPoint = it.animatedValue as PointimageView?.x = currentPoint.x.toFloat()imageView?.y = currentPoint.y.toFloat()
}

5、View的使用

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.example.test.customView.Bezier2Layoutandroid:layout_width="match_parent"android:layout_height="match_parent" /></RelativeLayout>

Android自定义View——贝塞尔曲线实现抛物线效果相关推荐

  1. android 抛物线轨迹,Android自定义View——贝塞尔曲线实现抛物线效果

    效果展示 原理分析 抛物线效果最主要的难点和原理在于贝塞尔曲线动画的生成,我们通过图片主要讲解贝塞尔曲线动画,这里用到的是二级贝塞尔曲线 1.需要找到贝塞尔曲线的三个点,开启点.结束点.控制点 2.通 ...

  2. Android自定义View,跟随手指滑动效果

    Android自定义View,实现跟随手指滑动效果, 效果如下: 一,重写onTouchEvent方法 最后返回true 二,在MotionEvent.ACTION_MOVE情况下改变自定义view ...

  3. android自定义拱形,Android自定义View实现圆弧进度的效果

    前言 Android开发中,常常自定义View实现自己想要的效果,当然自定义View也是Android开发中比较难的部分,涉及到的知识有Canvas(画布),Paint(画笔)等,自定义控件分为三种: ...

  4. android自定义计步器形状,Android自定义View仿QQ运动步数效果

    本文实例为大家分享了Android QQ运动步数的具体代码,供大家参考,具体内容如下 今天我们实现下面这样的效果: 首先自定义属性: 自定义View代码如下: /** * Created by Mic ...

  5. android 图片跑马灯动画,【Android自定义View】- 文本跑马灯效果

    简介 有些时候,文字过长,或者有多条需要展示的文本时,我们需要将文本进行左右滚动,多条文本时,还得上下滚动以实现展示不同的文本内容.这时候就需要我们自定义view来实现文本跑马灯效果了. 效果图 jj ...

  6. Android自定义View(广告栏上下滚动效果)

    需求中涉及到的广告栏变化千变万化,这里,我们综合取材,有了下面的这篇文章. 开始的时候,我们使用的是MarqueeView,继承的ViewFlipper,但是会有一些bug,比如刷新数据时的重叠阴影等 ...

  7. Android自定义View实现滴滴验证码输入框效果

    先上效果图让大家看看 1.VerficationCodeInput.Java /** * 輸入验证码的自定义view * */ public class VerificationCodeInput e ...

  8. android 屏幕飘动,Android自定义View实现飘动的叶子效果(三)

    上一篇对自定义View及一些方法有所了解,下面做一个简单的叶子飘动的例子 主要技术点 1.添加背景图片canvas.drawBitmap() 2.Matrix动画类 3.Matrix添加到画布上 步骤 ...

  9. android自定义view(二)-仿华为卡包效果

    前段时间产品经理出了一个卡列表展示效果,效果的大致样子是仿照华为门禁卡卡包效果,研究了一下大致效果出来了,但和华为比还有点差距,主要是动画不是很流畅,仅供大家参考指正,有好的优化方式也可以告诉我,大家 ...

最新文章

  1. 报错:该字符串未被识别为有效的DateTime
  2. django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3
  3. 8.17——继续熟悉linux的命令行
  4. c语言常见50题 及答案(递归 循环 以及常见题目)
  5. AngularJS - 自定义指令
  6. java的classpath配置文件_Java Classpath及.properties配置文件
  7. KindEditor中使用val()获取content内容后图片不显示
  8. centos7安装mysql日志空白_centos7安装Mysql爬坑记录 - G
  9. 04_有序清单无序清单
  10. JDK自带监控工具 jps、jinfo、jstat、jmap、jconsole
  11. azure云数据库_如何将MySQL表迁移到Microsoft Azure SQL数据库
  12. Android开发四大组件
  13. 《逻辑与计算机设计基础(原书第5版)》——导读
  14. Adobe各种最新版本软件下载 PhotoShop Dreamweaver FW Ai Fl.....
  15. 高校自主招生计算机要求,2019各高校自主招生报名条件及考核内容
  16. 英语日常用语900句(3)
  17. SQL取日期为当前月份的第几周思路
  18. 若依框架获取和修改当前登录用户信息
  19. mysql 慢日志可视化_Mysql 慢日志分析系统搭建 —— Box Anemometer
  20. 每天一刷20200602

热门文章

  1. Sonic自动化测试结果通知:钉钉群机器人
  2. simulink自动生成STM32代码详解
  3. ECMAScript——RegExp类型
  4. 2023 xycms广告设计中心网站系统源码asp+access
  5. 微信PC端同时登陆两个或者多个 微信双开 微信多开操作
  6. Platform—企业通讯录
  7. Excel 数据透视表教程大全之 08 创建计算字段,将销售额除以数量实现计算每种产品单价(教程含数据)
  8. 【大数据24小时】以色列前情报人员用恐怖分子图像建人脸识别数据库
  9. SSM毕设项目 - 基于SSM的汉服文化平台网站(含源码+论文)
  10. 数据库 试述关系模型的完整性规则。在参照完整性中,什么情况下外码属性的值可以为空值?(精简答案)