Android 태극 도 인 스 턴 스 코드 그리 기
최종 효 과 는 다음 과 같다.
최종 효과
일반적으로 원 리 를 먼저 말 하 는데,나 는 그 길 을 반대 하고,먼저 실현 을 말 하 겠 다.
1.계승 초기 화 방법
View 를 계승 하여 기본 적 인 구조 함 수 를 실현 합 니 다.
public TestView(Context context) {
this(context, null);
}
public TestView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
init()방법 에서 초기 화 작업 을 진행 합 니 다.여기 서 붓 을 초기 화하 면 됩 니 다.
private Paint mPaint;
private void init() {
initPaint();
}
/**
*
*/
private void initPaint() {
mPaint = new Paint(); //
mPaint.setColor(Color.BLACK); //
mPaint.setStyle(Paint.Style.FILL); //
mPaint.setStrokeWidth(10f); // 10px
mPaint.setAntiAlias(true); //
mPaint.setAlpha(255); //
}
onSizeChanged()방법 에서 높 은 폭 을 얻 고 나중에 계산 을 그 릴 수 있 습 니 다.
private int mWidth;
private int mHeight;
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
}
두 경 로 를 만 듭 니 다.계산 은 이 두 경로 에서 진 행 됩 니 다.
private Path path0 = new Path();
private Path path1 = new Path();
그리고 가장 중요 한 onDraw()방법 에 이 르 렀 습 니 다.몇 단계 로 나 누 어 보 여 드 리 겠 습 니 다.1.가운데 로 레이아웃 이동
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//
canvas.translate(mWidth / 2, mHeight / 2);
}
ps:간결 함 을 위해 뒤의 코드 는 모두 onDraw()에서 한 층 씩 증가 한 것 이 고 그 후에 onDraw()의 외출 괄호 를 쓰 지 않 습 니 다.2.배경 노란색 그리 기
mPaint.setColor(0xffffff00);
path0.addRect(-400, -400, 400, 400, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
두 번 째.png
3.흰 둥 근 배경,즉 태극 도의 흰 물고기 부분 을 그린다.
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
4.검 은 둥 근 배경,즉 태극 그림 의 검 은 물고기 부분,흰 물고기 와 같은 크기 의 위 치 를 그 려 서 흰 물고 기 를 덮 었 을 뿐 이 고 여 기 는 boolean 연산 으로 그 려 야 한다.
//
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
//
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);// ,
STEP 4.png
5.가물치(path 1)를 boolean 으로 계산 하여 필요 하지 않 은 부분 을 제거한다.원 의 오른쪽 을 없 애 려 면 path.op()방법 이 필요 합 니 다.
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
canvas.drawPath(path0, mPaint);// ,
다섯 번 째.png
6.이때 우 리 는 필요 없 는 반쪽 의 검은색 을 지 웠 지만 검 은 물고 기 는 동 그 란 머리 가 있어 야 한다.그러면 우 리 는 머리 를 맞 춰 준다.
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
path0.rewind();
path0.addCircle(0, -100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.UNION);
canvas.drawPath(path1, mPaint);// ,
제6 단계.png
7.여기 서 우 리 는 흰 물고기의 머리 만 그리 면 된다 는 것 을 보 았 다.그러면 다섯 번 째 단계 와 마찬가지 로 boolean 연산 을 사용 하여 나머지 검은색 을 제거 하면 된다.
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
path0.rewind();
path0.addCircle(0, -100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.UNION);
path0.rewind();
path0.addCircle(0, 100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
canvas.drawPath(path1, mPaint);
제7 단계.png
8.이제 팔괘 도의 배경 을 그 렸 으 니 물고기의 눈 만 그리 면 된다.
//
path0.rewind();
path0.addCircle(0, 100, 50, Path.Direction.CW);
mPaint.setColor(0xff000000);
canvas.drawPath(path0, mPaint);
//
path0.rewind();
path0.addCircle(0, -100, 50, Path.Direction.CW);
mPaint.setColor(0xffffffff);
canvas.drawPath(path0, mPaint);
제8 단계.png
완성,마지막 에 완전한 코드.코드 를 좀 어 지 럽 게 썼 지만 연습 일 뿐 이 야,하하.그 중의 boolean 연산 에 대해 서 는 나중에 내 사용자 정의 View 노트 에 쓰 세 요.
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by Whitelaning on 2016/6/28.
* Email: [email protected]
*/
public class TestView extends View {
private Paint mPaint;
private int mWidth;
private int mHeight;
public TestView(Context context) {
this(context, null);
}
public TestView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
initPaint();
}
/**
*
*/
private void initPaint() {
mPaint = new Paint(); //
mPaint.setColor(Color.BLACK); //
mPaint.setStyle(Paint.Style.FILL); //
mPaint.setStrokeWidth(10f); // 10px
mPaint.setAntiAlias(true); //
mPaint.setAlpha(255); //
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w;
mHeight = h;
}
private Path path0 = new Path();
private Path path1 = new Path();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//
canvas.translate(mWidth / 2, mHeight / 2);
//
mPaint.setColor(0xffffff00);
path0.addRect(-400, -400, 400, 400, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
mPaint.setColor(0xffffffff);
path0.rewind();
path0.addCircle(0, 0, 200, Path.Direction.CW);
canvas.drawPath(path0, mPaint);
mPaint.setColor(0xff000000);
path1.addCircle(0, 0, 200, Path.Direction.CW);
path0.rewind();
path0.addRect(0, -200, 200, 200, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
path0.rewind();
path0.addCircle(0, -100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.UNION);
path0.rewind();
path0.addCircle(0, 100, 100, Path.Direction.CW);
path1.op(path0, Path.Op.DIFFERENCE);
canvas.drawPath(path1, mPaint);
//
path0.rewind();
path0.addCircle(0, 100, 50, Path.Direction.CW);
mPaint.setColor(0xff000000);
canvas.drawPath(path0, mPaint);
//
path0.rewind();
path0.addCircle(0, -100, 50, Path.Direction.CW);
mPaint.setColor(0xffffffff);
canvas.drawPath(path0, mPaint);
}
}
WhitelaningIt's very easy to be different but very difficult to be better
이상 은 안 드 로 이 드 가 태극 을 실현 하 는 인 스 턴 스 코드 입 니 다.관심 이 있 는 분 들 은 참고 하 셔 도 됩 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.