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. Poj 2887 Big String(块状数组)

    Big String Time Limit: 1000MS Memory Limit: 131072K Description You are given a string and supposed ...

  2. hive-server 启动失败问题小记

    Unable to instantiate using constructor(MetricRegistry, HiveC onf) for reporter org.apache.hadoop.hi ...

  3. CF981D

    CF981D 题意: 给你n个数,要求你分成k堆.每堆的内部加和,每堆之间是相与.问最大的值. 解法: 二进制下最大的数的所有位一定是1,所以贪心去找是否最大一定是正确的. 然后DP记录+贪心就可以A ...

  4. 利用Apache shiro SimpleHash 加密字符串

    1.导入包 import org.apache.shiro.crypto.hash.SimpleHash; 1 2.代码 import org.apache.shiro.crypto.hash.Sim ...

  5. quartz中的corn表达式

    一个Quartz的CronTrigger表达式分为七项子表达式,其中每一项以空格隔开,从左到右分别是:秒,分,时,月的某天,月,星期的某天,年:其中年不是必须的,也就是说任何一个表达式最少需要六项! ...

  6. MySQL-UDF和MOF提权

    MOF提权 MOF文件是mysql数据库的扩展文件(在c:/windows/system32/wbem/mof/nullevt.mof) 叫做”托管对象格式”,其作用是每隔五秒就会去监控进程创建和死亡 ...

  7. qt 元对象系统

    元对象系统 Qt中的元对象系统是用来处理对象间通讯的信号/槽机制.运行时的类型信息和 动态属性系统. 它基于下列三类: QObject类: 类声明中的私有段中的Q_OBJECT宏: 元对象编译器(mo ...

  8. [实战]扩展一个定制的sentinel JdbcDataSource

    Sentinel是今年阿里开源的高可用防护的流量管理框架. git地址:https://github.com/alibaba/Sentinel wiki:https://github.com/alib ...

  9. awk 分组求和

    awk 分组求和 分组求和 awk '{s[substr($2,1,6)] += $1} END{for(i in s) {print i, s[i]/(1024*1024*1024)} }' fil ...

  10. React Native 常用第三方组件

    React-Native-Elements 一组开发RN的UI工具包(强烈推荐)