1. 程式人生 > >Android開發之Path的高階用法用貝塞爾曲線繪製波浪線

Android開發之Path的高階用法用貝塞爾曲線繪製波浪線

前言:貝塞爾曲線分為一級曲線,二級曲線,三級曲線和多級曲線,利用貝塞爾曲線可以做出很多有意思的動畫和圖形,今天我們就來實現一個比較簡單的波浪線。

-----------------分割線---------------

初步認識貝塞爾曲線:

mPath.moveTo:設定起點。

mPath.rQuadTo:繪製曲線。

注意:第二個mPath.rQuadTo相對於自己的起始點--也即是上一個曲線的終點。

mPath.lineTo:閉合。

我們也可以使用path.quadTo(x1, y1, x2, y2)繪製二級貝塞爾曲線。

ok看完整程式碼:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.View;

/**
 * Created by Fly on 2017/6/14.
 */

public class MyView extends View {

    Paint mPaint;
    Path mPath;

    public MyView(Context context) {
        super(context);
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(10);
        mPath = new Path();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPath.moveTo(100, 400);
        mPath.rQuadTo(100, -150, 200, 0);
        mPath.rQuadTo(100, 150, 200, 0);
        mPath.lineTo(100, 400);
        canvas.drawPath(mPath, mPaint);
    }
}
效果圖:


---------------分割線---------------

如果想畫動態的波浪線,需要我們不斷的改變起點,廢話不說直接看程式碼:

import android.animation.ValueAnimator;
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.view.View;
import android.view.animation.LinearInterpolator;

import java.util.Random;

/**
 * Created by Fly on 2017/6/13.
 */

public class WaveView2 extends View {

    private Paint mPaint;
    private Path mPath;
    private int mWaveLength = 100;
    private int dx;
    private int dy;

    public WaveView2(Context context) {
        super(context);
        init();
    }

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

    private void init() {
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(10);
        mPath = new Path();
    }

    int s = 50;

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPath.reset();
        int originY = 300;
        int mWaveHalfLength = mWaveLength / 2;
        mPath.moveTo(-mWaveLength + dx, originY);

        int max = 60;
        int min = 40;
        int maxW = 120;
        int minW = 80;
        Random random = new Random();
        try {
            Thread.sleep(500);
            s = random.nextInt(max) % (max - min + 1) + min;
            mWaveLength = random.nextInt(maxW) % (maxW - minW + 1) + minW;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        //螢幕的寬度裡面放多少個波長
        for (int i = -mWaveLength; i < getWidth() + mWaveLength; i += mWaveLength) {
            //相對繪製二階貝塞爾曲線(相對於自己的起始點--也即是上一個曲線的終點  的距離dx1)
            mPath.rQuadTo(mWaveHalfLength / 2, -s, mWaveHalfLength, 0);
            mPath.rQuadTo(mWaveHalfLength / 2, s, mWaveHalfLength, 0);
            //			path.quadTo(x1, y1, x2, y2)
        }
        //顏色填充
        //畫一個封閉的空間
//        mPath.lineTo(getWidth(), getHeight());
//        mPath.lineTo(0, getHeight());
//        mPath.close();

        canvas.drawPath(mPath, mPaint);
    }

    public void startAnimation() {
        ValueAnimator animator = ValueAnimator.ofInt(0, mWaveLength);
        animator.setDuration(1000);
        animator.setInterpolator(new LinearInterpolator());
        //無限迴圈
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                dx = (int) animation.getAnimatedValue();
                postInvalidate();
            }
        });
        animator.start();
    }
}
然後在MainActivity中開啟動畫:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WaveView2 waveView = (WaveView2) findViewById(R.id.wv);
        waveView.startAnimation();
    }
}
佈局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <com.fly.lsn35_waveview.WaveView2
        android:id="@+id/wv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
效果:


---------------------完-----------------

相關推薦

Android開發Path高階用法曲線繪製波浪

前言:貝塞爾曲線分為一級曲線,二級曲線,三級曲線和多級曲線,利用貝塞爾曲線可以做出很多有意思的動畫和圖形,今天我們就來實現一個比較簡單的波浪線。 -----------------分割線--------------- 初步認識貝塞爾曲線: mPath.moveTo:設定起點

Android 高階UI解密 (四) :花式玩轉曲線波浪、軌跡變換動畫)

講解此UI系列必然少不了一個奇妙數學曲線—–貝塞爾曲線,它目前運用於App的範圍是在太廣了,最初的QQ氣泡拖拽,到個人介面的波浪效果、Loading波浪效果,甚至於軌跡變化的動畫都可以依賴貝塞爾曲線完成,多麼完美的曲線,妙也! 此篇文章並不自己造輪子實現貝塞爾

Path使用--二階曲線實現水波效果

上面這個效果是使用Path繪製二階貝塞爾曲線實現的;二階貝塞爾曲線涉及到三個點,起始點、拐點、終點,而拐點有決定著曲線的形狀;下面這張圖大致展示了二階貝塞爾曲線: A點是起始點,C點是終點,B點是拐點,當然根據繪製的需求,B是變動的,繪製出來的曲線也就

一個精美的跳動小球—手把手教你曲線實現一個酷炫跳動動畫。

前言介紹 手把手教你用貝塞爾曲線實現一個精美的跳動的小球。 正文 效果展示: 說點題外話 一開始呢,我就想實現一個這樣的效果,於是就新建了一個專案開始擼,結果中間嘗試了幾種實現方案都不是很理想,也有一些條件未能實現就停止開發了,後面又去惡補了一下相關知識,突然在某一天的某一刻的某一瞬間靈感來了

利用GDI+、曲線繪製一個帶曲線的矩形

{     const int splitHeigtSeg = 8;     const int splitWidthSeg = 5;     Graphics graphics(pDC->GetSafeHdc());     GraphicsPath  path;     CPoint ptCurve

微信小程式---通過二次曲線波浪

這兩週做一個新的專案,人員比較緊張,除了需求和UI,前端後端一個人來幹。 在專案需求確定後,UI隔了幾天設計出了UI介面,拿到UI效果圖後見有一個介面有波浪效果的我當時就蒙圈了,這都啥玩意啊?轉念想到了最近在IT圈挺火的那個事件:產品要求安卓程式設計師實現根據使用者手機殼顏

Android開發曲線進階篇(仿直播送禮物,餓了麼購物車動畫)

又是一年畢業季,今年終於輪到我了,最近一邊忙著公司的專案,一邊趕著畢設和論文,還私下和朋友搞了些小外包,然後還要還抽出時間寫部落格,真是忙的不要不要的。 好了,言歸正傳,前幾天寫了一篇關於貝塞爾曲線的基礎篇,如果你對貝塞爾曲線還不是很瞭解,建議你先去閱讀下:Android開發之貝塞爾曲線初體驗 ,今天這篇文

安卓自定義View進階-Path曲線

在上一篇文章Path之基本操作中我們瞭解了Path的基本使用方法,本次瞭解Path中非常非常非常重要的內容-貝塞爾曲線。 一.Path常用方法表 為了相容性(偷懶) 本表格中去除了在API21(即安卓版本5.0)以上

Android開源專案解析】QQ“一鍵下班”功能實現解析——學習Path曲線的基本使用

早在很久很久以前,QQ就實現了“一鍵下班”功能。何為“一鍵下班”?當你QQ有資訊時,下部會有資訊數量提示紅點,點選拖動之後,就會出現“一鍵下班”效果。本文將結合github上關於此功能的一個簡單實現,介紹這個功能的基本實現思路。 專案地址

Android仿蘋果版QQ下拉重新整理實現(二) ——曲線開發"鼻涕"下拉粘連效果

前言 下面上一下本章需要實現的效果圖: 大家看到這個效果肯定不會覺得陌生,QQ已經把粘滯效果做的滿大街都是,相信不少讀者或多或少對於貝塞爾曲線有所瞭解,不瞭解的朋友們也沒有關係,在這裡我會帶領讀者領略一下貝塞爾的魅力! 一、關於貝塞爾曲線 我們知道

Android 繪圖基礎:Path繪製三角形、曲線、正餘弦)

學習重點: 理解path的使用 理解貝塞爾曲線的繪製原理 可動正餘弦的繪製 Path的簡單介紹   在 Android 繪圖基礎:Canvas畫布——自定義View(繪製錶盤、矩形、圓形、弧、漸變) 中我們可以看到Canvas的強大功能,其實Canva

Android 自定義View高階特效,神奇的曲線

初始化引數 private static final String TAG = "BIZIER"; private static final int LINEWIDTH = 5; private static final int POINTWIDTH = 10; private Context mContex

Android開發——曲線解析

相信很多同學都知道“貝塞爾曲線”這個詞,我們在很多地方都能經常看到。利用“貝塞爾曲線”可以做出很多好看的UI效果,本篇部落格就讓我們一起學習“貝塞爾曲線”。貝塞爾曲線的原理貝塞爾曲線是用一系列點來控制曲線狀態的,這些點簡單分為兩類:型別作用資料點確定曲線的起始和結束位置控制點確定曲線的彎曲程度一階貝塞爾曲線 

android高階動畫——曲線

Android高階動畫所有程式碼 簡介:貝塞爾曲線是計算機圖形學中相當重要的引數曲線。可以用數學公式來描述一段曲線。 用途:1、貝塞爾曲線可以幫助我們在二維平面內用平滑的曲線畫出各種圖形。 2、同時也可以給動畫提供一個平滑的曲線運動路徑。 android中我們通過Path可

Android 自定義Path曲線View實踐——旋轉的花朵

開發十年,就只剩下這套架構體系了! >>>   

Android曲線應用-跳動的水滴

dir 貝塞爾曲線 href 完成 通過 android load 繪制 canvas 主要通過6個控制點實現。 val startPoint = PointF() val endPoint = PointF() val control1 = PointF() val c

Quartz 2d CGContextRef 繪製各種圖形 (文字、圓、直線、弧線、矩形、扇形、橢圓、三角形、圓角形、曲線、圖片)

首先了解下 CGContextRef  Graphics Context是圖形上下文,可以將其理解為一塊畫布,我們可以在上面進行繪畫操作,繪製完成後,將畫布放到我們的View 中顯示即可,View看著是一個畫框。 自己學習時實現的Demo,希望對大家有幫助,具體的實現看程式碼,並有

【Unity3d遊戲開發】遊戲中的曲線以及其在Unity中的實現

轉載收藏:原文連結https://www.cnblogs.com/msxh/p/6270468.html 閱讀目錄 一、簡介 二、公式 三、實現與應用   RT,馬三最近在參與一款足球遊戲的開發,其中涉及到足球的各種運動軌跡和路徑,比如射門的軌跡,高吊球

曲線開發的藝術

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

專案開發中的曲線

本文由鄒啟文授權網易雲社群釋出。 郵箱大師PC版中,設計師提出了一個很妙的想法: 發信時,出現一個飛機,從寫信中央飛往進度目的地。  附加要求: 1,飛行曲線,飛機先加速,然後減速抵達終點 2,飛行途中,需要轉換飛機朝向 3,飛行途中,飛機漸漸變小