安卓画各种图形的总结

本文详细介绍使用Android自定义View进行绘图的方法,包括Canvas、Paint、Path等核心类的应用,以及如何绘制常见图形如圆形、矩形、椭圆、三角形等,并探讨了填充模式、渐变色设置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义view时常常要自己画图形,现在就把它总结总结:

基本上用到的类和函数:

View,

Canvas:画布

Paint:画笔

Path:画线:


用到的函数:

Canvas:下的

首先:新建个对象Canvas canvas=new Canvas();若是重写protected void onDraw(Canvas canvas)  可直接获取Canvas对象

  canvas.drawColor(Color.WHITE);                          //设置画布背景颜色

 canvas.drawCircle(40, 40, 30, paint);                   //画圆形    :参数为圆形坐标x,圆形坐标y,半径,画笔

   canvas.drawRect(10, 90, 70, 150, paint);            //画矩阵     :参数为矩阵的左上点的(x,y),右下角的(x,y),画笔

     canvas.drawRect(10, 170, 70, 200, paint);         //矩阵 :   同上一条     

         canvas.drawOval(new RectF(10, 220, 70, 250), paint);     //画椭圆            :  矩阵,画笔


Path:   可以画各种图形:三角形,矩阵,正方形,长方形,等边形,各种形状

三角形:

 Path path = new Path();                   //路径类

         path.moveTo(10, 330);           //鼠标移动到点坐标(10,330),起始位置

         path.lineTo(70, 330);              //从起始位置,画条线到(70,330)

         path.lineTo(40, 270);             //从起始位置画条线到(40,270)

         path.close();                         // 把点连起来(3点相连)

         canvas.drawPath(path, paint);       //画路径      //可以看到是个三角形


梯形:

Path path = new Path();                   //路径类

         path.moveTo(10, 330);           //鼠标移动到点坐标(10,330),起始位置

         path.lineTo(70, 330);              //从起始位置,画条线到(70,330)

         path.lineTo(40, 270);             //从起始位置画条线到(40,270)

         path.lineTo(50,320)              //从起始位置画条线到(60,270)

         path.close();                         // 把点连起来(4点相连)

         canvas.drawPath(path, paint);       //画路径      //可以看到是个梯形


除了画直线,也可以画曲线:



         Path path1 = new Path();//贝赛尔曲线

         path1.moveTo(10, 410);//绘画基点

         path1.quadTo(200, 100, 390, 410);        //前两个参数控制点坐标(x,y),后两个参数重点坐标(x,y)

         path1.close();//把开始的点和最后的点连接在一起,构成一个封闭图形

         canvas.drawPath(path1, paint);



上面那么多函数中我们都看到paint这个东东,就是画笔来的:


Paint:


新建一只画笔:为其设置好是各种参数:颜色,尺寸,空实心,渐变等等:

       Paint paint = new Paint();

         paint.setAntiAlias(true);

         paint.setColor(Color.RED);  //颜色

         paint.setStyle(Paint.Style.STROKE);//设置为空心

         paint.setStrokeWidth(3);     //线的宽度


         Shader mShader = new LinearGradient(15, 15, 100, 100,

         new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW },

         null, Shader.TileMode.REPEAT);

         // Shader.TileMode三种模式

         // REPEAT:沿着渐变方向循环重复

         // CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色

         // MIRROR:与REPEAT一样都是循环重复,但这个会对称重复

         paint.setShader(mShader);// 用Shader中定义定义的颜色来话


弄个例子:

public class GravdView extends View{

 public GravdView(Context context){super(context);}
 public GravdView(Context context, AttributeSet attrs){super(context, attrs);}
 public GravdView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  // TODO Auto-generated constructor stub
  Canvas canvas=new Canvas();
 }
 
 
  @Override
     protected void onDraw(Canvas canvas)

     {

         super.onDraw(canvas);

         canvas.drawColor(Color.WHITE);

         Paint paint = new Paint();

         paint.setAntiAlias(true);

         paint.setColor(Color.RED);

         paint.setStyle(Paint.Style.STROKE);//设置为空心

         paint.setStrokeWidth(3);

         canvas.drawCircle(40, 40, 30, paint);

         canvas.drawRect(10, 90, 70, 150, paint);

         canvas.drawRect(10, 170, 70, 200, paint);

         canvas.drawOval(new RectF(10, 220, 70, 250), paint);

         Path path = new Path();//三角形

         path.moveTo(10, 330);

         path.lineTo(70, 330);

         path.lineTo(40, 270);

         path.close();

         canvas.drawPath(path, paint);

         Path path1 = new Path();//梯形

         path1.moveTo(10, 410);//绘画基点

        // path1.lineTo(70, 410);
         path1.quadTo(200, 100, 390, 410);

       //  path1.lineTo(55, 350);

        // path1.lineTo(25, 350);

         path1.close();//把开始的点和最后的点连接在一起,构成一个封闭图形
         /*
          * 最重要的就是movtTo和close,如果是Style.FILL的话,不设置close,也没有区别,可是如果是STROKE模式,
          * 如果不设置close,图形不封闭。
          *
          * 当然,你也可以不设置close,再添加一条线,效果一样。
          */
         canvas.drawPath(path1, paint);
        
        
        
        
         ///////////////////////////////////////第二列

         paint.setColor(Color.BLUE);

         paint.setStyle(Paint.Style.FILL);//设置实心

         canvas.drawCircle(120, 40, 30, paint);

         canvas.drawRect(90, 90, 150, 150, paint);

         canvas.drawRect(90, 170, 150, 200, paint);

         RectF re2 = new RectF(90, 220, 150, 250);

         canvas.drawOval(re2, paint);

         Path path2 = new Path();

         path2.moveTo(90, 330);

         path2.lineTo(150, 330);

         path2.lineTo(120, 270);

         path2.close();

         canvas.drawPath(path2, paint);

         Path path3 = new Path();

         path3.moveTo(90, 410);

         path3.lineTo(150, 410);

         path3.lineTo(135, 350);

         path3.lineTo(105, 350);

         path3.close();

         canvas.drawPath(path3, paint);
        
        
         ////////////////////////////////////////////////////第三列
        
         /*
          * LinearGradient shader = new LinearGradient(0, 0, endX, endY, new
          * int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f,
          * 1.0f}, TileMode.MIRROR);
          * 参数一为渐变起初点坐标x位置,参数二为y轴位置,参数三和四分辨对应渐变终点
          * 其中参数new int[]{startColor, midleColor,endColor}是参与渐变效果的颜色集合,
          * 其中参数new float[]{0 , 0.5f, 1.0f}是定义每个颜色处于的渐变相对位置, 这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布
          */
         Shader mShader = new LinearGradient(15, 15, 100, 100,

         new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW },

         null, Shader.TileMode.REPEAT);

         // Shader.TileMode三种模式

         // REPEAT:沿着渐变方向循环重复

         // CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色

         // MIRROR:与REPEAT一样都是循环重复,但这个会对称重复

         paint.setShader(mShader);// 用Shader中定义定义的颜色来话

         canvas.drawCircle(200, 40, 30, paint);

         canvas.drawRect(170, 90, 230, 150, paint);

         canvas.drawRect(170, 170, 230, 200, paint);

         RectF re3 = new RectF(170, 220, 230, 250);

         canvas.drawOval(re3, paint);

         Path path4 = new Path();

         path4.moveTo(170, 330);

         path4.lineTo(230, 330);

         path4.lineTo(200, 270);

         path4.close();

         canvas.drawPath(path4, paint);

         Path path5 = new Path();

         path5.moveTo(170, 410);

         path5.lineTo(230, 410);

         path5.lineTo(215, 350);

         path5.lineTo(185, 350);

         path5.close();

         canvas.drawPath(path5, paint);
        
         //////////////////////////////////第4列

         paint.setTextSize(24);

         canvas.drawText("圆形", 240, 50, paint);

         canvas.drawText("正方形", 240, 120, paint);

         canvas.drawText("长方形", 240, 190, paint);

         canvas.drawText("椭圆形", 240, 250, paint);

         canvas.drawText("三角形", 240, 320, paint);

         canvas.drawText("梯形", 240, 390, paint);

     }


}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值