android自定义控件 几种方式总结
方式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自定义控件 几种方式总结的更多相关文章
- Android自定义控件三种方式
1.组合原生控件(继承自ViewGroup.LinearLayout.FrameLayout.RelativeLayout等) 将原生空间做组合,自定义一些事件 2.自己绘制控件(继承自View) ...
- Unity调用Android的两种方式:其一、调用jar包
unity在Android端开发的时候,免不了要调用Java:Unity可以通过两种方式来调用Android:一是调用jar.二是调用aar. 这篇文章主要讲解怎么从无到有的生成一个jar包,然后un ...
- android使用两种方式注冊receiver
1. package com.example.myreceiver; import android.os.Bundle; import android.app.Activity; import and ...
- unity调用Android的两种方式:其二,调用aar包
上一篇我们讲了unity如何调用jar包 http://www.cnblogs.com/Jason-c/p/6743224.html, 现在我们介绍一下怎么生成aar包和unity怎么调用aar 一. ...
- android手机两种方式获取IP地址
1.使用WIFI 首先设置用户权限 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"& ...
- android中两种方式打开网页
一.你要打开一个网页你可以自己写一个webview,在自己的程序中就可以打开. wv = (WebView) findViewById(R.id.webView1); wv.getSettings() ...
- android定时三种方式
一.采用Handler与线程的sleep(long)方法二.采用Handler的postDelayed(Runnable, long)方法三.采用Handler与timer及TimerTask结合的方 ...
- Android自定义控件之基本原理
前言: 在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件,今天先大致了解一下自定义控件的要求和实现的基本原理. 自 ...
- Android笔记——Android自定义控件
目录: 1.自定义控件概述 01_什么是自定义控件 Android系统中,继承Android系统自带的View或者ViewGroup控件或者系统自带的控件,并在这基础上增加或者重新组合成我们想要的效果 ...
随机推荐
- vue 开发系列(五) 调用原生API
概要 我们在开发手机端程序的时候了,我们经常需要使用到拍照,二维码的功能.数字天堂公司提供了大量的原生API支持. http://www.html5plus.org/doc/ 实现 1.在hbuild ...
- B-论文一些好的句子
Due to high design and test costs for real many-core chips, simulators which allow exploring the bes ...
- typecho 调用评论最多热门文章
在当前主题的functions.php文件中添加以下函数代码: function getHotComments($limit = 10){ $db = Typecho_Db::get(); $resu ...
- Tensflow预测股票实例
import pandas as pd import numpy as np import matplotlib.pyplot as plt import tensorflow as tf #———— ...
- 1.7.8使用return 停止线程
package com.cky.thread; /** * Created by edison on 2017/12/3. */ public class MyThread12 extends Thr ...
- c++ cout、<< 、cin、>> 、endl 详解
std::cout是在#include<iostream>库中的ostream类型中的对象 std::表示命名空间,标准库定义的所有名字都在命名空间std中 std::cout是在#inc ...
- 引用数据类型(Scanner类、Random类)
Scanner类 Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固 ...
- Beta阶段第二篇Scrum冲刺博客-Day1
1.站立式会议 提供当天站立式会议照片一张 2.每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 张晨晨:交接进组 郭琪容:明确任务并学习 吴玲:明确接 ...
- Codeforces821A Okabe and Future Gadget Laboratory 2017-06-28 14:55 80人阅读 评论(0) 收藏
A. Okabe and Future Gadget Laboratory time limit per test 2 seconds memory limit per test 256 megaby ...
- SPFA_queue_链式前向星最短路 & HDU2433
题目大意:看完之后,觉得不肯能让我暴力,比较好想的就是初始化——每个点都求个最短路spfa,sum数组记录每个点到各个点的最短路之和,ans作为总和,之后一一删除边u-v,求关于u的最短路,如果dis ...