Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容。对于Android应用的其他UI组件来说,它们都继承了View组件,然后在View组件提供的空白区域绘制外观。

  当Android系统提供的UI组件不足以满足项目需求时,我们可以通过继承View并重写View类的一个或多个方法来自定义组件。

  通常可以被用户重写的方法如下:

    1.构造器:重写构造器是定制View的最基本的方式,当Java(或Kotlin)代码创建一个View实例或根据XML布局文件加载并构建界面时将调用该构造器。

    2.onFinishInflate():这是一个回调方法,当应用从XML布局文件加载该组件并利用它来构建界面之后,该方法将会被调用。

    3.onMeasure(int,int):调用该方法来检测View组件及其所包含的所有子组件的大小。

    4.onLayout(boolean,int,int,int,int):当该组件需要分配其子组件的位置、大小时,该方法就会被回调。

    5.onSizeChanged(int,int,int,int):当该组件的大小被改变时回调该方法。

    6.onDraw(Canvas):当该组件将要绘制它的内容时回调该方法。

    7.onKeyDown(int,KeyEvent):当按下某个键时触发该方法。

    8.onKeyUp(int,KeyEvent):当松开某个键时触发该方法。

    9.onTrackballEvent(MotionEvent):当发生轨迹球事件时触发该方法

    10.onTouchEvent(MotionEvent):当发生触摸屏事件时触发该方法

    11.onFocusChanged(boolean gainFocus,int direction,Rect previouslyFocusedRect):当该组件焦点发生改变时触发该方法。

    12.onWindowFocusChanged(boolean):当包含该组件的窗口失去或得到焦点时触发该方法。

    13.onAttachedToWindow():当把该组件放入某个窗口中时触发该方法

    14.onDetachedFromWindow():当把该组件从某个窗口中分离时触发该方法

    15.onWindowVisibilityChanged(int):当包含该组件的窗口的可见性发生改变时触发该方法。

  当我们在开发自定义View时,通常仅需根据业务需求重写上面的部分方法,如果自定义组件仅仅只是组合现有的组件那就更加简单了,仅仅实现自定义组件的构造器然后使用LayoutInflater加载布局文件即可。

⒈实例自定义View

 package cn.coreqi.view;

 import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View; public class DrawView extends View {
private float currentX = 40f;
private float currentY = 50f; //定义并创建画笔
private Paint p = new Paint(); public DrawView(Context context) {
super(context);
} public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
} //当该组件将要绘制它的内容时触发该方法
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//设置画笔的颜色
p.setColor(Color.RED);
//绘制一个小圆(作为小球)
canvas.drawCircle(currentX,currentY,15F,p);
} //为该组件的触碰事件重写事件处理方法
@Override
public boolean onTouchEvent(MotionEvent event) {
//修改currentX,currentY两个成员变量
currentX = event.getX();
currentY = event.getY();
//通知当前组件重新绘制自己
invalidate();
//返回true表明该处理方法已经处理该事件
return true;
}
}

⒉在代码中创建自定义View

 package cn.coreqi;

 import androidx.appcompat.app.AppCompatActivity;

 import android.os.Bundle;
import android.widget.LinearLayout;
import cn.coreqi.view.DrawView; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//新建LinearLayout布局容器
LinearLayout layout = new LinearLayout(this);
//设置该Activity显示layout
setContentView(layout);
//创建我们自定义的View组件
DrawView draw = new DrawView(this);
//设置自定义组件的最小宽度、高度
draw.setMinimumWidth(300);
draw.setMinimumHeight(500);
layout.addView(draw);
}
}

⒊在XML布局文件中创建自定义View

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"> <cn.coreqi.view.DrawView
android:id="@+id/drawView"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </androidx.constraintlayout.widget.ConstraintLayout>

Android开发自定义View的更多相关文章

  1. Android读取自定义View属性

    Android读取自定义View属性 attrs.xml : <?xml version="1.0" encoding="utf-8"?> < ...

  2. 开发自定义View

    当开发者打算派生自己的UI组件时,首先定义一个继承View基类的子类,然后重写View类的一个或多个方法,通常可以被用户重写的方法如下:构造器:重写构造器是定制View的最基本方法,当Java代码创建 ...

  3. Android之自定义View学习(一)

    Android之自定义View学习(一) Canvas常用方法: 图片来源 /** * Created by SiberiaDante on 2017/6/3. */ public class Bas ...

  4. android开发:Android 中自定义View的应用

    大家好我们今天的教程是在Android 教程中自定义View 的学习,对于初学着来说,他们习惯了Android 传统的页面布局方式,如下代码: <?xml version="1.0&q ...

  5. Android之自定义View的实现

    对于学习Android开发的小童鞋对于自定义View一定不会陌生,相信大家对它是又爱又恨,爱它可以跟随我们的心意设计出漂亮的效果:恨它想要完全流畅掌握,需要一定的功夫.对于初学者来说确实很不容易,网上 ...

  6. Android解决自定义View获取不到焦点的情况

    引言: 我们在使用Android View或者SurfaceView进行图形绘制,可以绘制各种各样我们喜欢的图形,然后满怀信心的给我们的View加上onTouchEvent.onKeyDown.onK ...

  7. Android中自定义View的MeasureSpec使用

    有时,Android系统控件无法满足我们的需求,因此有必要自定义View.具体方法参见官方开发文档:http://developer.android.com/guide/topics/ui/custo ...

  8. Android开发学习-view

    题记:抱着对Android开发的浓厚兴趣,加入了Study jams的线上学习小组,开启了自己的Android学习之旅.一.学习前准备:1.自己动手搭建了"Android Studio&qu ...

  9. Android的自定义View及View的绘制流程

    目标:实现Android中的自定义View,为理清楚Android中的View绘制流程“铺路”. 想法很简单:从一个简单例子着手开始编写自定义View,对ViewGroup.View类中与绘制View ...

随机推荐

  1. Depth from Videos in the Wild 解读

    2019年7月17日11:37:05 论文 Depth from Videos in the Wild: Unsupervised Monocular Depth Learning from Unkn ...

  2. 权势二进制(51Nod 1413)

    一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成.例如0,1,101,110011都是权势二进制而2,12,900不是. 当给定一个n的时候,计算一下最少要多少个权势二进制相加才能 ...

  3. 安装完Pycharm,启动时碰到"failed to load jvm dll"的解决方案

    今天安装完系统,配置pycharm的环境的时候,启动pycharm时,碰到"failed to load jvm dll"的错误, 下面给出其解决方案: 安装Microsoft V ...

  4. ps 证件照制作

    自己制作证件照,再通过印鸽等服务打印邮寄,个人感觉还是比较方便实惠. 使用ps的定义图案和填充功能(ps精简版) 定义图案 1,打开1寸照片 2,图像=>图像大小,可选去掉约束比例 1寸:2.5 ...

  5. 树及其衍生算法(Trees and tree algorithms)

    1,二叉树(Binary tree) 二叉树:每一个节点最多两个子节点,如下图所示: 相关概念:节点Node,路径path,根节点root,边edge,子节点 children,父节点parent,兄 ...

  6. 【互联网运营P1】

    一.导论 [运营]是什么 二.运营的职业分工和职能发展 三.转化型文案 4个高转化率短文案的常见姿势 2个短文案写作的核心要则 中长型转化文案的写作 针对所有问题点依次进行详细解读 四.第三方推广 常 ...

  7. ubuntu19.04 安装workbench

    1.首先下载安装这两个包: https://packages.ubuntu.com/cosmic/amd64/libssl1.0.0/download https://packages.ubuntu. ...

  8. css清除浮动的几种方式,哪种最合适?

    细心的人可能发现了,写的导航条中存在一个问题,那就是使用了float之后,父级盒子的高度变为0了. 我们来写一个例子来看一下,创建一个父级div,并设置border属性,然后下边创建两个子元素span ...

  9. python设计模式-命令模式

    命令模式就是对命令的封装.所谓封装命令,就是将一系列操作封装到命令类中,并且命令类只需要对外公开一个执行方法execute,调用此命令的对象只需要执行命令的execute方法就可以完成所有的操作.这样 ...

  10. 互斥锁lock、信号量semaphore、事件Event、

    1.互斥锁lock 应用在多进程中互斥所lock:互斥锁是进程间的get_ticket互相排斥进程之间,谁先枪占到资源,谁就先上锁,等到解锁之后,下一个进程在继续使用.# 语法: 上锁: lock.a ...