Android 在Canvas中實現畫筆效果(一)--鋼筆


如題:

公司要求做一個塗鴉板,要有鋼筆、毛筆等畫筆效果,網上搜了很多,可是效果不怎么好,決定自己研究下。廢話不多說,進入正題。

首先,賽貝爾曲線弄明白了,在畫曲線的過程中就是一條條的向量。

第二,曲線在畫的過程中要有粗細變化(就是簡單的實現)

第三,在原有向量的兩側也畫兩個兩向量A1B1、A2B2。如下圖:

   

上圖中,線段A1A2的長度跟畫筆移動速度存在f1(x)的關系。黑色曲線是向量AB通過賽貝爾畫出來的效果。

下面介紹畫筆實現的邏輯:

為了實現畫筆效果,其實就是一共畫了三條賽貝爾曲線,分別根據向量A1B1,AB,A2B2所得(見上圖)。A1、A2是通過AB向量求得的,A點是向量A1A2的中點,AB垂直於A1B1。

再經過多次測試后,我找到了計算A1A2長度值是比較關鍵的問題,單純的靠一個線性函數算出來的結果顯示很糟糕。個人推薦:利用正選函數或者余弦函數的變化來求得。代碼如下:

<span style="white-space:pre">    </span>private final float KEY_PAINT_WIDTH=2.5f;//當速度很慢時,畫出的曲線為畫筆寬度的多少倍,此值經過測試不會有間隙或者很小。
    /**
     * 根據變化的余弦函數y=0.5*[cos(x*PI)+1](0<x<1),將速度轉化為畫筆寬度的2.5倍。
     * x<0,寬度為最大寬度,2.5倍畫筆寬度
     * 0<x<1,根據上面函數,進行轉化
     * x>1,根據函數y=width/x,當y<0.2時,取最小值0.2
     * @param delayTime
     * @return
     */
    private float controlPaint(double v){
        //余弦函數
        //y=0.5*[cos(x*PI)+1]
        float result=KEY_PAINT_WIDTH*paintSize;
        if(v<0){
        }else if(v<1){
            result=(float) (0.5*paintSize*KEY_PAINT_WIDTH*(Math.cos(v*Math.PI)+1));
        }else{
            result=((float) (paintSize/v>0.1?paintSize/v:0.1));
        }
        return result;
    }

 轉化函數需要根據自己測定的畫筆速度的合適值進行相應的轉化,這里不做過多贅述。

實現書寫的效果如下圖(測試在平板(分辨率1280*800)):

原文地址:http://blog.csdn.net/sbduxing/article/details/39343465

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM