zoukankan      html  css  js  c++  java
  • Android自定义控件_Canvas分析

      自定义控件分为两种一种是自定义ViewGroup控件,一种是自定义View控件;跟踪View的步伐其实能跟到Java实现的最下面我们能发现的也就只有Canvas了,再下去就是C++或C实现了;所以本文主要是站在设计的的角度讲解一下Canvas跟View的关系,再简单分析一下Canvas用法;

      View作为Android中一切显示视图的父类,我们可看到它的绘制方法draw(Canvas canvas)中,无非也是通过Canvas的绘制来达到各种View的显示,如此Android中各种控件如:ImageView,TextView,EditTextView等都是通过Canvas根据传递的各个参数绘制不同的视图,从而形成各种不同的视觉控件;当然我们也可以通过继承View的onDraw方法,用Canvas绘制一些自定义图像,这就是最简单的自定义控件了,当然如果需要各种事件响应,就需深刻了解View的事件处理逻辑。

      这里做个简单的比喻:如果把一个Android界面比喻成窗户,那么每一个View就是一块玻璃,整个框架就是ViewGroup了,而每一块玻璃上的图案就是我们说的Canvas,如果没有Canvas我们是什么都看不到的(只有透明的玻璃),而接收各种事件处理还是由玻璃(View)接收处理,通知刷新图案就是(Canvas)了,这就是简单的View与Canvas的关系。很明显,它们分工很明确,View只需要负责处理事件交互,而Canvas只负责根据View提供的参数来显示与刷新图像。当然如果你要多个View同时显示那就需要VIewGroup参与了。下面学习一下Canvas的基本用法:

    Canvas基本用法分为两种:
      1、直接在View的onDraw方法里面直接绘制;(这是有载体View(上面例子的玻璃)的情况下直接绘制图案,比如我们可以复写系统控件,根据需要再添加或修改我们需要的元素)
      2、Canvas canvas = new Canvas(),这里仅仅是New的一个画布,我们是看不到的,它也无法处理任何事件,仅仅绘制修饰图像,至于显示与接收事件处理必须要有载体(View)才行;

    Canvas有很多自己的绘制方法,但是最终都是调用底层代码实现:下面分类介绍一下Canvas常用方法:
    1、save,saveLayer,restore方法保存与还原;
    save(int saveFlags);可以指定还原哪些内容:
    源码:

        // the SAVE_FLAG constants must match their native equivalents
    
        /** restore the current matrix when restore() is called */
        public static final int MATRIX_SAVE_FLAG = 0x01;
        /** restore the current clip when restore() is called */
        public static final int CLIP_SAVE_FLAG = 0x02;
        /** the layer needs to per-pixel alpha */
        public static final int HAS_ALPHA_LAYER_SAVE_FLAG = 0x04;
        /** the layer needs to 8-bits per color component */
        public static final int FULL_COLOR_LAYER_SAVE_FLAG = 0x08;
        /** clip against the layer's bounds */
        public static final int CLIP_TO_LAYER_SAVE_FLAG = 0x10;
        /** restore everything when restore() is called */
        public static final int ALL_SAVE_FLAG = 0x1F; 
    View Code

    saveLayer(RectF bounds, Paint paint, int saveFlags);Canvas利用此方法进行图层管理,可以根据区域保存当前图层,绘制完成之后利用restoreToCount将图层绑定;

    2、draw方法;
    drawColor,drawRGB,drawARGB,绘制颜色
    drawPath,drawLines,drawOval等绘制几何图形;
    drawBitmap,drawPictur绘制图片 ;
    drawText绘制文字;
    3、clipRegion,clipPath,clipRect裁剪,这里特别注意的有两种:
    一是Region.Op中各种参数的含义;
    二是Clip(剪切)的时机,是在canvas绘制之前完成对canvas的裁剪,而不是图像;
    4、还有一些是与动画相关的Matrix操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种; 这里特意说明一下,这里Canvas进行matrix变化的时候相对坐标为(0,0);我们进行任何操作的时候,注意canvas.translate(scrollX, scrollY);canvas.translate(-scrollX, -scrollY);的意义。

    Canvas具体用法这里不再阐述了,网上资料多多。。

  • 相关阅读:
    等宽布局和flex
    antd按需加载
    linux-redis cluster集群(redis5.x)
    linux-mysql-主从同步
    mysql-行转列
    Spring Bean 作用域
    ArrayList、LinkedList区别(jdk8)
    java类及实例初始化顺序
    线程池-结构
    GIT基础
  • 原文地址:https://www.cnblogs.com/PDW-Android/p/3706682.html
Copyright © 2011-2022 走看看