方式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. Java8函数式接口/Lambda表达式/接口默认方法/接口静态方法/接口冲突方法重写/lambda表达式指定泛型类型等

    一:函数式接口 1.函数式接口的概念就是此接口必须有且只能有一个抽象方法,可以通过@FunctionalInterface来显示规定(类似@Override),但是没有此注解的但是只有一个抽象方法的接 ...

  2. Ajax地域选择demo

    index.jsp只用于转发到Servlet获得省份数据再转发到province.jsp index.jsp <%@ page language="java" content ...

  3. silverlight学习之页面传值篇

    1.silverlight 实现页面导航跳转   (1)利用根视图    A.修改App.xmal.cs     //使用根视图实现页面导航跳转        //申明一个Grid对象         ...

  4. JDBC连接SQL Server数据库

    测试环境 数据库:SQL Server 2008 R2,创建数据库名:TestDemo,表:User,字段如下:   字段 字段 id UName UPass sqljdbc.jar下载地址:依赖的J ...

  5. 【笔记】CSS选择器整理(IE低版本支持性测试)

    时间:2015.05.11 参考附件:css选择器.xmind(网友共享) 查看链接:http://www.w3school.com.cn/cssref/css_selectors.asp   htt ...

  6. What's New In Python 3.X

    As Python updating to python 3.6, its performance is better than Python 2.x, which is good news to e ...

  7. day22(过滤器Filter)

    过滤器 生命周期:初始化 -----过滤-------销毁 作用:过滤url ,特定字符 创建方式:实现一个接口继承Filter package com.baidu.filter; import ja ...

  8. 20169207《Linux内核原理及分析》第十三周作业

    第一周作业::对Linux的基本知识进行了了解,并对基本操作进行熟悉和应用. 第二周作业::了解了冯诺依曼体系结构.各种寄存器的功能和汇编指令的作用和功能. 第三周作业::这周主要了解了Linux系统 ...

  9. [Selenium With C#基础教程] Lesson-01环境搭建

    作者:Surpassme 来源:http://www.jianshu.com/p/33b87bc00233 声明:本文为原创文章,如需转载请在文章页面明显位置给出原文链接,谢谢. 最近开始复习Sele ...

  10. web-day2

    第2章WEB02-CSS&JS篇 今日任务 使用CSS完成网站首页的美化 使用CSS完成网站注册页面的美化 使用JS完成简单的数据校验 使用JS完成图片轮播效果 教学导航 教学目标 了解CSS ...