自定义控件

一自定义控件:继承View或者View的派生类,然后再重写类中的内部方法。
1.自定义View:继承View
2.基于现有组件:继承View的派生类
3.组合的方式:自定义控件中包含了其他的组件
在这里插入图片描述
二.自定义控件分类:

1、使用系统控件,实现自定义的效果
2、自己定义一个类继承View ,如textView、ImageView等,通过重写相关的方法来实现新的效果
3、自己定义一个类继承ViewGroup,实现相应的效果
继承view类或viewgroup类,来创建所需要的控件。一般来讲,通过继承已有的控件来自定义控件要简单一点。
介绍下实现一个自定义view的基本流程
1.明确需求,确定你想实现的效果。
2.确定是使用组合控件的形式还是全新自定义的形式,组合控件即使用多个系统控件来合成一个新控件,你比如titilebar,这种形式相对简单。
3.如果是完全自定义一个view的话,你首先需要考虑继承哪个类,是View呢,还是ImageView等子类。
4.根据需要去复写View#onDraw、View#onMeasure、View#onLayout方法。
5.根据需要去复写dispatchTouchEvent、onTouchEvent方法。
6.根据需要为你的自定义view提供自定义属性,即编写attr.xml,然后在代码中通过TypedArray等类获取到自定义属性值。
7.需要处理滑动冲突、像素转换等问题。

三.绘制流程:
onMeasure测量view的大小,设置自己显示在屏幕上的宽高。
onLayout确定view的位置,父view 会根据子view的需求,和自身的情况,来综合确定子view的位置(确定他的大小)。
onDraw(Canvas)绘制 view 的内容。
在主线程中 拿到view调用Invalide()方法,刷新当前视图,导致执行onDraw执行,如果是在子线程用postinvalidate,或者不需要一直刷新用postinvalidateDelayed(300),每隔300毫秒刷新一次。
如果希望视图的绘制流程(三步)可以完完整整地重新走一遍,就不能使用invalidate()方法,而应该调用requestLayout()了。
事件冲突
当点击事件发生时,事件最先传递给Activity,Activity会首先将事件将被所属的Window进行处理,即调用superDispatchTouchEvent()方法。
通过观察superDispatchTouchEvent()方法的调用链,我们可以发现事件的传递顺序:
PhoneWinodw.superDispatchTouchEvent()
DecorView.dispatchTouchEvent(event)
ViewGroup.dispatchTouchEvent(event)
事件一层层传递到了ViewGroup里。
当事件出现时,先从顶级开始往下传递,每到一个子view,看他的onInterceptTouchEvent 方法是否拦截,ontouch是否消费方法,如果没有继续向下dispatchTouchEvent分发事件,都不处理向上传,当回到顶级,若顶层(activity)也不对此事件进行处理,此事件相当于消失了(无效果)。
View没有onInterceptTouchEvent()方法,一但有点击事件传递给它,它的ouTouchEvent()方法就会被调用。
事件发现冲突的时候,处理的原则就是事件分发机制,有俩种方法:
外部处理,重写父view的onInterceptTouchEvent ,MotionEvent的事件全部返回false,不拦截;
内部处理。重写子view的dispatchTouchEvent,通过requestDisallowInterceptTouchEvent方法(这个方法可以在子元素中干预父元素的事件分发过程),请求父控件不拦截自己的事件,true是不拦截,false是拦截。
Activity/Window/View三者的差别,Activity 如何显示到屏幕上
ActivityManager :用于维护与管理 Activity 的启动与销毁
WindowManagerService:用来创建、管理和销毁Window。
Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutInflater像剪刀,Xml配置像窗花图纸。
在Activity中执行setContentView方法后会执行PhoneWindow的setContentView,在该方法中会生成DecorView 组件作为应用窗口的顶层视图。
DecorView 是PhoneWindow的内部类,继承至FrameLayout,DecorView 会添加一个id为content的FrameLayout作为根布局,Activity的xml文件会通过LayoutInflater的inflate方法解析成View树添加到id为content的FrameLayout中。
ViewRoot不是View,它的实现类是ViewRootImpl,ViewRoot是DecorView的“管理者”。它是DecorView和WindowManager之间的纽带。
毕竟“管理者”,所以View的绘制流程是从ViewRoot的performTraversals方法开始的。所以performTraversals方法依次调用performMeasure,performLayout和performDraw三个方法。然后各自经历measure、layout、draw三个流程最终显示在用户面前,用户在点击屏幕时,点击事件随着Activity传入Window,最终由ViewGroup/View进行分发处理。
ActivityThread,Ams,Wms的工作原理
ActivityThread: 运行在应用进程的主线程上,响应 ActivityMananger、Service 启动、暂停Activity,广播接收等消息。
Ams:统一调度各应用程序的Activity、内存管理、进程管理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值