Android 自定义控件

在安卓体系中,所有控件及布局都是View的子类或间接子类,如Button继承TextView,TextView继承了View。

如果我们想定义一个控件,必须继承View或View的子类。

如果想对现有控件进行拓展,则继承该控件,修改内部实现即可。

如果想创建新控件,则继承View即可。

如下图,安卓控件体系结构

首先,我们以拓展TextView为例,看一下如何定义我们自己的TextView

自定义一个类,继承TextView

1 public class MyTextView extends TextView {
2     public MyTextView(Context context, AttributeSet attrs) {//系统根据XML创建控件时候调用
3         super(context, attrs);
4     }
5     public MyTextView(Context context) {//使用代码自己创建对象的时候调用
6         super(context);
7     }
8 }

一般我们都是把空间配置到XML布局文件里,所以一般我们都是使用上边的构造函数。

然后重写onDraw方法,绘制界面。

 1 @Override
 2     protected void onDraw(Canvas canvas) {
 3         Paint paint_blue = new Paint();//画笔
 4         paint_blue.setColor(Color.BLUE);//蓝色
 5         paint_blue.setStyle(Style.STROKE);//空心,FILL(实心)
 6         paint_blue.setStrokeWidth(10);//线宽度
 7         canvas.drawCircle(110,150,60,paint_blue);//绘制
 8
 9         Paint paint_text = new Paint(); //绘制字符串
10         paint_text.setColor(Color.BLUE);
11         paint_text.setTextSize(40);
12         canvas.drawText("四海兴唐专用标签", 215, 190, paint_text);
13         super.onDraw(canvas);
14     }

下面图就是我们绘制的TextView,除了设定的文本之外,还多了一个圆圈和蓝色的文字

如果我们想向安卓系统自带控件那样可以设置属性,需要在values/attrs.xml里设置如下

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name = "customView">
        <attr name = "radius" format="integer" />
        <attr name = "textColor" format="color" />
    </declare-styleable>
</resources>

定义了2个属性,

  1. radius,约束为整型
  2. textColor,约束为颜色

这些属性我们可以在控件的构造方法里使用,如下

public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //获取属性集合
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.customView);
    //获取customView中的radius属性,如果没有,则默认10
        radius = a.getInt(R.styleable.customView_radius,10);
    //获取customView中的textColor属性,如果没有,则默认蓝色
        color = a.getColor(R.styleable.customView_textColor, Color.BLUE);
    //回收TypedArray,在调用这个函数后,就不能再使用这个TypedArray。
    a.recycle();
}

获取之后,就可以在onDraw方法里使用了。

如下

@Override
    protected void onDraw(Canvas canvas) {
        Paint paint_blue = new Paint();//画笔
        paint_blue.setColor(color);//使用自定义颜色
        paint_blue.setStyle(Style.STROKE);//空心
        paint_blue.setStrokeWidth(10);//线宽度
        canvas.drawCircle(110,150,radius,paint_blue);//绘制圆形,使用自定义半径
        Paint paint_text = new Paint(); //绘制字符串
        paint_text.setColor(Color.BLUE);
        paint_text.setTextSize(40);
        canvas.drawText("四海兴唐专用标签", 215, 190, paint_text);
        super.onDraw(canvas);
    }

这些属性我们定义控件的时候就可以设置了,

在这之前,需要添加如下代码到根布局里,其中toolbar是定义属性的前缀

xmlns:toolbar=http://schemas.android.com/apk/res-auto

然后就可以设置我们自己的控件和属性了

<com.ccshxt.shxt.MyTextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/message"
        android:text="普通文本"
        toolbar:radius="40"
        toolbar:textColor="#FF0000"/>

这里的控件名,就是我们定义的类,注意别忘了包名。

效果如下图

时间: 2024-09-30 05:12:15

Android 自定义控件的相关文章

Android自定义控件之自定义组合控件(三)

前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本. 使用自定义组合控件的好处? 我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的. 1.)第一种方式:直接在每个xml布局中写相同的标题栏布局代码 <?xm

android自定义控件实现TextView按下后字体颜色改变

今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能 直接看图片             第一张是按下后截的图,功能很简单,也很容易实现,下面来看一下如何通过重写TextView来实现 一共三个文件  TextViewM.java,MainActivity.java,activity_textview.xml TextViewM.java 1 package landptf.control; 2 3 import and

android 自定义控件---圆形方向盘

在做Android平台开发的时候,经常会遇到安卓原生控件无法满足需求的情况,安卓允许开发者去继承已经存在的控件或者实现你自己的控件. 先来看一下效果图 采用直接集成View类,重写onDrow方法绘制. 下面附上主要代码. 1 新建一个类CircleView 继承自View 1 package com.lennon.view; 2 3 import android.content.Context; 4 import android.graphics.Canvas; 5 import androi

Android自定义控件系列 十:利用添加自定义布局来搞定触摸事件的分发,解决组合界面中特定控件响应特定方向的事件

这个例子是比较有用的,基本上可以说,写完这一次,以后很多情况下,直接拿过来addView一下,然后再addInterceptorView一下,就可以轻轻松松的达到组合界面中特定控件来响应特定方向的触摸事件了. 请尊重原创劳动成果,转载请注明出处:http://blog.csdn.net/cyp331203/article/details/45198549,非允许请勿用于商业或盈利用途,违者必究. 在写Android应用的过程之中,经常会遇到这样的情况:界面包含了多个控件,我们希望触摸在界面上的不

Android自定义控件,轻松实现360软件详情页

Android自定义控件,轻松实现360软件详情页在海军陆战队服役超过 10 年后,我于去年 7 月份退役了.随后在 8 月份找到了一份赌场的工作做公关,到今年 2 月中旬的时候又被辞退了.到 5 月中旬的时候我在 DE 协会找到了一份临时的"初级用户体验工程师"工作,而到了 8 月底我则成了正式的"用户体验工程师". 当我丢掉赌场的那份工作时,我就在想公关这行可能真的不适合我.我想做一名程序员.于是我开始节衣缩食学习编程.家人对我的情况非常担心.从 2 月份到 5

Android自定义控件_View的绘制流程

每一个View/ViewGroup的显示都会经过三个过程:1.measure过程(测量View显示的大小,位置):2.layout过程(布局view的位置):3.draw过程(上一篇文章说到的通过canvas绘制到界面上显示,形成了各色的View) 下面分析一下各个过程:measure过程: 因为DecorView实际上是派生自FrameLayout的类,也即一个ViewGroup实例,该ViewGroup内部的ContentViews又是一个ViewGroup实例,依次内嵌View或ViewG

Android自定义控件之滑动开关

自定义开关控件 Android自定义控件一般有三种方式 1.继承Android固有的控件,在Android原生控件的基础上,进行添加功能和逻辑. 2.继承ViewGroup,这类自定义控件是可以往自己的布局里面添加其他的子控件的. 3.继承View,这类自定义控件没有跟原生的控件有太多的相似的地方,也不需要在自己的肚子里添加其他的子控件. ToggleView自定义开关控件表征上没有跟Android原生的控件有什么相似的地方,而且在滑动的效果上也没有沿袭Android原生的地方,所以我们的自定义

一起来学习Android自定义控件1

概述 Android已经为我们提供了大量的View供我们使用,但是可能有时候这些组件不能满足我们的需求,这时候就需要自定义控件了.自定义控件对于初学者总是感觉是一种复杂的技术.因为里面涉及到的知识点会比较多.但是任何复杂的技术后面都是一点点简单知识的积累.通过对自定义控件的学习去可以更深入的掌握android的相关知识点,所以学习android自定义控件是很有必要的.记得以前学习总是想着去先理解很多知识点,然后再来学着自定义控件,但是每次写自定义控件的时候总是不知道从哪里下手啊.后来在学习的过程

Android 自定义控件之第三讲:obtainStyledAttributes 系列函数详解

在项目中开发自定义控件时,或多或少都会用到 obtainStyledAttributes(AttributeSet, int[], int, int) 或者 obtainAttributes(AttributeSet, int[]) 函数,它们的主要作用是:根据传入的参数,返回一个对应的 TypedArray ,如果小伙伴还没有看过 LZ 的第二讲,那么请自行移步 Android 自定义控件之第二讲:TypedArray 详解,好了,就先扯到这里,下面开始今天内容讲解: 获取 TypedArra

Android自定义控件 -Canvas绘制折线图(实现动态报表效果)

有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了很多插件,但是很多时候我们需要根据具体项目自定义这些图表,这一篇文章我们一起来看看如何在Android中使用Canvas绘制折线图.先看看绘制的效果: 代码: public class MyView extends View { //坐标轴原点的位置 private int xPoint=60; private int yPoint=260; //刻度长度 private int xScale=8;  //8个单位构