`

QuadView贝塞尔View

阅读更多
不知从什么时候起,码农们都热衷于果冻、粘黏、水滴效果了,认为效果很酷很新奇
但是只是用而已,知道原理的并不多
本篇将实现一个最基本的效果(我也不知道该叫什么效果),见图



原理很简单,就是利用的了Path的quadTo方法,该函数用于绘制贝塞尔曲线

我懒得打字了,直接看代码:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

/**
 * 贝塞尔View
 * 
 * @author pythoner
 */
public class QuadView extends View implements Runnable {
	private final String tag = "tag";
	private int SLEEP_TIME = 10;
	private boolean isRunning = false;
	private int detalY = 20;// 每循环一次拉下的幅度增量值
	private int maxY = 800;// 允许下拉的最大距离

	private Path path;
	private Paint paint;

	private int y = 0;
	private int w;// view的宽

	public QuadView(Context context) {
		super(context);
	}

	public QuadView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public QuadView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
	}

	public void init() {
		w = getWidth();
		paint = new Paint();
		paint.setAntiAlias(true);
		paint.setColor(Color.RED);
		paint.setStrokeWidth(10);
		paint.setStyle(Paint.Style.FILL);

		path = new Path();
		setPath();

	}

	@Override
	public void onDraw(Canvas c) {
		super.onDraw(c);

		c.save();
		c.drawColor(Color.WHITE);
		c.drawPath(path, paint);
		c.restore();
	}

	private float oldY = 0;

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			if (isRunning) {// 线程正在运行的时候打断,把任务交给手势处理
				isRunning = false;
			}
			oldY = event.getY();
			invalidate();
			break;
		case MotionEvent.ACTION_MOVE:
			float newY = event.getY();
			if (newY - oldY > 5) {// 向下拉
				if (y < maxY) {
					y += detalY;
				}
				setPath();
				invalidate();
			} else if (newY - oldY < -5) {// 向上拉
				y -= detalY;
				if (y < 0) {
					y = 0;
				}
				setPath();
				invalidate();
			}
			oldY = newY;
			break;
		case MotionEvent.ACTION_UP:
		case MotionEvent.ACTION_CANCEL:
			if (!isRunning) {// 线程正在运行的时候,不允许重复执行
				Thread t = new Thread(this);
				t.start();
			}
			break;

		default:
			break;
		}

		return true;
	}

	@Override
	protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
		// TODO Auto-generated method stub
		super.onLayout(changed, left, top, right, bottom);
		Log.i(tag, "=========onLayout===========");
		init();
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// TODO Auto-generated method stub
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		Log.i(tag, "=========onMeasure===========");
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		isRunning = true;
		while (isRunning) {
			long start = System.currentTimeMillis();
			if (y > 0) {
				y -= detalY;
			} else {
				isRunning = false;
			}
			setPath();
			postInvalidate();// 相当于repaint
			long end = System.currentTimeMillis();
			if (end - start < SLEEP_TIME) {
				try {
					Thread.sleep(SLEEP_TIME - (end - start));
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	private void setPath() {
		path.reset();
		path.moveTo(0, 0);
		path.quadTo(w >> 1, y, w, 0);
	}
}


手指下拉,红色区域会呈水滴状出现,释放后又返回到初始状态。
  • 大小: 32.7 KB
分享到:
评论

相关推荐

    Android自定义View——贝塞尔曲线实现直播点赞效果

    Android自定义View——贝塞尔曲线实现直播点赞效果 Android自定义View——贝塞尔曲线实现直播点赞效果

    贝塞尔函数一阶图像_1阶贝塞尔函数_贝塞尔函数_matlab_

    贝塞尔函数是数学和计算机图形学中的一个重要概念,特别是在曲线和曲面的构造中起着核心作用。在MATLAB环境中,我们可以轻松地实现贝塞尔函数的可视化,这正是标题和描述所提及的内容。 贝塞尔函数,由法国工程师...

    Android自定义View——贝塞尔曲线实现水波纹效果

    Android自定义View——贝塞尔曲线实现水波纹效果

    Android 属性动画使控件沿贝塞尔曲线移动

    在项目"Android 属性动画使控件沿贝塞尔曲线移动"中,BZDemo可能包含了一个自定义的View或Animation类,用于处理动画逻辑。这个类会根据输入的控制点、动画时长和幅度计算出每个帧的位置,然后通过ObjectAnimator或...

    besslj_beanwdd_贝塞尔光束_光束_Beisaier_贝塞尔光束

    贝塞尔光束是一种特殊的光学现象,它在许多领域,如激光技术、光学设计和成像系统中具有重要的应用。在本资源中,我们看到的是与贝塞尔光束相关的MATLAB代码,这是一组用于模拟和分析贝塞尔光束的程序。 贝塞尔光束...

    EXCELVBA贝塞尔曲线及插值_贝塞尔平滑_EXCELVBA贝塞尔曲线及插值_excelvba插值_

    在Excel VBA编程中,贝塞尔曲线是一种常用于数据可视化和图形设计的技术,它通过一组控制点来定义平滑曲线。这种曲线在工程、艺术、游戏开发等领域都有广泛应用。本主题将深入探讨如何在Excel VBA中实现贝塞尔曲线...

    圆弧与贝塞尔曲线互相转换

    在计算机图形学和CAD/CAM(计算机辅助设计/计算机辅助制造)系统中,圆弧与贝塞尔曲线之间的互相转换是一个常见的问题。在不同格式的数据交换过程中,由于各种数据格式对曲线类型的支持各不相同,需要将标准圆形弧...

    untiy贝塞尔曲线脚本

    Unity中的贝塞尔曲线是一种强大的工具,常用于游戏开发中的路径规划、动画设计和图形渲染等方面。这个资源包提供了一个方便的方式来创建和控制不同类型的贝塞尔曲线。以下是对每个文件的详细解释: 1. **...

    贝塞尔函数_滤波_贝塞尔_

    贝塞尔函数是数学和计算机图形学中的一个重要工具,尤其在信号处理和滤波领域有着广泛的应用。本资料包主要探讨了贝塞尔函数及其在滤波技术中的应用,并提供了MATLAB程序来直观展示贝塞尔函数的特性。 首先,我们来...

    贝塞尔函数根分布及其导数.zip_bezier_导数_贝塞尔_贝塞尔函数 根_贝塞尔函数根

    求第一类贝塞尔函数的根分布及其它的导数图形

    java android 贝塞尔曲线计算

    贝塞尔曲线在计算机图形学中是一种非常重要的曲线表示方法,特别是在Android应用开发中,它广泛用于动画、游戏、用户界面设计等领域。Java Android贝塞尔曲线计算涉及到数学、图形学以及多线程编程等多个知识点。 ...

    贝塞尔函数

    贝塞尔函数贝塞尔函数的有关公式 贝塞尔方程 的持解Bp(z)为(柱)贝塞尔函数。有 第一类柱贝塞尔函数Jp(z) p为整数n时,Jn=(1) nJn; p不为整数时,Jp与Jp线性无关。 第二类柱贝塞尔函数N p(z)(柱诺依曼函数) ...

    HTML实现贝塞尔曲线

    贝塞尔曲线,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)提出,是一种在二维平面上通过控制点定义的参数曲线。这种曲线在Web设计中尤其有用,因为它可以提供平滑、连续的过渡效果,如在页面过渡动画、路径绘制或...

    2次贝塞尔曲线算法

    **二次贝塞尔曲线算法详解** 二次贝塞尔曲线是计算机图形学中常用的一种平滑曲线生成方法,它由三个点定义:起始点P0、结束点P2以及一个控制点P1。通过这三个点,我们可以计算出一系列点,这些点连接起来形成的曲线...

    Android 贝塞尔曲线动画 拿去直接用

    4. 更新视图:在每一帧动画中,都需要重绘`View`以显示曲线的变化。 5. 响应事件:可能还需要添加触摸事件监听,以便用户可以交互地改变贝塞尔曲线的形状。 在实际应用中,贝塞尔曲线动画可以用于各种场景,如滑块...

    BezierCurve 贝塞尔曲线计算 c++源码

    贝塞尔曲线(Bezier Curve)是一种在计算机图形学中广泛应用的参数曲线,特别是在二维和三维建模、动画制作、游戏开发以及CAD系统中。它由法国工程师Pierre Bezier于1962年提出,因其简单易用且能够精确地控制曲线...

    贝塞尔曲线原理及其算法实现

    贝塞尔曲线原理及其算法实现是计算机图形学中的一个重要概念,主要应用于二维和三维图形的设计与渲染。这种曲线形式被广泛采用,因为它具有直观性、灵活性、统一性和不变性等特点,使得设计者能够更加便捷地创建和...

    贝塞尔曲线脚本c#.zip

    贝塞尔曲线是一种在计算机图形学中广泛使用的数学工具,它能生成平滑、连续的曲线,常用于游戏开发、UI设计、3D建模等领域。C#是Microsoft开发的一种面向对象的编程语言,它被广泛应用于Unity游戏引擎,提供强大的...

    贝塞尔曲线

    6. **自定义View**:开发者可以创建自定义的View,利用贝塞尔曲线实现各种复杂的图形和交互效果,如波浪形进度条、动态图标等。 7. **绘图库支持**:Android社区提供了许多第三方绘图库,如`NineOldAndroids`和`...

    Android贝塞尔曲线绘制心形

    通过掌握自定义View和贝塞尔曲线的使用,开发者能够实现更加个性化和吸引人的用户体验。此外,理解这些基础知识还有助于进一步学习更复杂的图形绘制和动画效果,如SVG解析、Canvas的其他绘图操作以及动画框架如`...

Global site tag (gtag.js) - Google Analytics