一、view的绘制流程是从ViewRoot的performTraversals方法开始的,包含以下三个过程:
1.measure过程
从顶级view开始遍历,在performMeasure调用measure,然后调用OnMeasure。onMeasure会对所有子元素进行measure完成遍历。
2.layout过程
同上。performLayout->layout->onLayout
3.draw过程
同上。performDraw->draw->onDraw
二、DecorView
继续自LinearLayout,view层的事件都先经过DecorView,然后才传递给我们的view.在LinearLayout中,包含两个部分,分别是标题栏和内容栏。内容栏的id就叫content,经常使用的setContentView就是加到这个内容栏中的,如setContentView(R.layout.hello_world_layout);可以这样获取我们设置的view:
ViewGroup content = (ViewGroup)findViewById(android.R.id.content);
content.getChildAt(0)
三、如何获得宽高
因为view的measure过程和activity的生命周期不是同步执行的,因此无法保证activity执行onCreate,onStart,onResume时宽高已经测量完毕。如果没有测量完毕,则会返回0.有四种方法可以获得测量后的宽高,这里只介绍一个简单的:
protected void onStart(){
super.onStart();
view.post(new Runnable(){
public void run(){
int width = view.getMeasuredWidth();
int height = view.getMeasureHeight();
}
}
);
}
通过post可以将一个runnable投递到一个消息队列的尾部,然后等待looper调用此runnable的时候,view也已经初始化好了。
四、自定义组件注意事项
1.重写onMeasure方法并设置wrap_content时的自身大小,否则在布局中使用wrap_content就相当于使用match_parent。
2.在draw方法中支持padding和margin
3.view中如果有线程或者动画需要及时停止。当包含view的activity退出或者当前的view被remove时,view的onDetachedFromWindow方法会被调用,相对应的,启动时执行onAttachedToWindow。
五、自定义组件继承自View重写onDraw方法
public class CircleView extends View{
private int mColor = Color.RED;
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
public CircleView(Context context){
super(context);
init();
}
public CircleView(Context context,AttributeSet attrs){
super(context,attrs);
init();
}
public CircleView(Context context,AttributeSet attrs,int defStyleAttr){
super(context,attrs,defStyleAttr);
init();
}
private void init(){
mPaint.setColor(mColor);
}
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
//为了让padding和wrap_content生效,要做处理
final int paddingLeft = getPaddingLeft();
final int paddingRight = getPaddingRight();
final int paddingTop = getPaddingTop();
final int paddingBottom = getPaddingBottom();
int width = getWidth() - paddingLeft - paddingRight;
int height = getHeight() - paddingTop - paddingBottom;
int radius = Math.min(width,height)/2;
canvas.drawCircle(paddingLeft+width/2,paddingTop+height/2,radius,mPaint);
}
}
自定义属性参见206页
六、继承viewgroup派生特殊的layout
参见210页
相关推荐
5. **属性设置**:为了让自定义组件能在XML布局文件中使用并设置属性,我们需要实现`attr.xml`文件定义自定义属性。然后在`TestOurselfWidget`类中通过`obtainStyledAttributes()`方法获取这些属性值。 6. **注册到...
这个"android自定义组件demo"实例提供了三种自定义组件的示例,是学习和理解Android自定义组件的一个宝贵资源。下面我们将深入探讨这三个自定义组件的关键知识点,并提供相关的实践指导。 1. **自定义View的基本...
在Android应用开发中,自定义组件是提升用户体验和实现独特设计的重要手段。本文将深入探讨Android自定义组件的开发过程,旨在帮助开发者更好地理解和实践这一关键技能。 首先,理解Android组件的基本概念至关重要...
1. **创建新类**:自定义组件通常继承自Android提供的基础视图类,如`View`、`TextView`或`ImageView`。例如,你可以创建一个名为`CustomView`的新类,让它继承自`View`。 2. **构造函数**:为新组件提供构造函数,...
Android自定义组件的开发是Android应用开发中的一个重要部分,它涉及到自定义View和ViewGroup的创建,以及对canvas和paint的深入理解和运用。自定义组件能够满足开发者对于UI设计的独特需求,提升用户体验,同时也是...
在Android开发中,TimePicker组件是一个非常常用的控件,它允许用户选择小时和分钟,通常用于设置闹钟、设定时间等场景...自定义组件不仅可以提高用户体验,还能增强应用的个性化和差异化,是提升产品品质的重要手段。
在Android应用开发中,自定义组件是提升用户体验和实现独特设计的关键技术。Android绘图与自定义组件的结合,能够让我们创造出独具特色的交互效果和视觉表现。以下将详细阐述这两个重要概念及其应用。 1. Android...
在Android开发中,自定义组件是提升应用独特性和用户体验的关键技术之一。自定义组件不仅可以满足特定的设计需求,还可以实现各种创新的交互效果,比如动画。本教程将带你深入理解“android自定义组件动画基础班”的...
5. **属性定义与解析**:为了让自定义组件在XML布局文件中使用,我们需要定义自定义属性。这通常通过创建一个资源文件(res/values/attrs.xml),在其中声明组件的自定义属性。然后,在组件类中通过`...
在Android开发中,自定义组件是非常常见且重要的技术,它允许开发者根据项目需求创造出具有独特功能和视觉效果的UI元素。本篇文章将详细介绍如何在Android中实现自定义组件,主要分为以下几个方面: 首先,自定义...
1. 创建自定义组件:自定义组件通常继承自Android内置的View或ViewGroup类。通过重写构造函数、onDraw()、onMeasure()和onLayout()等关键方法,可以定制组件的行为和外观。 2. 绘制原理:Android的绘图主要依赖于...
首先,自定义View在Android开发中扮演着关键角色,它允许开发者超越系统提供的标准视图组件,创建出满足特定需求的复杂视图。自定义View通常包括以下步骤: 1. 创建一个新的Java类,继承自View或已有的View子类(如...
在Android中,自定义组件通常继承自已有的View或ViewGroup类。在这个例子中,我们将从View类派生,因为饼状图是一个单一的图形元素。我们创建一个新的Java类,比如`AppPieChartView`,并让它继承自`View`。 1. **...
自定义View允许开发者创建自己的视图组件,以满足特定的需求或提供独特的用户交互体验。自定义View通常涉及到以下几个步骤: 1. **创建新类**:首先,你需要继承一个已有的View类,如`View`、`TextView`或`...
1. **创建自定义View类**:自定义组件通常需要继承自Android的基础View或 ViewGroup 类。在这个案例中,我们可能创建了一个名为SlipButton的类,继承自ToggleButton。 2. **绘制视图**:自定义组件的核心在于重写`...
在Android开发中,自定义组件是一项重要的技能,它允许开发者根据特定需求打造独特的用户界面。本文将深入探讨如何实现一个自定义的刷新控件,以此为应用增添个性化和交互性的功能。我们将基于提供的链接...
首先,自定义组件的基础是理解Android的View和ViewGroup系统。View是UI的基本元素,如按钮、文本框等,而ViewGroup是容器,用于组织和管理多个View。自定义组件通常是在这两个类的基础上进行扩展。 1. **创建自定义...
首先,自定义组件的基础是理解Android的View和ViewGroup系统。View是UI的基本元素,如按钮、文本框等,而ViewGroup是容器,用于组织和管理多个View。自定义组件通常是在这两个类的基础上进行扩展。 1. **创建自定义...
自定义组件在Android中主要分为两类:基于现有组件的扩展和完全自定义的View。前者是在系统提供的基础组件(如TextView、Button)基础上增加新的功能或改变其外观;后者则是从零开始创建全新的View类,实现自己的...