android 사용자 정의 View Path 다각형, 베셀 곡선 만들기

8563 단어 Android
사용자 정의 View 그리기 다중 변형
1. 다중 변형을 그리는 데 있어서 Path는 매우 중요하다. Path는 지정된 점을 연결하여 다중 변형을 그리는 목적을 실현할 수 있다.원형 경로와 호도 경로, 직사각형 경로를 추가할 수 있으며, 마지막으로 canvas를 호출합니다.drawPath 경로를 그려주시면 됩니다.
2. 경로에 텍스트를 추가하려면 canvas를 호출해야 합니다.drawTextOnPath() 방법, 첫 번째 파라미터는 텍스트 내용, 두 번째 파라미터는 경로, 세 번째 파라미터는 텍스트를 추가하는 시작 위치와 경로의 거리, 네 번째 파라미터는 경로의 위쪽과 아래쪽, 다섯 번째 파라미터는 Paint
3. 베셀 곡선을 그릴 때 두 가지 방법이 있는데 하나는 Path이다.quadTo () 방법은 네 가지 파라미터가 있는데 앞의 두 파라미터는 참고점을 설정하고 뒤의 두 파라미터는 종점을 설정하며 이 방법을 사용하기 전에 시작점(Path.moveTo () 방법으로 시작점을 설정해야 한다.
4. 베셀 곡선을 그리는 또 다른 방법은 Path.rQuadTo () 방법, 이 방법은 현재 점 (현재 점이 어느 위치에 있든지) 을 원점으로 한 좌표계를 다시 구축하여 베셀 곡선을 그리는 것입니다. 앞의 두 파라미터는 참고점을 설정하고, 뒤의 두 파라미터는 끝점을 설정합니다.마찬가지로 이 방법을 사용하기 전에 시작점을 설정해야 한다'
코드 구현
public class Angle extends View {
    private int width;
    private int heigth;
    private Paint mPaintNormal;
    private Paint mPaintPoint;
    private Path mPathRect;
    private Path mPathCircle;
    private Path mPathBser;
    private Path mPathBserLang;
    public static final int REFRESH=0x55;
    private int count=0;
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case REFRESH:
                    count+=5;//count             
                    if (count>100) {
                        count = 0;
                    }
                    handler.sendEmptyMessageDelayed(REFRESH,50);
                    invalidate();
                    break;
            }
        }
    };
    public Angle(Context context) {
        super(context);
    }

    public Angle(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaintNormal=new Paint();
        mPaintNormal.setColor(Color.BLACK);
        mPaintNormal.setStyle(Paint.Style.STROKE);
        mPaintNormal.setAntiAlias(true);
        mPaintNormal.setTextSize(20);

        mPaintPoint=new Paint();
        mPaintPoint.setColor(Color.BLUE);
        mPaintPoint.setAntiAlias(true);
        mPaintPoint.setStyle(Paint.Style.STROKE);
        mPaintPoint.setStrokeWidth(8);

        mPathRect=new Path();
        mPathCircle=new Path();
        mPathBser=new Path();
        mPathBserLang=new Path();

        handler.sendEmptyMessage(REFRESH);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width=getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        heigth=getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(width,heigth);
        Log.d("length","   "+width);
        Log.d("length","   "+heigth);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //           
        mPathRect.moveTo(200,0);//  
        mPathRect.lineTo(0,200);//      (    )
        mPathRect.lineTo(300,200);//         
        mPathRect.close();//   mPath.lineTo(200,200);//                
        canvas.drawPath(mPathRect,mPaintNormal);//    
        //    
        mPathCircle.addCircle(500,120,100, Path.Direction.CCW);//         
        canvas.drawPath(mPathCircle,mPaintNormal);
        canvas.drawTextOnPath("      ",mPathCircle,0,0,mPaintNormal);//           
        //       
        mPathBser.moveTo(100,350);//    
        mPathBser.quadTo(400,100,500,300);//           ,           
        canvas.drawPath(mPathBser,mPaintNormal);
        canvas.drawPoint(100,400,mPaintPoint);//  
        canvas.drawPoint(400,100,mPaintPoint);
        canvas.drawPoint(500,300,mPaintPoint);
        //             
        mPathBserLang.reset();
        mPathBserLang.moveTo(count,500);
        //       
        for (int i=0;i<10;i++) {
            //                    
            mPathBserLang.rQuadTo(20, 6, 50, 0);//rquadTo     ( count,500   )         
            mPathBserLang.rQuadTo(20, -6, 50, 0);//           ,   rQuadTo   (   )      
        }
        canvas.drawPath(mPathBserLang,mPaintNormal);
        canvas.drawCircle(360,500,60,mPaintPoint);
    }
}

좋은 웹페이지 즐겨찾기