不知上一节*QQ未读消息气泡大家还喜欢么,今天继续练习贝赛尔曲线,这一节我们通过贝赛尔曲线和属性动画估值器实现添加至购物车的运动轨迹,效果如下:
1、新建自定义View,重写构造方法,初始化Paint、Path;
2、确定起始点、终止点、控制点坐标,这里我们直接固定:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mStartX = 100;
mStartY = 100;
mEndX = w - 100;
mEndY = h - 100;
mControlX = w - 100;
mControlY = 100;
}
3、画起止点小球和贝赛尔曲线路径:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(mStartX, mStartY, 24, mCirclePaint);
canvas.drawCircle(mEndX, mEndY, 24, mCirclePaint);
mPath.reset();
mPath.moveTo(mStartX, mStartY);
mPath.quadTo(mControlX, mControlY, mEndX, mEndY);
canvas.drawPath(mPath, mPathPaint);
}
这样基本的东西就完成了。
4、那么该怎样使一个小球随着贝赛尔曲线的路径轨迹运动呢,那就需要得到运动到当前的点在贝赛尔曲线上的坐标,使用如下工具类:
/**
* 计算贝赛尔曲线坐标的工具类
*/
public class BezierUtil {
/**
* B(t) = (1 - t)^2 * P0 + 2t * (1 - t) * P1 + t^2 * P2, t ∈ [0,1]
*
* @param t 曲线长度比例
* @param p0 起始点
* @param p1 控制点
* @param p2 终止点
* @return t对应的点
*/
public static PointF calculateBezierPointForQuadratic(float t, PointF p0, PointF p1, PointF p2) {
PointF point = new PointF();
float temp = 1 - t;
point.x = temp * temp * p0.x + 2 * t * temp * p1.x + t * t * p2.x;
point.y = temp * temp * p0.y + 2 * t * temp * p1.y + t * t * p2.y;
return point;
}
/**
* B(t) = P0 * (1-t)^3 + 3 * P1 * t * (1-t)^2 + 3 * P2 * t^2 * (1-t) + P3 * t^3, t ∈ [0,1]
*
* @param t 曲线长度比例
* @param p0 起始点
* @param p1 控制点1
* @param p2 控制点2
* @param p3 终止点
* @return t对应的点
*/
public static PointF calculateBezierPointForCubic(float t, PointF p0, PointF p1, PointF p2, PointF p3) {
PointF point = new PointF();
float temp = 1 - t;
point.x = p0.x * temp * temp * temp + 3 * p1.x * t * temp * temp + 3 * p2.x * t * t * temp + p3.x * t * t * t;
point.y = p0.y * temp * temp * temp + 3 * p1.y * t * temp * temp + 3 * p2.y * t * t * temp + p3.y * t * t * t;
return point;
}
}
只需要传入对应的参数即可获得到当前点在贝赛尔曲线上的坐标。其中曲线长度比例t 以及起始点、终止点都可以在属性动画估值器Evaluator中获得:
/**
* 贝赛尔曲线估值器
*/
public class BezierEvaluator implements TypeEvaluator<PointF> {
/* 控制点坐标 */
private PointF mControlPoint;
public BezierEvaluator(PointF controlPoint) {
mControlPoint = controlPoint;
}
@Override
public PointF evaluate(float v, PointF pointF, PointF t1) {
return BezierUtil.calculateBezierPointForQuadratic(v, pointF, mControlPoint, t1);
}
}
注:Point与PointF的区别:
Point使用的是int类型来存储x、y坐标,而PointF使用的是float类型。
5、设置点击监听setOnclickListner(this),重写onClick方法:
@Override
public void onClick(View view) {
BezierEvaluator evaluator = new BezierEvaluator(new PointF(mControlX, mControlY));
PointF startPoint = new PointF(mStartX, mStartY);
PointF endPoint = new PointF(mEndX, mEndY);
ValueAnimator anim = ValueAnimator.ofObject(evaluator, startPoint, endPoint);
anim.setDuration(1000);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
PointF curPoint = (PointF) valueAnimator.getAnimatedValue();
mCurX = (int) curPoint.x;
mCurY = (int) curPoint.y;
invalidate();
}
});
anim.start();
}
使用估值器BezierEvaluator的对象,在属性动画更新监听中获取到该当前所在位置,并重绘:
canvas.drawCircle(mCurX, mCurY, 24, mCirclePaint);
即可实现一种类似于添加至购物车的运动轨迹效果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android贝塞尔曲线
# Android运动轨迹
# Android添加购物车
# Android贝塞尔曲线实现填充不规则图形并随手指运动
# Android 利用三阶贝塞尔曲线绘制运动轨迹的示例
# Android自定义View图片按Path运动和旋转
# android自定义view实现圆周运动
# 赛尔
# 估值
# 的是
# 起始点
# 重写
# 购物车
# 那就
# 自定义
# 只需要
# 类似于
# 大家多多
# 到该
# 这一节
# 完成了
# drawCircle
# canvas
# mControlY
# mControlX
# onDraw
# mEndY
相关文章:
深圳网站制作案例,网页的相关名词有哪些?
如何通过云梦建站系统实现SEO快速优化?
建站DNS解析失败?如何正确配置域名服务器?
如何在万网ECS上快速搭建专属网站?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
建站之星如何快速解决建站难题?
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
,网页ppt怎么弄成自己的ppt?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
济南企业网站制作公司,济南社保单位网上缴费步骤?
如何彻底删除建站之星生成的Banner?
中山网站制作网页,中山新生登记系统登记流程?
清除minerd进程的简单方法
智能起名网站制作软件有哪些,制作logo的软件?
如何使用Golang安装API文档生成工具_快速生成接口文档
如何在云虚拟主机上快速搭建个人网站?
已有域名和空间如何快速搭建网站?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
ppt制作免费网站有哪些,ppt模板免费下载网站?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
已有域名能否直接搭建网站?
如何选择靠谱的建站公司加盟品牌?
高防服务器如何保障网站安全无虞?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
微信小程序 input输入框控件详解及实例(多种示例)
香港服务器建站指南:免备案优势与SEO优化技巧全解析
建站之星×万网:智能建站系统+自助建站平台一键生成
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
贸易公司网站制作流程,出口贸易网站设计怎么做?
海南网站制作公司有哪些,海口网是哪家的?
油猴 教程,油猴搜脚本为什么会网页无法显示?
北京专业网站制作设计师招聘,北京白云观官方网站?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
如何选择适合PHP云建站的开源框架?
javascript基本数据类型及类型检测常用方法小结
如何在服务器上配置二级域名建站?
如何在服务器上三步完成建站并提升流量?
建站之星图片链接生成指南:自助建站与智能设计教程
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何快速配置高效服务器建站软件?
如何选择网络建站服务器?高效建站必看指南
网站制作公司,橙子建站是合法的吗?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
*请认真填写需求信息,我们会在24小时内与您取得联系。