Android事件分发及焦点冲突问题

Android在事件传递中因gui界面设计原因,代码开发过程中难免会触及焦点冲突问题。针对该问题,介绍在自定义控件中的事件分发及焦点处理。
一.针对action_down下的事件分发
根据源码,正常super下的事件分发经历阶段包含有activity->viewgroup->view
dispatchTouchEvent事件,返回为super时是由activity----->view进行分发;
onTouchEvent事件,返回为false/super时是由view----->activity进行回溯;
对于两者而言,当返回为true时即代表自行消耗,无需再进行下一步的传递。
onInterceptTouchEvent是viewgroup的特例,默认情况下是表示不会进行拦截,因此super时viewgroup的dispatchTouchEvent事件默认实现为onInterceptTouchEvent。也可将onInterceptTouchEvent认为是分叉口,主要是导流给view进行传递dispatchTouchEvent还是viewgroup的onTouchEvent事件。
针对事件的分发,建议以图形的方式具体展示流程处理;
有价值的参考文章:http://www.jianshu.com/p/e99b5e8bd67b
二.焦点冲突
1.viewgroup,childview
界面上的控件一般为view,而viewgroup是用于盛放这些view的容器;
(1)View直接子类:
AnalogClock, ImageView, KeyboardView, ProgressBar, SurfaceView, TextView, ViewGroup, ViewStub
(2)View派生出的间接子类有:
AbsListView, AbsSeekBar, AbsSpinner, AbsoluteLayout, AdapterView,AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView, AutoCompleteTextView,Button,CalendarView, CheckBox, CheckedTextView, Chronometer, CompoundButton,
(3)ViewGroup派生出的直接子类有:
AbsoluteLayout, AdapterView, FragmentBreadCrumbs, FrameLayout, LinearLayout, RelativeLayout, SlidingDrawer
(4)ViewGroup派生出的间接子类有:
AbsListView,AbsSpinner, AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView, CalendarView, DatePicker, DialerFilter, ExpandableListView, Gallery, GestureOverlayView, GridView, HorizontalScrollView, ImageSwitcher, ListView,
2.Viewgroup与childview中对于焦点的处理方式有:
(1)focus_before_descendants:默认方式;viewgroup焦点处理先于childview
(2)focus_after_descendants:childview处理先于viewgroup
(3)focus_block_descendants:仅viewgroup进行处理
3.android中requestfocus之前最好先clearfocus处理

你可能感兴趣的:(Android事件分发及焦点冲突问题)