方式1:不继承任何组件 , 直接在代码里面调用实例化。
public class ProgressDialog {

private Dialog dialog;

public ProgressDialog(@NonNull Context context) { //构造函数必须有
dialog = new Dialog(context);
buildDialog(context);
}

……其他逻辑方法

}

方式2:单独控件,继承与View ,可以在xml上调用(无法预览,因为需要在运行时候才onDraw绘制)
public class ProgressPieView extends View {

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

public ProgressPieView(Context context, AttributeSet attrs) {//必须添加有AttributeSet 的构造函数,才能在xml布局上编写否则报错
this(context, attrs, 0);
}

public ProgressPieView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);

init(context, attrs);//暴露出来的自定义方法。。。
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//控制控件手势冲突 和 高度
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
……
}

@Override
protected void onDraw(Canvas canvas) { // 绘制,用画布绘制。。。,Linerlayout,RelatityLayout,FrameLayout里面没有这个方法
super.onDraw(canvas);

……
}

@Override
public void layout(int l, int t, int r, int b) {//控制布局位置
……
}

@Override
protected void onAttachedToWindow() {//布局 附加到主 布局视图中时会执行;不用再手动资源回收了
super.onAttachedToWindow();

}

@Override
protected void onDetachedFromWindow() {//布局 从主布局移除会执行;不用再手动资源回收了
super.onDetachedFromWindow();

}

……其他逻辑方法
}

方式3:组合控件,里面有多个控件的,继承与Linerlayout或者RelatityLayout或FrameLayout;可在xml上直接编写(可预览)
;;;layout布局本身就是继承与 ViewGroup ViewGroup ViewGroup!
public class GirdMenuView extends FrameLayout {

private RecyclerView mRecyclerView;
private List<CategoriesModel> datas = new ArrayList<>();

//执行加载,xml布局的时候,就会执行构造函数
public GirdMenuView(@NonNull Context context) {
this(context, null);
}

public GirdMenuView(@NonNull Context context, @Nullable AttributeSet attrs) {////必须添加有AttributeSet 的构造函数,才能在xml布局上编写否则报错
this(context, attrs, 0);
}

public GirdMenuView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);

initViews(context, attrs);//暴露出来的自定义方法。。。
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//控制控件手势冲突 和 高度,不是必须设置~
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
……
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {//加载布局时候,控制位置
……
}

@Override
protected void onAttachedToWindow() {//布局 附加到主 布局视图中时会执行;不用再手动资源回收了
super.onAttachedToWindow();
if (mProgressDrawable != null) {

mProgressDrawable.start();
}
}

@Override
protected void onDetachedFromWindow() {//布局 从主布局移除会执行;不用再手动资源回收了
super.onDetachedFromWindow();
if (null != mProgressDrawable) {

mProgressDrawable.stop();
}
}
}

方式4:直接继承现有控件,对现有控件扩展,类似继承与view (但可预览);系统自带的所有控件都是继承与view,里面实现onDraw()方法
public class CustomViewPager extends ViewPager {
private static final String TAG = CustomViewPager.class.getSimpleName();

private float mTouchX;
private float mTouchY;

public CustomViewPager(Context context) {
super(context);
}

public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {

return super.onInterceptTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
}

注意:

1 若要抛出和暴露结果,可以结合回调函数使用

2 可以参考系统自带的控件 源码,查看相关方法,更容易看明白自定义控件的方式。

android自定义控件 几种方式总结的更多相关文章

  1. Android自定义控件三种方式

    1.组合原生控件(继承自ViewGroup.LinearLayout.FrameLayout.RelativeLayout等)   将原生空间做组合,自定义一些事件 2.自己绘制控件(继承自View) ...

  2. Unity调用Android的两种方式:其一、调用jar包

    unity在Android端开发的时候,免不了要调用Java:Unity可以通过两种方式来调用Android:一是调用jar.二是调用aar. 这篇文章主要讲解怎么从无到有的生成一个jar包,然后un ...

  3. android使用两种方式注冊receiver

    1. package com.example.myreceiver; import android.os.Bundle; import android.app.Activity; import and ...

  4. unity调用Android的两种方式:其二,调用aar包

    上一篇我们讲了unity如何调用jar包 http://www.cnblogs.com/Jason-c/p/6743224.html, 现在我们介绍一下怎么生成aar包和unity怎么调用aar 一. ...

  5. android手机两种方式获取IP地址

    1.使用WIFI 首先设置用户权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"& ...

  6. android中两种方式打开网页

    一.你要打开一个网页你可以自己写一个webview,在自己的程序中就可以打开. wv = (WebView) findViewById(R.id.webView1); wv.getSettings() ...

  7. android定时三种方式

    一.采用Handler与线程的sleep(long)方法二.采用Handler的postDelayed(Runnable, long)方法三.采用Handler与timer及TimerTask结合的方 ...

  8. Android自定义控件之基本原理

    前言: 在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件,今天先大致了解一下自定义控件的要求和实现的基本原理. 自 ...

  9. Android笔记——Android自定义控件

    目录: 1.自定义控件概述 01_什么是自定义控件 Android系统中,继承Android系统自带的View或者ViewGroup控件或者系统自带的控件,并在这基础上增加或者重新组合成我们想要的效果 ...

随机推荐

  1. SQL之GROUP BY 语句

    合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...

  2. 将excel中的数据填入word模板中-VBA

    首先将word模板中需要填写excel中数据的空白处用自己独特的字符串标记,比如   数据001  什么的.如下图: 这样,就可以用vba搜寻这些自己独特的标记来根据excel内容填充word了. 第 ...

  3. Ng第三课:线性代数回顾(Linear Algebra Review)

    3.1  矩阵和向量 3.2  加法和标量乘法 3.3  矩阵向量乘法 3.4  矩阵乘法 3.5  矩阵乘法的性质 3.6  逆.转置 3.1  矩阵和向量 如图:这个是 4×2 矩阵,即 4 行  ...

  4. NSUserDefaults 添加与删除

    //NSUserDefaults会创建一个plist文件,内部存放一个字典    NSUserDefaults *userDefaults = [NSUserDefaults standardUser ...

  5. C#-.Net Framework和.Net Compact Framework-摘

    .Net Compact Framework 一种独立于硬件的环境,用于在资源受限制的计算设备上运行程序.它继承了公共语言运行时的完整 .NET Framework 结构,支持 .NET Framew ...

  6. SSM_CRUD新手练习(2)配置文件

    配置之前现需要引入依赖的jar包: *Spring *SpringMvc *Mybatis *数据库连接池,驱动包 *其他(jstl,Servlet ,Junit..) 1.poxm.xml < ...

  7. mysql_触发器

    mysql触发器 触发器:trigger,事先为某张表绑定好一段代码,当表中某些内容发生改变的时候(增删改),系统会自动触发代码,执行 触发器:事件类型,触发时间,触发对象 事件类型:增删改,三种类型 ...

  8. Hdu 1009 FatMouse' Trade 2016-05-05 23:02 86人阅读 评论(0) 收藏

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...

  9. CSS 基础 例子 浮动float

    一.基本概念 设置了float属性的元素会根据属性值向左或向右浮动,设置了float属性的元素为浮动元素,浮动元素会从普通文档流中脱离,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 浮动元素之后 ...

  10. Maven的阿里云镜像

    打开“Maven安装目录/conf/settings.xml”文件,找到<mirrors>节点,添加: <mirror> <id>nexus-aliyun</ ...