Android如何繪製絢麗的彩色筆跡?

越炫酷越好


確認
取消
邀請回答

我來回答

1條回答
時間排序
|
熱門排序

米拉普拉斯

,Android工程師;冷笑話副社長;法律愛好者;...
放一張實現的圖片: ![](http://b.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=e4af3f4f07f41bd5da06e0f064eaadfd/a6efce1b9d16fdfa36e01e8abd8f8c5495ee7bc2.jpg)感謝一下百度派,作者:MiLaplace (米拉普拉斯)***Android 繪製最重要的兩個概...
查看全部
放一張實現的圖片:

![](http://b.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=e4af3f4f07f41bd5da06e0f064eaadfd/a6efce1b9d16fdfa36e01e8abd8f8c5495ee7bc2.jpg)

感謝一下百度派,

作者:MiLaplace (米拉普拉斯)

***

Android 繪製最重要的兩個概念是Canvas和Paint.

Canvas相當於一張畫布,而Paint相當於畫筆。

所以,我們要繪製絢麗的彩色筆跡主要取決於Paint.

|主題|描述|

|-|-|

|Style|描述該Paint用於描述繪製內容的哪個部分:填充或者邊框|

|Join|描述直線與曲線如何連接|

|Cap|描述路徑和線條的起始部分的形態|

|Align|文本如何對齊|

```

Paint paint = new Paint();

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeJoin(Paint.Join.ROUND);

paint.setStrokeCap(Paint.Cap.BUTT);

```

### Style

The Style specifies if the primitive being drawn is filled, stroked, or both (in the same color). The default is FILL.

指定了繪製的方式:填充,描邊或者兩者。默認行為為填充。

```

public enum Style {

FILL (0),

STROKE (1),

FILL_AND_STROKE (2);

Style(int nativeInt) {

this.nativeInt = nativeInt;

}

final int nativeInt;

}

```

參考效果:灰色描邊+藍色填充

![](http://a.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=e290ef5c72f40ad115b1cfe7621c3de9/b7fd5266d016092443f37a7fdd0735fae7cd3484.jpg)

我們只需要繪製線,所以使用Style.STROKE。

### Cap

The Cap specifies the treatment for the beginning and ending of stroked lines and paths. The default is BUTT.

筆帽用於指定繪製的起點和終點的表現形式,默認是Cap.BUTT

```

public enum Cap {

BUTT (0),

ROUND (1),

SQUARE (2);

private Cap(int nativeInt) {

this.nativeInt = nativeInt;

}

final int nativeInt;

}

```

![](http://g.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=11a84a96741ed21b799c26e1985ef1f2/91ef76c6a7efce1b0b2a13aea651f3deb48f6555.jpg)

筆尖請選擇 圓形。

### Join

The Join specifies the treatment where lines and curve segments join on a stroked path. The default is MITER.

如何對待連接點.

```

public enum Join {

MITER (0),

ROUND (1),

BEVEL (2);

private Join(int nativeInt) {

this.nativeInt = nativeInt;

}

final int nativeInt;

}

```

![](http://c.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=083dbf5bd0f9d72a17311819e11a0402/728da9773912b31ba220164d8f18367adab4e102.jpg)

連接點選擇圓形即可。

這個時候,我們還只是構建了基本的畫筆。

重點是絢麗,

個人認為絢麗表現在兩方面,一方面是顏色會變化,另外一方面是畫筆帶有其他效果。

那我就以帶發光的彩虹筆作為最終效果來講解吧。

我們將每一次按下和滑動的時候,繪製一條線:

MotionEvent.ACTION_DOWN 和 MotionEvent.ACTION_MOVE

```

Canvas.drawLine();

```

在完成了線段繪製之後,我們改變一下我們的顏色,朝著一個方向隨機的偏移一定數值。

注意,一定要使用hsv來進行變化,這樣可以保證顏色看起來變化很平滑。

```

int color = paint.getColor();

Color.colorToHSV(color, hsv);

hsv[0] += (Math.random() * 15 - 5);

hsv[0] = (hsv[0] + 360) % 360;

color = Color.HSVToColor(hsv);

paint.setColor(color);

```

但是,單單只有顏色的變化是還不夠的,要有發光的效果。

可以用邊緣模糊這一技術來完成發光的效果。

```

paint.setMaskFilter(new BlurMaskFilter());

```



放一張實現的圖片:

![](http://b.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=e4af3f4f07f41bd5da06e0f064eaadfd/a6efce1b9d16fdfa36e01e8abd8f8c5495ee7bc2.jpg)

感謝一下百度派,

作者:MiLaplace (米拉普拉斯)

***

Android 繪製最重要的兩個概念是Canvas和Paint.

Canvas相當於一張畫布,而Paint相當於畫筆。

所以,我們要繪製絢麗的彩色筆跡主要取決於Paint.

|主題|描述|

|-|-|

|Style|描述該Paint用於描述繪製內容的哪個部分:填充或者邊框|

|Join|描述直線與曲線如何連接|

|Cap|描述路徑和線條的起始部分的形態|

|Align|文本如何對齊|

```

Paint paint = new Paint();

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeJoin(Paint.Join.ROUND);

paint.setStrokeCap(Paint.Cap.BUTT);

```

### Style

The Style specifies if the primitive being drawn is filled, stroked, or both (in the same color). The default is FILL.

指定了繪製的方式:填充,描邊或者兩者。默認行為為填充。

```

public enum Style {

FILL (0),

STROKE (1),

FILL_AND_STROKE (2);

Style(int nativeInt) {

this.nativeInt = nativeInt;

}

final int nativeInt;

}

```

參考效果:灰色描邊+藍色填充

![](http://a.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=e290ef5c72f40ad115b1cfe7621c3de9/b7fd5266d016092443f37a7fdd0735fae7cd3484.jpg)

我們只需要繪製線,所以使用Style.STROKE。

### Cap

The Cap specifies the treatment for the beginning and ending of stroked lines and paths. The default is BUTT.

筆帽用於指定繪製的起點和終點的表現形式,默認是Cap.BUTT

```

public enum Cap {

BUTT (0),

ROUND (1),

SQUARE (2);

private Cap(int nativeInt) {

this.nativeInt = nativeInt;

}

final int nativeInt;

}

```

![](http://g.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=11a84a96741ed21b799c26e1985ef1f2/91ef76c6a7efce1b0b2a13aea651f3deb48f6555.jpg)

筆尖請選擇 圓形。

### Join

The Join specifies the treatment where lines and curve segments join on a stroked path. The default is MITER.

如何對待連接點.

```

public enum Join {

MITER (0),

ROUND (1),

BEVEL (2);

private Join(int nativeInt) {

this.nativeInt = nativeInt;

}

final int nativeInt;

}

```

![](http://c.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=083dbf5bd0f9d72a17311819e11a0402/728da9773912b31ba220164d8f18367adab4e102.jpg)

連接點選擇圓形即可。

這個時候,我們還只是構建了基本的畫筆。

重點是絢麗,

個人認為絢麗表現在兩方面,一方面是顏色會變化,另外一方面是畫筆帶有其他效果。

那我就以帶發光的彩虹筆作為最終效果來講解吧。

我們將每一次按下和滑動的時候,繪製一條線:

MotionEvent.ACTION_DOWN 和 MotionEvent.ACTION_MOVE

```

Canvas.drawLine();

```

在完成了線段繪製之後,我們改變一下我們的顏色,朝著一個方向隨機的偏移一定數值。

注意,一定要使用hsv來進行變化,這樣可以保證顏色看起來變化很平滑。

```

int color = paint.getColor();

Color.colorToHSV(color, hsv);

hsv[0] += (Math.random() * 15 - 5);

hsv[0] = (hsv[0] + 360) % 360;

color = Color.HSVToColor(hsv);

paint.setColor(color);

```

但是,單單只有顏色的變化是還不夠的,要有發光的效果。

可以用邊緣模糊這一技術來完成發光的效果。

```

paint.setMaskFilter(new BlurMaskFilter());

```



推薦閱讀:

深度反向投影網路(DBPN)--通過Back-Projection來超解析度的新方法
紅外熱成像
魔幻光影濾鏡(3):美女人像「劃重點」
OTSU閾值分割

TAG:android | 圖像處理 | Android開發 | Android應用 |