美文网首页
Android_自定义View

Android_自定义View

作者: 书虫大王X | 来源:发表于2020-08-26 19:16 被阅读0次
    1、继承关系:
    • View:单个视图,其上不能添加视图控件,可以和用户进行交互、进行界面渲染,是所有控件的基类,都是矩形的
    • ViewGroup:继承与View,可以将它理解为一个容器,它可以承载单个或多个子视图,所有的布局方式都直接继承与它(Linelayout、Relativelayout)
    • ViewRootImpl: 是视图的顶层,实现了视图和窗口之间交互的协议
    2、view被绘制到viewGroup上面的流程:
    • 单个控件自身的绘制流程: onMeasure:测量自身尺寸、onDraw:绘制
    • 容器的绘制流程:onMeasure:测量自身尺寸、onLayout:定义子控件布局、onDraw:绘制(多数不需要用到此方法)
    3、自定义一个view:
     // Java代码中自定义view:
    public class ykJView extends View {
    //    使用代码创建控件
        public ykJView(Context context) {
            this(context,null);
        }
    //    使用xml创建
        public ykJView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public ykJView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    }
    
    // kotlin中自定义view:
    //kotlin中如果一个类继承另外一个类并且父类中有多个构造方法就使用参数最多
    // 的那个构造方法来构建父类
    //然后提供参数比较少的那个几个构造方法作为次构造
    open class ykView(context: Context,attrs: AttributeSet?,defStyleAttr:Int) : 
    View(context,attrs,defStyleAttr) {
    //    代码创建
        constructor(context: Context): this(context,null,0){
    
        }
    //    xml创建
        constructor(context: Context,attrs: AttributeSet?): this(context,attrs,0){
    
        }
    }
    
    //  然后重写onMeasure(回调用两次)、onDraw(绘制类容)、
    // dispatchDraw(绘制子视图)、onDrawForGround(绘制前景)等方法
    
    // 
    
    方法调用顺序
    4、onDraw方法:

    一、onDraw绘制内容的4个基础内容

    • Bitmap图片
    • Canvas 绘制类(画板)绘制类提供各种绘制的方法
    • Paint 画笔:笔的粗细颜色
    • Path路径 :画的类容

    二、 在onMeasure方法执行完成后,回调用onSizeChanged方法(控件在被创建时尺寸是-1和-1),所以可以通过此方法得到控件的尺寸

    三、 当重写父类的方法时,如果父类空实现父类可以不调用super.method(),
    如果父类有具体的实现,通常都是先调用super.method()然后再实现自己的

    四、注意onDraw方法会被多次调用重复调用在这个方法里面尽量不要去创建对象

    5、画笔设置颜色:
    //  res.drawable.1.png图片对应的id
    //  Bitmap就是具体图片―这个id对应的图片的真实数据
    var a = BitmapFactory.decodeResource(resources,R.drawable.q)
    
            Paint().also {
    //            it.color = Color.RED
    //            it.color = Color.parseColor("#c0c0c0")
    //            it.style = Paint.Style.STROKE
    //            it.strokeWidth = 10f
    
    //            着色器
    //            参数:子类:有LinearGradient(线性渐变色)等
    //            x0y0 渐变起始点
    //            x1y1渐变重点
    //            color0color1 渐变色
    //            tile: 填充方式  CLAMP边缘色拉伸 REPEAT 重复 MIRROR 倒影
    //            it.shader = LinearGradient(0f,0f,0f,mHeight.toFloat(),Color.GREEN,Color.MAGENTA,Shader.TileMode.CLAMP)
    
                var a = BitmapFactory.decodeResource(resources,R.drawable.b)
                it.shader = BitmapShader(a,Shader.TileMode.REPEAT,Shader.TileMode.REPEAT)
            }
        }
    

    一个自定义控件的小demo

    相关文章

      网友评论

          本文标题:Android_自定义View

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