专栏首页分享达人秀自定义View简单使用

自定义View简单使用

当我们开发中遇到Android原生的组件无法满足需求时,这时候就应该自定义View来满足这些特殊的组件需求。

一、概述

很多初入Android开发的程序员,对于Android自定义View可能比较恐惧,但这又是高手进阶的必经之路,这里先不做过多学习,只是简单了解。关于高阶的内容会在后续课程陆续进行学习,欢迎关注分享达人秀ShareExpert获取第一手教程。

如果说要按类型来划分的话,自定义View的实现方式大概可以分为三种:自绘控件、组合控件、以及继承控件。

  • 自绘控件:内容都是开发者自己绘制出来的,一般在View的onDraw方法中完成绘制。
  • 组合控件:就是将一些小的控件组合起来形成一个新的控件,这些小的控件多是系统自带的控件。比如很多应用中普遍使用的标题栏控件,其实用的就是组合控件。
  • 继承控件:继承已有的控件,创建新控件,保留继承的父控件的特性,并且还可以引入新特性。

二、方法

介于目前掌握的Android基础知识较为薄弱,本节先简单学习一下自绘控件。首先定义一个继承View基类的子类,然后重写View 类的一个或多个方法。通常可以被用户重写的方法如下。

  • 构造器:重写构造器是定制View的最基本方式,当Java代码创建一个View实例,或根据XML布局文件加载并构建界面时将需要调用该构造器。
  • onFinishInflate():这是一个回调方法,当应用从XML布局文件加载该组件并利用它 来构建界面之后,该方法将会被回调。
  • onMeasure(int, int):调用该方法来检测View组件及其所包含的所有子组件的大小。
  • onLayout(boolean, int, int, int, int):当该组件需要分配其子组件的位置、大小时,该方法就会被回调。
  • onSizeChanged(int, int, int, int):当该组件的大小被改变时回调该方法。
  • onDraw(Canvas):当该组件将要绘制它的内容时回调该方法进行绘制。
  • onKeyDown(int, KeyEvent):当某个键被按下时触发该方法。
  • onKeyUp(int, KeyEvent):当松开某个键时触发该方法。
  • onTrackballEvent(MotionEvent):当发生轨迹球事件时触发该方法。
  • onTouchEvent(MotionEvent):当发生触摸屏事件时触发该方法。
  • onFocusChanged (boolean gainFocus, int direction, Rect previouslyFocusedRect):当该组件焦点发生改变时触发该方法。
  • onWindowFocusChanged(boolean):当包含该组件的窗口失去或得到焦点时触发该方法。
  • onAttachedToWindow():当把该组件放入某个窗口时触发该方法。
  • onDetachedFromWindow():当把该组件从某个窗口上分离时触发该方法。
  • onWindowVisibilityChanged(int):当包含该组件的窗口的可见性发生改变时触发该方法。

当需要开发自定义View时,开发者并不需要重写上面列出的所有方法,而是可以根据业务需要重写其中部分方法。

三、示例

下面就实现一个简单的计数器,每点击它一次,计数值就加1并显示出来。

在src/main/java文件下创建新包com.jinyu.cqkxzsxy.android.widgetsample.view,再新建一个CounterView.java文件,其代码如下:

public class CounterView extends View {
    // 定义画笔
    private Paint mPaint;
    // 用于获取文字的宽和高
    private Rect mBounds;
    // 计数值,每点击一次本控件,其值增加1
    private int mCount = 0;


    public CounterView(Context context, AttributeSet attrs) {
        super(context, attrs);

        // 初始化画笔、Rect
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mBounds = new Rect();
        // 本控件的点击事件
        setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                mCount ++;

                // 重绘
                invalidate();
            }
        });
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPaint.setColor(Color.BLUE);
        // 绘制一个填充色为蓝色的矩形
        canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);

        mPaint.setColor(Color.YELLOW);
        mPaint.setTextSize(50);
        String text = String.valueOf(mCount);
        // 获取文字的宽和高
        mPaint.getTextBounds(text, 0, text.length(), mBounds);
        float textWidth = mBounds.width();
        float textHeight = mBounds.height();

        // 绘制字符串
        canvas.drawText(text, getWidth() / 2 - textWidth / 2, getHeight() / 2
                + textHeight / 2, mPaint);
    }
}

关于里面的代码不懂也没有关系,后续会详细进行学习的。

到res/layout/目录下创建一个counterview_layout.xml文件,然后在其中填充如下代码片段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <com.jinyu.cqkxzsxy.android.widgetsample.view.CounterView
        android:id="@+id/counter_view"
        android:layout_width="100dp"
        android:layout_height="100dp"/>
</LinearLayout>

然后修改一下app/src/java/MainActivity.java文件中加载的布局文件为新建的counterview_layout.xml文件。

运行程序,点击自定义的计数控件,会发现每点击一次控件里面的值+1,如下图所示效果。

至此,一些Android开发中一些常用的控件学习完毕,还记得学过哪些控件吗?都掌握的如何?我们从下一期开始一起来学习Android中的界面布局。

本文分享自微信公众号 - 分享达人秀(ShareExpert),作者:鑫鱻

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 互联网下半场的风口与机遇

    ? 投资人预测的风口一般都是不靠谱的,所以我觉得让我今天跟大家说什么是风口?我觉得很难跟大家说,或者是根本不知道下半场的风口在什么地方,如果知道的话告...

    分享达人秀
  • Android Studio配置优化,打造开发利器

    是不是很多同学已经有烦恼出现了?电脑配置已经很高了,但是每次运行Android程序的时候就很卡,而且每次安装运行程序都要等待很长时间,如果是在开发后期需要不...

    分享达人秀
  • Android用户界面开发概述

    相信通过前面15期的学习,Android的开发环境已经基本掌握了,如果仍有问题,欢迎到Android零基础入门技术讨论微信群交流,从本期开始正式来一步一...

    分享达人秀
  • Qt编写自定义控件20-自定义饼图

    上次在写可视化数据大屏电子看板项目的时候,为了逐步移除对QChart的依赖(主要是因为QChart真的太垃圾了,是所有Qt的模块中源码最烂的一个,看过源码的人没...

    feiyangqingyun
  • Flutter: Semantics控件

    前言 如果你读过有关于Flutter的代码,那么你有时候你会注意到Semantics或者SemanticsConfiguration,但官方文档却对这个很有趣...

    JarvanMo
  • Qt编写自定义控件17-按钮进度条

    按钮进度条,顾名思义,表面上长得像一个按钮,单击以后切换成进度条指示按钮单击动作执行的进度,主要用在一些需要直接在按钮执行动作显示对应进度的场景,在很多网页中经...

    feiyangqingyun
  • Qt编写自定义控件57-直方波形图

    直方波形图控件非原创控件,控件大全中大概有20-30个控件非自己原创,而是参考了网上开源的代码,自己加以整理和完善,新增了插件的代码使得可以直接集成到QtDes...

    feiyangqingyun
  • Qt编写自定义控件56-波浪曲线

    波浪曲线控件,其实是之前一个水波进度条控件的一个核心,其实就是利用正弦曲线来生成对应的坐标进行绘制,把这个功能单独提取出来,是为了更详细的研究各种正弦余弦等拓展...

    feiyangqingyun
  • Qt编写自定义控件13-多态进度条

    多态进度条,顾名思义,有多重状态,其实本控件主要是用来表示百分比进度的,由于之前已经存在了百分比进度条控件,名字被霸占了,按照先来先得原则,只好另外取个别名叫做...

    feiyangqingyun
  • Qt编写自定义控件58-直方对称图

    本控件也非原创控件,是参考网上的代码而来的,对称顾名思义就是将画布平均成上下两部分,将设置的值自动按照画布高度的一半作为参照高度进行绘制,然后增加动态过渡效果,...

    feiyangqingyun

扫码关注云+社区

领取腾讯云代金券