반응형
안녕하세요. 돼지왕 왕돼지입니다.
오늘은 Paint 에 Filter 를 적용하는 방법과 draw 할 때 효과를 주는 방법에 대해 알아보겠습니다.
마스크 필터 ( Mask Filter )
Filter 적용하기
MaskFilter Paint.setMaskFilter (MaskFilter maskfilter)
cf) 필터를 제거하고 싶을때는 filter parameter 에 null 값을 대입합니다.
MaskFilter
BlurMaskFilter(float radius, BlurMaskFilter.Blur style)
-> 가장자리 부분의 색상을 흐릿하게(or 부드럽게) 만듭니다. (뽀샤시 효과와 비슷합니다)
-> radius 값이 클수록 영향 받는 영역이 넓어집니다.
-> style : INNER, NORMAL, OUTER, SOLID 가 들어갈 수 있습니다.
EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)
Example
<example 1>
BlurMaskFilter blur = new BlurMaskFilter( 10, BlurMaskFilter.Blur.NORMAL );
setContentView (new MyView(this));
protected class MyView extends View{
public MyView(Context context){
super(context);
}
public void onDraw(Canvas canvas){
Paint Pnt = new Paint();
Pnt.setAntiAlias(true);
Bitmap e8 = BitmapFactory.decodeResource( getContext.getResources(), R.drawable.eight8 );
canvas.drawColor(Color.WHITE);
BlurMaskFilter blur = new BlurMaskFilter( 10, BlurMaskFilter.Blur.NORMAL );
Pnt.setMaskFilter(blur);
canvas.drawBitmap(e8, 30, 30, Pnt);
}
}
<example 2>
//각 방향으로 2픽셀만큼 떨어진 위치에서 빛을 비추며 강도는 50%.
EmbossMaskFilter emboss = new EmbossMaskFilter(new float[] {2, 2, 2}, 0.5f, 6, 5);
Pnt.setMaskFilter(emboss);
컬러 필터 ( Color Filter )
Filter 적용하기
ColorFilter Paint.setColorFilter (ColorFilter filter)
Color Filter.
LightingColorFilter (int mul, int add)
ColorMatrixColorFilter(float[] array)
PorterDuffColorFilter(int srcColor, PorterDuff.Mode mode)
Example.
<example 1>
// 128/256 = 0.5 를 곱한다. 뒤에 0은 더해지는 값. 양수를 더해지면 밝아진다.
Pnt.setColorFilter(new LightingColorFilter(128, 0));
<example 2>
// 반전 효과
ColorMatrix cm = new ColorMatrix(new float[]{
-1, 0, 0, 0, 255,
0, -1, 0, 0, 255,
0, 0, -1, 0, 255,
0, 0, 0, 1, 0});
Pnt.setColorFilter(new ColorMatrixColorFilter(cm));
-> 곱해지는 것들은 r, g, b, a, 1 순서.
<example 3>
// Gray Scale
ColorMatrix cm = new ColorMatrix(new float[]{
0.299f, 0.587f, 0.114f, 0, 0,
0.299f, 0.587f, 0.114f, 0, 0,
0.299f, 0.587f, 0.114f, 0, 0,
0, 0, 0, 1, 0 });
Pnt.setColorFilter(new ColorMatrixColorFilter(cm));
<example 4>
// Gray Scale (Porter Duff 필터 이용)
Pnt.setColorFilter( new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.DARKEN) );
패스 효과 ( Path Effect )
APIs.,
PathEffect Paint.setPathEffect (PathEffect effect)
DashPathEffect (float[] intervals, float phase)
CornerPathEffect (float radius)
PathDashPathEffect (Path shape, float advance, float phase, PathDashPathEffect.Style style)
DiscretePathEffect (float segmentLength, float deviation)
SumPathEffect (PathEffect first, PathEffect second)
ComposePathEffect (PathEffect outerpe, PathEffect innerpe)
Example.
<example 1>
Pnt.setColor(Color.WHITE);
Pnt.setStrokeWidth(3);
Pnt.setPathEffect(new DashPathEffect(new float[]{10, 10}, 0));
canvas.drawLine(10, 10, 200, 10, Pnt);
// phase 3 이동 (왼쪽으로 3 이동한 효과)
Pnt.setPathEffect(new DashPathEffect(new float[] {10, 10}, 3));
canvas.drawLine(10, 30, 20, 30, Pnt);
// 2그리고 2쉬고 패턴 (위는 10 그리고 10 쉬는 패턴)
Pnt.setPathEffect(new DashPathEffect(new float[] {2, 2}, 0));
<example 2>
Pnt.setColor(Color.WHITE);
canvas.drawRect(10, 10, 100, 50, Pnt);
Pnt.setPathEffect( new CornerPathEffect(8) );
<example 3>
Path dash = new Path();
dash.moveTo(0.-4);
dash.lineTo(4, -4);
dash.lineTo(4, -8);
dash.lineTo(10, 0);
dash.lineTo(4, 8);
dash.lineTo(4, 4);
dash.lineTo(0, 4);
PathDashPathEffect pathdash = new PathDashPathEffect( dash, 14, 0, PathDashPathEffect.Style.ROTATE );
Pnt.setPathEffect (pathdash);
canvas.drawLine(10, 10, 10, 200, Pnt);
canvas.drawCircle(180, 100, 80, Pnt);
ComposePathEffect comp = new ComposePathEffect( pathdash, new CornerPathEffect(16) );
Pnt.setPathEffect(comp);
canvas.drawRect(50, 200, 250, 300, Pnt);
<example 4>
int phase = 0;
RectF ovalrt = new RectF(10, 10, 200, 150);
mAnimHandler.sendEmptyMessageDelayed(0, 100);
public void onDraw(Canvas canvas){
PathDashPathEffect pathdash = new PathDashPathEffect(dash, 14, phase, PathDashPathEffect.Style.ROTATE);
Pnt.setPathEffect(pathdash);
canvas.drawOval(ovalrt, Pnt);
}
Handler mAnimHandler = new Handler(){
public void handleMessage(Message msg){
phase--;
invalidate();
sendEmptyMessageDelayed(0, 100);
}
};
그리기 모드
APIs.
Xfermode Paint.setXfermode (Xfermode xfermode)
void Paint.setDither (boolean dither) // 이미지보다 장비의 표현력이 떨어질 때 이미지의 색상을 낮추어 출력하는 기법.
Example
Paint Pnt = new Paint();
Pnt.setAntiAlias(true);
Pnt.setColor(Color.RED);
canvas.drawCircle(100, 100, 80, Pnt);
Pnt.setXfermode ( new PixelXorXfermode(Color.BLACK) );
Pnt.setColor(Color.BLUE);
canvas.drawRect(100, 100, 200, 200, Pnt);
로그인 없이 추천 가능합니다. 손가락 꾸욱~
반응형
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Android/안드로이드] Service 에 대해 알아본다. (0) | 2012.02.18 |
---|---|
[Android/안드로이드] paint에 shader 적용하기. (0) | 2012.02.18 |
[Android/안드로이드] Canvas Operation 에 대해 알아보자. ( Transformation & Scaling & Rotating ) (0) | 2012.02.18 |
[Android/안드로이드] Frame Animation 사용해보자. (0) | 2012.02.18 |
[Android/안드로이드] Tween Animation 사용해보자. (2) | 2012.02.18 |
댓글