美文网首页
Android 绘图

Android 绘图

作者: gaookey | 来源:发表于2022-02-13 10:26 被阅读0次
    image.png

    Canvas 代表“依附”于指定 View 的画布

    Canvas 的绘制方法
    image.png

    Paint 代表 Canvas 上的画笔,主要用于设置绘制风格,包括画笔颜色、画笔笔触粗细、填充风格等。

    Paint 的常用方法
    image.png

    Path 代表任意多条直线连接而成的任意图形。

    public class MyView extends View {
        private Path path1 = new Path();
        private Path path2 = new Path();
        private Path path3 = new Path();
        private Path path4 = new Path();
        private Path path5 = new Path();
        private Path path6 = new Path();
    
        public MyView(Context context, AttributeSet set) {
            super(context, set);
        }
    
        private LinearGradient mShader = new LinearGradient(0f, 0f, 40f, 60f,
                new int[]{Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW},
                null, Shader.TileMode.REPEAT);
        private RectF rect = new RectF();
        // 定义画笔
        private Paint paint = new Paint();
    
        // 重写该方法,进行绘图
        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            // 把整张画布绘制成白色
            canvas.drawColor(Color.WHITE);
            // 去锯齿
            paint.setAntiAlias(true);
            paint.setColor(Color.BLUE);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(4f);
            int viewWidth = this.getWidth();
            // 绘制圆形
            canvas.drawCircle(viewWidth / 10 + 10, viewWidth / 10 + 10, viewWidth / 10, paint);
            // 绘制正方形
            canvas.drawRect(10f, viewWidth / 5 + 20,
                    viewWidth / 5 + 10, viewWidth * 2 / 5 + 20, paint);
            // 绘制矩形
            canvas.drawRect(10f, viewWidth * 2 / 5 + 30,
                    viewWidth / 5 + 10, viewWidth / 2 + 30, paint);
            rect.set(10f, viewWidth / 2 + 40, 10 + viewWidth / 5, viewWidth * 3 / 5 + 40);
            // 绘制圆角矩形
            canvas.drawRoundRect(rect, 15f, 15f, paint);
            rect.set(10f, viewWidth * 3 / 5 + 50, 10 + viewWidth / 5, viewWidth * 7 / 10 + 50);
            // 绘制椭圆
            canvas.drawOval(rect, paint);
            // 使用一个Path对象封闭成一个三角形
            path1.moveTo(10f, viewWidth * 9 / 10 + 60);
            path1.lineTo(viewWidth / 5 + 10, viewWidth * 9 / 10 + 60);
            path1.lineTo(viewWidth / 10 + 10, viewWidth * 7 / 10 + 60);
            path1.close();
            // 根据Path进行绘制,绘制三角形
            canvas.drawPath(path1, paint);
            // 使用一个Path对象封闭成一个五角形
            path2.moveTo(10 + viewWidth / 15, viewWidth * 9 / 10 + 70);
            path2.lineTo(10 + viewWidth * 2 / 15, viewWidth * 9 / 10 + 70);
            path2.lineTo(10 + viewWidth / 5, viewWidth + 70);
            path2.lineTo(10 + viewWidth / 10, viewWidth * 11 / 10 + 70);
            path2.lineTo(10f, viewWidth + 70);
            path2.close();
            // 根据Path进行绘制,绘制五角形
            canvas.drawPath(path2, paint);
            // ----------设置填充风格后绘制----------
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(Color.RED);
            // 绘制圆形
            canvas.drawCircle(viewWidth * 3 / 10 + 20, viewWidth / 10 + 10, viewWidth / 10, paint);
            // 绘制正方形
            canvas.drawRect(viewWidth / 5 + 20, viewWidth / 5 + 20,
                    viewWidth * 2 / 5 + 20, viewWidth * 2 / 5 + 20, paint);
            // 绘制矩形
            canvas.drawRect(viewWidth / 5 + 20, viewWidth * 2 / 5 + 30,
                    viewWidth * 2 / 5 + 20, viewWidth / 2 + 30, paint);
            rect.set(viewWidth / 5 + 20, viewWidth / 2 + 40,
                    20 + viewWidth * 2 / 5, viewWidth * 3 / 5 + 40);
            // 绘制圆角矩形
            canvas.drawRoundRect(rect, 15f, 15f, paint);
            rect.set(20 + viewWidth / 5, viewWidth * 3 / 5 + 50,
                    20 + viewWidth * 2 / 5, viewWidth * 7 / 10 + 50);
            // 绘制椭圆
            canvas.drawOval(rect, paint);
            // 使用一个Path对象封闭成一个三角形
            path3.moveTo(20 + viewWidth / 5, viewWidth * 9 / 10 + 60);
            path3.lineTo(viewWidth * 2 / 5 + 20, viewWidth * 9 / 10 + 60);
            path3.lineTo(viewWidth * 3 / 10 + 20, viewWidth * 7 / 10 + 60);
            path3.close();
            // 根据Path进行绘制,绘制三角形
            canvas.drawPath(path3, paint);
            // 使用一个Path对象封闭成一个五角形
            path4.moveTo(20 + viewWidth * 4 / 15, viewWidth * 9 / 10 + 70);
            path4.lineTo(20 + viewWidth / 3, viewWidth * 9 / 10 + 70);
            path4.lineTo(20 + viewWidth * 2 / 5, viewWidth + 70);
            path4.lineTo(20 + viewWidth * 3 / 10, viewWidth * 11 / 10 + 70);
            path4.lineTo(20 + viewWidth / 5, viewWidth + 70);
            path4.close();
            // 根据Path进行绘制,绘制五角形
            canvas.drawPath(path4, paint);
            // ----------设置渐变器后绘制----------
            // 为Paint设置渐变器
            paint.setShader(mShader);
            // 设置阴影
            paint.setShadowLayer(25f, 20f, 20f, Color.GRAY);
            // 绘制圆形
            canvas.drawCircle(viewWidth / 2 + 30, viewWidth / 10 + 10, viewWidth / 10, paint);
            // 绘制正方形
            canvas.drawRect(viewWidth * 2 / 5 + 30, viewWidth / 5 + 20,
                    viewWidth * 3 / 5 + 30, viewWidth * 2 / 5 + 20, paint);
            // 绘制矩形
            canvas.drawRect(viewWidth * 2 / 5 + 30, viewWidth * 2 / 5 + 30,
                    viewWidth * 3 / 5 + 30, viewWidth / 2 + 30, paint);
            rect.set((viewWidth * 2 / 5 + 30), viewWidth / 2 + 40, 30 + viewWidth * 3 / 5,
                    viewWidth * 3 / 5 + 40);
            // 绘制圆角矩形
            canvas.drawRoundRect(rect, 15f, 15f, paint);
            rect.set(30 + viewWidth * 2 / 5, viewWidth * 3 / 5 + 50, 30 + viewWidth * 3 / 5,
                    viewWidth * 7 / 10 + 50);
            // 绘制椭圆
            canvas.drawOval(rect, paint);
            // 使用一个Path对象封闭成一个三角形
            path5.moveTo(30 + viewWidth * 2 / 5, viewWidth * 9 / 10 + 60);
            path5.lineTo(viewWidth * 3 / 5 + 30, viewWidth * 9 / 10 + 60);
            path5.lineTo(viewWidth / 2 + 30, viewWidth * 7 / 10 + 60);
            path5.close();
            // 根据Path进行绘制,绘制三角形
            canvas.drawPath(path5, paint);
            // 使用一个Path对象封闭成一个五角形
            path6.moveTo(30 + viewWidth * 7 / 15, viewWidth * 9 / 10 + 70);
            path6.lineTo(30 + viewWidth * 8 / 15, viewWidth * 9 / 10 + 70);
            path6.lineTo(30 + viewWidth * 3 / 5, viewWidth + 70);
            path6.lineTo(30 + viewWidth / 2, viewWidth * 11 / 10 + 70);
            path6.lineTo(30 + viewWidth * 2 / 5, viewWidth + 70);
            path6.close();
            // 根据Path进行绘制,绘制五角形
            canvas.drawPath(path6, paint);
            // ----------设置字符大小后绘制----------
            paint.setTextSize(48f);
            paint.setShader(null);
            // 绘制7个字符串
            canvas.drawText(getResources().getString(R.string.circle),
                    60 + viewWidth * 3 / 5, viewWidth / 10 + 10, paint);
            canvas.drawText(getResources().getString(R.string.square),
                    60 + viewWidth * 3 / 5, viewWidth * 3 / 10 + 20, paint);
            canvas.drawText(getResources().getString(R.string.rect),
                    60 + viewWidth * 3 / 5, viewWidth * 1 / 2 + 20, paint);
            canvas.drawText(getResources().getString(R.string.round_rect),
                    60 + viewWidth * 3 / 5, viewWidth * 3 / 5 + 30, paint);
            canvas.drawText(getResources().getString(R.string.oval),
                    60 + viewWidth * 3 / 5, viewWidth * 7 / 10 + 30, paint);
            canvas.drawText(getResources().getString(R.string.triangle),
                    60 + viewWidth * 3 / 5, viewWidth * 9 / 10 + 30, paint);
            canvas.drawText(getResources().getString(R.string.pentagon),
                    60 + viewWidth * 3 / 5, viewWidth * 11 / 10 + 30, paint);
        }
    }
    
    image.png
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new MyView(this));
        }
    
        private static class MyView extends View {
            private float phase;
            private PathEffect[] effects = new PathEffect[7];
            private int[] colors;
            private Paint paint = new Paint();
            // 定义创建并初始化Path
            private Path path = new Path();
    
            public MyView(Context context) {
                super(context);
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeWidth(4);
                path.moveTo(0f, 0f);
                for (int i = 1; i <= 40; i++) {
                    // 生成40个点,随机生成它们的Y坐标,并将它们连成一条Path
                    path.lineTo(i * 25f, (float) (Math.random() * 90));
                }
                // 初始化7种颜色
                colors = new int[]{Color.BLACK, Color.BLUE, Color.CYAN,
                        Color.GREEN, Color.MAGENTA, Color.RED, Color.YELLOW};
                // -----------下面开始初始化7种路径效果----------
                // 不使用路径效果
                effects[0] = null;
                // 使用CornerPathEffect路径效果
                effects[1] = new CornerPathEffect(10f);
                // 初始化DiscretePathEffect
                effects[2] = new DiscretePathEffect(3.0f, 5.0f);
            }
    
            @Override
            public void onDraw(Canvas canvas) {
                // 将背景填充成白色
                canvas.drawColor(Color.WHITE);
                // 将画布移动到(8, 8)处开始绘制
                canvas.translate(8f, 8f);
                // 依次使用7种不同的路径效果、7种不同的颜色来绘制路径
                for (int i = 0; i < effects.length; i++) {
                    paint.setPathEffect(effects[i]);
                    paint.setColor(colors[i]);
                    canvas.drawPath(path, paint);
                    canvas.translate(0f, 90f);
                }
                // 初始化DashPathEffect
                effects[3] = new DashPathEffect(new float[]{20f, 10f, 5f, 10f}, phase);
                // 初始化PathDashPathEffect
                Path p = new Path();
                p.addRect(0f, 0f, 8f, 8f, Path.Direction.CCW);
                effects[4] = new PathDashPathEffect(p, 12f, phase,
                        PathDashPathEffect.Style.ROTATE);
                // 初始化ComposePathEffect
                effects[5] = new ComposePathEffect(effects[2], effects[4]);
                effects[6] = new SumPathEffect(effects[4], effects[3]);
                // 改变phase值,形成动画效果
                phase += 1f;
                invalidate();
            }
        }
    }
    
    image.gif
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new PathTextView(this));
        }
    
        private static class PathTextView extends View {
            private String drawStr = getResources().getString(R.string.draw_string);
            private Path[] paths = new Path[3];
            private Paint paint = new Paint();
    
            public PathTextView(Context context) {
                super(context);
                paths[0] = new Path();
                paths[0].moveTo(0f, 0f);
                for (int i = 1; i <= 20; i++) {
                    // 生成20个点,随机生成它们的Y坐标,并将它们连成一条Path
                    paths[0].lineTo(i * 30f, (float) (Math.random() * 30));
                }
                paths[1] = new Path();
                RectF rectF = new RectF(0f, 0f, 600f, 360f);
                paths[1].addOval(rectF, Path.Direction.CCW);
                paths[2] = new Path();
                paths[2].addArc(rectF, 60f, 180f);
                // 初始化画笔
                paint.setAntiAlias(true);
                paint.setColor(Color.CYAN);
                paint.setStrokeWidth(1f);
            }
    
            @Override
            public void onDraw(Canvas canvas) {
                canvas.drawColor(Color.WHITE);
                canvas.translate(40f, 40f);
                // 设置从右边开始绘制(右对齐)
                paint.setTextAlign(Paint.Align.RIGHT);
                paint.setTextSize(30f);
                // 绘制路径
                paint.setStyle(Paint.Style.STROKE);
                canvas.drawPath(paths[0], paint);
                paint.setTextSize(40f);
                // 沿着路径绘制一段文本
                paint.setStyle(Paint.Style.FILL);
                canvas.drawTextOnPath(drawStr, paths[0], -8f, 20f, paint);
                // 对Canvas进行坐标变换:画布下移60
                canvas.translate(0f, 60f);
                // 绘制路径
                paint.setStyle(Paint.Style.STROKE);
                canvas.drawPath(paths[1], paint);
                // 沿着路径绘制一段文本
                paint.setStyle(Paint.Style.FILL);
                canvas.drawTextOnPath(drawStr, paths[1], -20f, 20f, paint);
                // 对Canvas进行坐标变换:画布下移360
                canvas.translate(0f, 360f);
                // 绘制路径
                paint.setStyle(Paint.Style.STROKE);
                canvas.drawPath(paths[2], paint);
                // 沿着路径绘制一段文本
                paint.setStyle(Paint.Style.FILL);
                canvas.drawTextOnPath(drawStr, paths[2], -10f, 20f, paint);
            }
        }
    }
    
    image.png

    摘抄至《疯狂Android讲义(第4版)》

    相关文章

      网友评论

          本文标题:Android 绘图

          本文链接:https://www.haomeiwen.com/subject/wfeclrtx.html