一、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页
相关推荐
Android自定义组件开发详解,让你彻底理解自定义组件(自定义View、ViewGroup等,彻底了解canvas和paint的基本和高级使用方法)
Android自定义组件开发详解,进阶书籍。本书教你如何更好使用自定义view
android开发中回会经常使用自定义组件,这边提供了一个非常基础的自定view动画
6.2 自定义组件的基本结构 164 6.3 重写onMeasure方法 166 6.4 组件属性 175 6.4.1 属性的基本定义 175 6.4.2 读取来自style和theme中的属性 181 6.5 案例1:圆形ImageView组件 186 6.6 案例2:验证码组件CodeView ...
Android自定义组件之自动换行View
1) Android 自定义组件开发详解 2)view 绘图 ,界面等
从android4.0开始推出了switch组件,可以方便的实现滑动开关,但是前面的版本却不行,因此这里自定义了android自定义滑动开关组件,效果很好,使用方便,包括封装好的jar包,使用实例,已经所有源码
这是一款android进度条自定义的控件,用到了混合模式,进度条覆盖到文字的时候,覆盖到哪里,哪里变成白色,
Android自定义view:十字...在代码中也给出了另外五个普通按钮进行与十字按钮进行效果对比,亦可以学习自定义组件的消息派发机制.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
虽然Android给我们提供了很多现成的视图控件,但是有时候我们也需要使用到比较复杂的视图组件。这时候基本的控件是无法满足我们的需求的,所以需要进行自定义。例如,我们的app中经常需要header,header中可能有返回...
Android自定义View——彩色圆环统计图
安卓自定义View组件
本文实例讲述了Android编程自定义组件。分享给大家供大家参考,具体如下: 在Android中,所有的UI界面都是由View类和ViewGroup类及其子类组合而成。其中,View类是所有UI组件的基类,而ViewGroup类是容纳这些UI组件...
附件为个人编写的自定义android开发MVP+ViewBinding架构Demo,已经在多个项目中使用,相对比较成熟了。使用当前主流的MVP+Viewbing架构模式,喜欢的小伙伴请给个好评,谢谢!(以此篇为准)
本文实例为大家分享了Android自定义View实现跟随手指移动的小兔子,供大家参考,具体内容如下 自定义的View实现跟随手指的小兔子 按前面的例子新创建一个project,再在project中新创建一个module 将需要的背景图和...
demo中是自定义view组件
Android自定义圆角View,支持xml设置圆角半径和背景,支持自动适配大小
(一)自定义组件: /** * 水波进度效果. */ public class WaterWaveView extends View { //边框宽度 private int STROKE_WIDTH; //组件的宽,高 private int width, height; /** * 进度条最大值和当前进度...
部分源代码: ... gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); gl.glTranslatef(0, 0, -3.0f); gl.glRotatef(mAngle, 0, 1, 0); gl.glRotatef(mAngle*0.25f, 1, 0, 0); gl.