android使用canvas画线,位移,旋转,绘制五角星

    为了提高自己的开发水平,就想系统地学习一下Android自定义控件。首先呢就要从Paint和canvas学起了,与本文主题相关的有关于canvas的画线:

                                                           canvas.drawLine(300, 300, 500, 600, mPaint);

canvas的位移:

                                 canvas.translate(100,500);

canvas的旋转:

                                 canvas.rotate(36);

设计思路呢也很简单,五角星的每个尖角都是36°,所以呢通过画一条水平线,通过位移和旋转的位置变化,重复画出五条线,这五条线恰好能够组成一个五角星。效果图:

下面看一下具体的代码实现:

public class SloopView extends View{

    //创建画笔
    private Paint mPaint = new Paint();

    private Paint mPaint2 = new Paint();

    public SloopView(Context context) {
        this(context,null,0);
    }

    public SloopView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public SloopView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }

    private void initPaint() {
        mPaint.setColor(Color.BLACK);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setStrokeWidth(10f);
        mPaint2.setColor(Color.YELLOW);
        mPaint2.setStyle(Paint.Style.FILL);
        mPaint2.setStrokeWidth(10f);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthsize = MeasureSpec.getSize(widthMeasureSpec);      //取出宽度的确切数值
        int widthmode = MeasureSpec.getMode(widthMeasureSpec);      //取出宽度的测量模式

        int heightsize = MeasureSpec.getSize(heightMeasureSpec);    //取出高度的确切数值
        int heightmode = MeasureSpec.getMode(heightMeasureSpec);    //取出高度的测量模式
        int height = 0;
        switch (heightmode){
            case MeasureSpec.AT_MOST:
                break;
            case MeasureSpec.EXACTLY:
            case MeasureSpec.UNSPECIFIED:
                break;
        }
        setMeasuredDimension(widthsize, heightsize);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        //画点
//        canvas.drawPoint(200, 200, mPaint);
//        canvas.drawPoints(new float[]{
//                500,500,500,600,500,700
//        },mPaint);
        //画线
//        canvas.drawLine(300, 300, 500, 600, mPaint);
//        canvas.drawLines(new float[]{
//                100,200,110,200,
//                120,200,130,200,
//                140,200,150,200,
//                160,200,170,200,
//                180,200,190,200,
//                200,200,210,200
//        },mPaint);
        //画矩形,三种画法

//        canvas.drawRect(100,100,800,400,mPaint);
//
//        Rect rect = new Rect(100,500,800,800);
//        canvas.drawRect(rect,mPaint);
//
//        RectF rectF = new RectF(100,900,800,1200);
//        canvas.drawRect(rectF,mPaint);

        //画圆角矩形

//        RectF rectF = new RectF(100, 100, 800, 400);
//        canvas.drawRoundRect(rectF, 30, 30, mPaint);
//
//        if (Build.VERSION.SDK_INT>=21){
//            canvas.drawRoundRect(100,500,800,800,30,30,mPaint);
//        }

        //画椭圆
//        RectF rectF = new RectF(100,100,800,400);
//        canvas.drawRect(rectF,mPaint2);
//        canvas.drawOval(rectF,mPaint);
//
//        if (Build.VERSION.SDK_INT>=21) {
//            canvas.drawOval(100, 500, 800, 800, mPaint);
//        }

        //画圆
//        canvas.drawCircle(500, 500, 400, mPaint);

//        //画圆弧(非正圆)
//        RectF rectF = new RectF(100, 100, 800, 400);
//        //绘制背影矩形
//        canvas.drawRect(rectF,mPaint2);
//
//        //绘制圆弧,不使用中心点
//        mPaint.setColor(Color.BLUE);
//        canvas.drawArc(rectF, 0, 90, false, mPaint);
//
//        //绘制圆弧,并使用中心点
//        RectF rectF1 = new RectF(100,600,800,900);
//        //绘制矩形背景
//        canvas.drawRect(rectF1,mPaint2);
//
//        //绘制圆弧
//        canvas.drawArc(rectF1, 0, 90, true, mPaint);

        //画圆弧(正圆)
//        RectF rectF = new RectF(100, 100, 400, 400);
//        //绘制背影矩形
//        canvas.drawRect(rectF,mPaint2);
//
//        //绘制圆弧,不使用中心点
//        mPaint.setColor(Color.BLUE);
//        canvas.drawArc(rectF, 0, 90, false, mPaint);
//
//        //绘制圆弧,并使用中心点
//        RectF rectF1 = new RectF(100, 600, 400, 900);
//        //绘制矩形背景
//        canvas.drawRect(rectF1,mPaint2);
//
//        //绘制圆弧
//        canvas.drawArc(rectF1, 0, 90, true, mPaint);

        //绘制五角星图案
        canvas.drawLine(100, 500, 700, 500, mPaint);
        canvas.translate(100,500);
        canvas.rotate(36);
        canvas.drawLine(0, 0, 600, 0, mPaint);
        canvas.translate(600,0);
        canvas.rotate(36);
        canvas.drawLine(0, 0, -600, 0, mPaint);
        canvas.translate(-600, 0);
        canvas.rotate(36);
        canvas.drawLine(0, 0, 600, 0, mPaint);
        canvas.translate(600, 0);
        canvas.rotate(36);
        canvas.drawLine(0, 0, -600, 0, mPaint);
    }

}

这个也是通过自定义view的形式实现的,具体的源码请点这里。

源码下载

转载本文请注明出处;

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值