Android studio中Custom View使用方法_customview怎么用_ZQ沙漠之狐的博客-程序员秘密

技术标签: android studio  android自定义控件  CustomView  

CustomView是自定义View基类,如果你的自定义View继承这个类则能自动获取到View大小与一个默认的Paint,可以帮助你节省部分代码,示例如下:

通常的自定义View

public class MyView extends View {

    private int mWidth;
    private int mHeight;
    private Paint mPaint;

    public MyView(Context context) {
        this(context, null);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 初始化画笔
        mPaint.setColor(Color.GRAY);
    }
    

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidth = w;
        mHeight = h;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 获取View宽高与画笔并根据此绘制内容

        canvas.translate(mWidth / 2, mHeight / 2);
        canvas.drawCircle(0,0,100,mPaint);
    }
}

继承CustomView

public class MyView extends CustomView {

    public MyView(Context context) {
        this(context, null);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 初始化画笔
        mDefaultTextPaint.setColor(Color.GRAY);
    }
    
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 获取View宽高与画笔并根据此绘制内容

        canvas.translate(mViewWidth / 2, mViewHeight / 2);
        canvas.drawCircle(0,0,100,mDeafultPaint);
    }
}

Android studio的好处,这里就不错过多的说明了。studio中内置了很多的模版可供使用,大大的简化了工作量。在实际开发中,android自带的各类控件可能无法满足我们的需求,这就需要我们自定义控件,下面介绍一下Custom View的方法。

第一步:studio界面,File->New->UI Component->Custom View,sutdio自动创建一个布局、CustomView类以及一个自定义属性XML。

接下来,由于gradle默认自定义属性为

   xmlns:XXX="http://schemas.android.com/apk/res-auto"形式,来取代 xmlns:XXX="http://schemas.android.com/apk/res/包名"的形式

       所以需要在使用该自定义控件时,在所遇的布局中,手动加上该声明。例如:我在MainActivity的布局中使用该控件,且用到自定义属性,需要在MainActivity的布局声明中添加 xmlns:XXX="http://schemas.android.com/apk/res-auto"后再使用。

    由于自动生成的控件类,在布局中使用时,会调用CustomView(Context context, AttributeSet attrs)构造函数,其中会使用到自定义的某些属性,所以需要在主布局中
添加上相应的自定义属性,或者删除掉相应的调用自定义属性的代码,否则app会因为非法访问崩溃。                                                                                                                                                         

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29586601/article/details/77851328

智能推荐

MFC学习总结(67个技巧)_dps_figo的博客-程序员秘密

1."属性页的添加:创建对话框的类,该类要从CpropertyPage继承;然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch;最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码:m_tabsheet.Create(this, WS_CHILD | WS_VISI

样本不平衡问题 | 目标检测(文后分享大量检测+分割框架)_计算机视觉研究院的博客-程序员秘密

背景2020 Happy New Year《Residual Objectness for Imbalance Reduction》是2019 arXiv上的文章。样本不平衡问题感觉近期...

java web 插入中文显示问号,mysql内同样显示问号。_冉义的博客-程序员秘密

问题描述:用eclipseEE打开jsp文件插入数据到数据库时,中文出现问号。win10系统,mysql-5.6.41-winx64解决方案:打开mysql根目录,寻找到my-default.ini记事本打开如下:在开头添加如下代码[mysql]default-character-set=utf8再插入时即正常,无论是通过jsp插入还是用mysql插...

Fabric 1.0源代码分析(18) Ledger(账本)_尹成的博客-程序员秘密

# Fabric 1.0源代码笔记 之 Ledger(账本)## 1、Ledger概述Ledger,即账本数据库。Fabric账本中有四种数据库,idStore(ledgerID数据库)、blkstorage(block文件存储)、statedb(状态数据库)、historydb(历史数据库)。其中idStore、historydb使用leveldb实现,statedb可选择使用leveldb或c...

LeeCode刷题记录02_CRT本人的博客-程序员秘密

数组的特征第一个方面是 「线性表」。线性表就是所有数据元素排成像一条线一样的结构,线性表上的数据元素都是相同类型,且每个数据元素最多只有前、后两个方向。数组就是一种线性表结构,此外,栈、队列、链表都是线性表结构。第二个方面是 「连续的内存空间」。线性表有两种存储结构:「顺序存储结构」和「链式存储结构」。其中,「顺序存储结构」是指占用的内存空间是连续的,相邻数据元素之间,物理内存上的存储位置也相邻。数组也是采用了顺序存储结构,并且存储的数据都是相同类型的。综合这两个角度,数组就可以看做是:

boot mybatis mysql_SpringBoot+MyBatis+Mysql 详细示例_葎茜的博客-程序员秘密

SpringBoot与MyBatis整合,底层数据库为mysql的使用示例项目下载链接:https://github.com/DFX339/bootdemo.git新建maven项目,web项目,项目名为 bootdemo项目结构目录如下:还有个pom.xml文件没有在截图里面项目需要编写的文件主要有:项目启动类:Application.java ServletInitializer.jav...

随便推点

自学前端不用慌张!零基础自学前端必备手册,学成月薪12K_0基础学习web前端,出来工作多少钱_一只有头发的程序猿的博客-程序员秘密

随着互联网的深入发展,前端开发工程师一跃成为市场上非常抢手的人才。很多同学,包括以前做UI的、Java的、或者对于IT完全零基础的同学都想学习前端。下图是网上流传甚广的一张前端学习思维导图,很多初学者表示看到这些密密麻麻的知识点就已经晕了。确实,前端是一门涵盖面很广的学科。但是想学前端的你也不用慌张,内容虽多但有迹可循,只要循序渐进就不怕学不好前端!那么对于零基础的一个学员该怎么学习前端呢?一...

as608指令c语言,单片机+AS608的使用,并带程序_中信书院的博客-程序员秘密

之前在AS608的使用上走了许多弯路,这次希望身为初学者的我们可以吸取经验,特此介绍AS608.指纹模块AS608的使用:1脚红线:Vcc,连接3.3V电源供电,勿接3.3V以上电源2脚黄线:接单片机串口TX端3脚白线:接单片机串口RX端4脚黑线:GND,3.3V电源的GND5脚蓝线:模块触摸感应信号输出(高电平为检测到触摸),需要接VTI到3.3V6脚绿线:模块触摸感应电路电源,可以与红线并接在...

项目四 基于stc89c52系列单片机恒温箱(不包含pid算法)_(~ ̄▽ ̄)~凤凰涅槃的博客-程序员秘密

系统采用STC12C5A60S2芯片进行的单片机恒温箱,能够实现恒温加热,超温报警。上代码。

python基础|开发一个任务超时退出的装饰器_python超时装饰器编写_小小明-代码实体的博客-程序员秘密

在我们日常使用的各种网络请求库都带有timeout参数,超时就不再继续请求了,避免等太久。如果我们自己开发的方法也希望增加这个功能,该如何做呢?答案是线程池futures,为了使用方便,我将其封装成了一个装饰器,代码如下:import functoolsfrom concurrent import futuresimport timeexecutor = futures.ThreadPoolExecutor(1)def timeout(seconds): def decorator(

傅里叶变换的线性性质_傅里叶级数线性性质_fightandstrive的博客-程序员秘密

傅里叶变换的线性性质简介代码简介\qquad傅里叶变换的线性性质是其最基本的性质之一。假设信号g和h是两个不同的信号,那么他们在空域代码

Java中list类的使用_themissindependent的博客-程序员秘密

1、ArrayList为List的重要实现类,List中的元素是有序排列并且可重复的。//List的创建List list = new ArrayList();2、List的方法//list中元素个数是否为空?list.isEmpty()//list是否已经被创建null!=list;//获取list的长度list.size();//往list中追加元素list.add(“a...

推荐文章

热门文章

相关标签