Android自定义View绘制贝塞尔曲线的方法

 更新时间:2022年06月29日 14:42:10   作者:小北的博客  
这篇文章主要为大家详细介绍了Android自定义View绘制贝塞尔曲线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

本文实例为大家分享了Android自定义View绘制贝塞尔曲线的具体代码,供大家参考,具体内容如下

在平面内任选 3 个不共线的点,依次用线段连接。

在第一条线段上任选一个点 D。计算该点到线段起点的距离 AD,与该线段总长 AB 的比例。

根据上一步得到的比例,从第二条线段上找出对应的点 E,使得 AD:AB = BE:BC。

连接这两点 DE。

从新的线段 DE 上再次找出相同比例的点 F,使得 DF:DE = AD:AB = BE:BC。

到这里,我们就确定了贝塞尔曲线上的一个点 F。接下来,请稍微回想一下中学所学的极限知识,让选取的点 D 在第一条线段上从起点 A 移动到终点 B,找出所有的贝塞尔曲线上的点 F。所有的点找出来之后,我们也得到了这条贝塞尔曲线。

回过头来看这条贝塞尔曲线,为了确定曲线上的一个点,需要进行两轮取点的操作,因此我们称得到的贝塞尔曲线为二次曲线(这样记忆很直观,但曲线的次数其实是由前面提到的伯恩斯坦多项式决定的)。

三个点的基本关系如下:

Android 的Path类提供了绘制二阶贝塞尔曲线的方法,使用方法如下:

public class CurveView extends View{

? ? private float mSupX;
? ? private float mSupY;

? ? private int mWidth;
? ? private int mHeight;

? ? private Paint mPaint;
? ? private Path mPath;

? ? public CurveView(Context context) {
? ? ? ? super(context);
? ? }

? ? public CurveView(Context context, AttributeSet attrs) {
? ? ? ? super(context, attrs, 0);
? ? ? ? mPaint = new Paint();
? ? ? ? mPaint.setStyle(Paint.Style.STROKE);
? ? ? ? mPaint.setStrokeWidth(10);
? ? ? ? mPath = new Path();
? ? }

? ? @Override
? ? protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
? ? ? ? int widthSize = MeasureSpec.getSize(widthMeasureSpec);
? ? ? ? int widthMode = MeasureSpec.getMode(widthMeasureSpec);
? ? ? ? int heightSize = MeasureSpec.getSize(heightMeasureSpec);
? ? ? ? int heightMode = MeasureSpec.getMode(heightMeasureSpec);
? ? ? ? if (widthMode == MeasureSpec.EXACTLY) {
? ? ? ? ? ? mWidth = widthSize;
? ? ? ? }
? ? ? ? if (heightMode == MeasureSpec.EXACTLY) {
? ? ? ? ? ? mHeight = heightSize;
? ? ? ? }
? ? ? ? setMeasuredDimension(mWidth, mHeight);
? ? }

? ? @Override
? ? protected void onDraw(Canvas canvas) {
? ? ? ? mPath.reset();
? ? ? ? mPath.moveTo(mWidth / 5, mHeight / 2); ?//设置起点
? ? ? ? mPath.quadTo(mSupX, mSupY, mWidth * 4 / 5, mHeight / 2); ?//设置辅助点和终点
? ? ? ? canvas.drawPath(mPath, mPaint);
? ? ? ? canvas.drawPoint(mSupX, mSupY, mPaint);
? ? ? ? super.onDraw(canvas);
? ? }

? ? @Override
? ? public boolean onTouchEvent(MotionEvent event) {
? ? ? ? switch (event.getAction()){
? ? ? ? ? ? case MotionEvent.ACTION_MOVE:
? ? ? ? ? ? ? ? mSupX = event.getX();
? ? ? ? ? ? ? ? mSupY = event.getY();
? ? ? ? ? ? ? ? invalidate();
? ? ? ? }
? ? ? ? return true;
? ? }
}

Draw以后效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。

相关文章

  • Android  selector的实例详解

    Android selector的实例详解

    这篇文章主要介绍了Android selector的实例详解的相关资料,这里提供实例帮助大家理解掌握这部分知识,需要的朋友可以参考下
    2017-08-08
  • Android WebView与JS交互全面详解(小结)

    Android WebView与JS交互全面详解(小结)

    本篇文章主要介绍了Android WebView与JS交互全面详解(小结),实现了Android客户端与Web网页交互,具有一定的参考价值,有兴趣的可以了解一下
    2017-11-11
  • Android使用GridView实现表格分割线效果

    Android使用GridView实现表格分割线效果

    这篇文章主要为大家详细介绍了Android使用GridView实现表格分割线效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Android 3D旋转动画效果实现分解

    Android 3D旋转动画效果实现分解

    如何实现View的3D旋转效果,实现的主要原理就是围绕Y轴旋转,同时在Z轴方面上有一个深入的缩放,具体实现代码如下,感兴趣的朋友可以参考下哈
    2013-06-06
  • android事件分发机制的实现原理

    android事件分发机制的实现原理

    本篇文章主要介绍了android事件分发机制的实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Android原生视频播放VideoView的使用

    Android原生视频播放VideoView的使用

    这篇文章主要为大家详细介绍了Android原生视频播放VideoView的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Android图片占用内存全面分析

    Android图片占用内存全面分析

    这篇文章主要介绍了Android图片占用内存全面分析,需要的朋友可以参考下
    2014-03-03
  • Android编程之菜单实现方法

    Android编程之菜单实现方法

    这篇文章主要介绍了Android编程之菜单实现方法,以实例形式较为详细的分析了Android编程实现菜单的布局及功能相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android如何从实现到封装一个MVP详解

    Android如何从实现到封装一个MVP详解

    原生的 MVC 框架遇到大规模的应用,就会变得代码难读,不好维护,无法测试的囧境。因此,Android 开发方面也有很多对应的框架来解决这些问题。所以这篇文章主要给大家介绍了关于Android如何从实现到封装一个MVP的相关资料,需要的朋友可以参考下。
    2017-09-09
  • 在Android中如何使用DataBinding详解(Kotlin)

    在Android中如何使用DataBinding详解(Kotlin)

    这篇文章主要给大家介绍了关于在Android中如何使用DataBinding(Kotlin)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论

?


http://www.vxiaotou.com