Android-貝塞爾曲線實現水波紋動畫
Android 系統api提供了quadTo和rQuadTo實現二階貝塞爾曲線,三階貝塞爾曲線在這不做闡述,只不過是兩個控制點。
原始碼地址:
效果圖
首先看張二階貝賽爾的曲線
Path path = new Path();
//貝賽爾的起始點moveTo(x,y)
path.moveTo(getWidth() / 2 - 200, getHeight() / 2);
//quadTo 引數講解(x1,y1,x2,y2)
//x1:控制點x座標
//y1:在控制點y座標
//x2:終點x座標
//y2:終點y座標
path.quadTo(getWidth() / 2 - 100, getHeight() / 2 - 100, getWidth() / 2, getHeight() / 2);
path.quadTo(getWidth() / 2 + 100, getHeight() / 2 + 100, getWidth() / 2 + 200, getHeight() / 2);
canvas.drawPath(path, mPaint);
quadTo和rQuadTo的區別
//rQuadTo引數講解(dx1,dy1,dx2,dy2):
//dx1:控制點相對起點的x位移
//dy1:控制點相對起點的y位移
//dx2:終點相對起點的x位移
/dy2:終點相對起點的y位移
path.moveTo(getWidth() / 2 - 200, getHeight() / 2);
path.rQuadTo(100, -100, 200, 0);
path.rQuadTo(100, 100, 200, 0);
canvas.drawPath(path, mPaint);
效果一樣,在這就不貼圖了。
quadTo引數講解(x1,y1,x2,y2):x1:控制點x座標,y1:在控制點y座標,x2:終點x座標,y2:終點y座標
rQuadTo引數講解(dx1,dy1,dx2,dy2):dx1:控制點相對起點的x位移,dy1:控制點相對起點的y位,dx2:終點相對起點的x位移,dy2:終點相對起點的y位移
實現水波紋動態效果無非是曲線向左一個偏移量dx,看過去想凹凸的曲線,於是形成了水波紋動態效果。看程式碼。
實現水波紋動態的效果
public class WaveView extends View {
private Paint mPaint;
private int mWidth;
private int mHeight;
private int mWaveHeight;
private int mWaveDx;
private int dx;
public WaveView(Context context) {
this(context, null);
}
public WaveView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public WaveView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(Color.parseColor("#FF3891"));
mPaint.setStyle(Paint.Style.FILL);
//波長的的長度(這裡設定為螢幕的寬度)
mWaveDx = getResources().getDisplayMetrics().widthPixels;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//控制元件的寬高
mWidth = MeasureUtils.measureView(widthMeasureSpec, mWaveDx);
mHeight = MeasureUtils.measureView(heightMeasureSpec, 300);
//水波的高度
mWaveHeight = DensityUtil.dip2px(getContext(), 16);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawWave(canvas);
}
private void drawWave(Canvas canvas) {
Path path = new Path();
path.reset();
path.moveTo(-mWaveDx + dx, mHeight / 2);
for (int i = -mWaveDx; i < getWidth() + mWaveDx; i += mWaveDx) {
path.rQuadTo(mWaveDx / 4, -mWaveHeight, mWaveDx / 2, 0);
path.rQuadTo(mWaveDx / 4, mWaveHeight, mWaveDx / 2, 0);
}
path.lineTo(mWidth, mHeight);
path.lineTo(0, mHeight);
//path.close() 繪製封閉的區域
path.close();
canvas.drawPath(path, mPaint);
}
public void startAnimation() {
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, mWaveDx);
valueAnimator.setDuration(2000);
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//水平方向的偏移量
dx = ( int ) animation.getAnimatedValue();
invalidate();
}
});
valueAnimator.start();
}
}
核心程式碼是drawWave()這個方法,startAnimation()是一個水平方向動畫,偏移量是dx,在Activity中呼叫。水波紋的高度(就是貝塞爾曲線的高度),顏色、大小都可以自定義。小編沒有寫,整個繪製水波紋動畫效果的思路和清晰。主要是搞懂quadTo和rQuadTo的區別和引數的意思。有問題可以留言!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/132/viewspace-2815567/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- canvas實現高階貝塞爾曲線Canvas
- 使用二階貝塞爾曲線實現新增購物車動畫動畫
- 貝塞爾曲線的css實現——淘寶加入購物車基礎動畫CSS動畫
- 貝塞爾曲線(Bezier curve)實現節點連線
- Android 貝塞爾曲線Android
- 用canvas繪製一個曲線動畫——深入理解貝塞爾曲線Canvas動畫
- 貝塞爾曲線原理、推導及Matlab實現Matlab
- 貝塞爾曲線基礎部分
- UIBezierPath貝塞爾曲線UI
- 貝塞爾曲線理解與應用
- iOS UIBezierPath 貝塞爾曲線iOSUI
- 簡易製作貝塞爾曲線動畫(JS+css3+canvas)動畫JSCSSS3Canvas
- 如何理解並應用貝塞爾曲線
- Android 自定義貝塞爾曲線工具Android
- 貝塞爾曲線開發的藝術
- canvas bezierCurveTo() 三次貝塞爾曲線Canvas
- iOS UIBezierPath貝塞爾曲線常用方法iOSUI
- 使用貝塞爾曲線裁圓優化tableView優化View
- Path從懵逼到精通(2)——貝塞爾曲線
- js控制貝塞爾曲線程式碼例項JS線程
- 安卓自定義 View 進階:貝塞爾曲線安卓View
- 自定義View合輯(6)-波浪(貝塞爾曲線)View
- canvas 二次貝塞爾曲線quadraticCurveTo()Canvas
- SVG <path> C 指令 三次貝塞爾曲線SVG
- SVG <path> Q指令 二次貝塞爾曲線SVG
- webGL入門-四階貝塞爾曲線繪製Web
- html5中canvas繪製貝塞爾曲線HTMLCanvas
- iOS開發之畫圖板(貝塞爾曲線)iOS
- Android水波紋效果實現Android
- Android日常學習:OpenGL 實踐之貝塞爾曲線繪製Android
- 【Flutter高階玩法】 貝塞爾曲線的表象認知Flutter
- Flutter 自定義元件之貝塞爾曲線畫波浪球Flutter元件
- canvas基礎[二]教你編寫貝塞爾曲線工具Canvas
- SVG <path>元素C指令三次貝塞爾曲線SVG
- SVG <path>元素Q指令二次貝塞爾曲線SVG
- html5中canvas貝塞爾曲線繪製菊花HTMLCanvas
- bezierMaker.js——N階貝塞爾曲線生成器JS
- 一個貝塞爾曲線編輯工具(2d)