当前位置: 首页 > 编程笔记 >

Android曲线更圆滑的签名画板

盖夕
2023-03-14
本文向大家介绍Android曲线更圆滑的签名画板,包括了Android曲线更圆滑的签名画板的使用技巧和注意事项,需要的朋友参考一下

Android开发中,在自定义view中,使用Canvas的相应操作,实现类似签名的画板,但有一个问题则是,正常的Canvas操作可以用画板对手机的滑动进行绘制,但是当遇到一些圆滑曲线时,会显得不够顺滑,甚至有折角,这里可以使用二阶beizer曲线来使得曲线更加圆滑,提升用户体验。

定义一个自定义SignView,继承自View,在里面定义四个变量:

private Path mPath;
private Paint mPaint;
private float mX;
private float mY;

在构造方法里对路径和画笔进行初始化:

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

在onDraw()中对canvas做操作,这里值得一提的是调用drawColor方法,不然最终如果保存为本地图片的话,会使得背景为黑色,如果画笔也选择黑色的话,则会成一张全黑的图片:

@Override
protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 canvas.drawColor(Color.WHITE);
 canvas.drawPath(mPath, mPaint);
}

接下来重写onTouchEvent方法:

@Override
 public boolean onTouchEvent(MotionEvent event) {
  switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:
    mX = event.getX();
    mY = event.getY();
    mPath.moveTo(mX, mY);
    break;
   case MotionEvent.ACTION_MOVE:
    float x1 = event.getX();
    float y1 = event.getY();
    float cx = (x1 + mX) / 2;
    float cy = (y1 + mY) / 2;
    mPath.quadTo(mX, mY, cx, cy);
    mX = x1;
    mY = y1;
    break;
  }
  invalidate();
  return true;
 }

手指按下时,取得按下的坐标,移动的时候,得到当前左边,且取两点中间的cx,cy作为beizer曲线的控制点,然后调用quadTo方法绘制二阶beizer曲线,进行连线操作,最终则是调用invalidate方法进行重绘。

这样一个使连线更加圆滑的画板控件简单实现了,如果需要保存为本地,或者bitmap对象,则需要做其他一些额外的操作了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 创建一个形状为椭圆的曲线。 将xRadius与yRadius设为相等的值它将会成为一个圆。 代码示例 const curve = new THREE.EllipseCurve( 0, 0, // ax, aY 10, 10, // xRadius, yRadius 0, 2 * Math.PI, // aStartAngle, aEndA

  • 本文向大家介绍C#画笔Pen绘制光滑模式曲线的方法,包括了C#画笔Pen绘制光滑模式曲线的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#画笔Pen绘制光滑模式曲线的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我正在尝试实现ECDSA(椭圆曲线数字签名算法),但是在Java中找不到使用Bouncy Castle的示例。我创建了密钥,但是我真的不知道我应该使用哪种功能来创建签名并进行验证。 问题答案: owlstead是正确的。要详细说明,您可以执行以下操作: 并验证:

  • 问题内容: 我正在尝试为椭圆曲线创建自己的库。有些事情行得通,但有些则行不通。 要根据私钥计算公钥,应将生成器点乘以私钥,然后得到另一个点:公钥点(ECPoint = BigInteger * ECPoint)。 现在,我有一个私钥,并将其与Secp256k1曲线的生成器点相乘。我得到一个钥匙,但这不是我应该得到的钥匙。 这是我的JAVA代码: 我的代码有问题吗?secp256k1是否有特定的乘法

  • 我们刚刚已经在节点上挂载了动画剪辑,现在我们可以在动画剪辑中创建一些动画曲线了。 我们首先了解一下动画属性,动画属性包括了节点自有的 position、rotation 等属性,也包含了组件 Component 中自定义的属性。 组件包含的属性前会加上组件的名字,比如 cc.Sprite.spriteFrame。 比如下图的 position 那条就是属性轨道,而对应的蓝色菱形就是关键帧。 添加一

  • 我们已经创建了基本的动画了。 但有时候我们会需要在两帧之间实现 EaseInOut 等缓动效果,那么在动画编辑器中怎么实现呢? 我们首先需要在一条轨道上创建两个不相等的帧,比如在 position 上创建两帧,从 0,0 到 100,100。 这时候两帧之间会出现一根连接线(连接关键帧之间的蓝色线段),双击连接线,可以打开曲线编辑器。 曲线编辑器打开时,如果当前的动画曲线数据是预设里的,左边的预设