当前位置:网站首页>Analyze Android event distribution mechanism according to popular interview questions (II) -- event conflict analysis and handling
Analyze Android event distribution mechanism according to popular interview questions (II) -- event conflict analysis and handling
2022-07-07 09:52:00 【Time swordsman】
( One ) Overview of incident conflict
Event conflicts usually occur in the parent view Hezi view Combination of , for instance viewpager and listview Combination of . The cause of the event conflict is an event (down,up,move) When we arrive , Sometimes we want to be A view Handle , But it was B view Handle . This leads to what we want to deal with view No events , Don't want to deal with events view Received the incident . And to solve the conflict is to pass viewGroup Of onInterceptTouchEvent() Methods to distribute events reasonably , Let those who want to deal with the event view Received the incident , Don't want to deal with it view Lie flat and do nothing .
( Two ) There is no effect display of event conflict
( Look at the beauty , Write code again ~~)
Get down to business , As shown in the figure above ,demo Is written by a viewpager+listView The combination of , We found that in the case of no event conflict , It should be able to slide left and right , It can also slide up and down . To demonstrate , We inherit from viewpager and Listview,viewPager As a father view, Rewrite its onInterceptTouchEvent Method ,listview As a child view, rewrite dispatchTouchevent.( When needed ),demo The source code of is very simple , I'll give it at the end of the article .
( explain : If you do not override onInterceptTouchEvent and listview Of dispatchTouchevent Method , We use it directly viewpager+listview The combination will find that there will be no event conflict , That's because sdk The conflict has been resolved , You can see viewpager Source code )
Simulate the generation of conflict :
scene 1: When we are in the father view, That is to say viewPager Of onInterceptTouchEvent Method to return true, Intercept the incident , At this time, we will find that we can only respond view pager Slide left and right , And cannot respond listview Slide up and down , The reason is that we are in the father view Directly intercepted the event , Lead to view listview No events , Unable to respond to events .
scene 2: When we are in the father view, That is to say viewPager Of onInterceptTouchEvent Method to return false, Don't intercept events , At this time, we will find ,viewpager Do not slide left or right , It can only slide up and down listview, This is because viewpager Don't intercept events , Distributed the event to the child view Handle , So he can't respond to his left-right sliding event .
( 3、 ... and ) Interview questions : Have you ever encountered sliding conflict ? How did you handle it ?
analysis : At this time, if you have met , Just answer the situation caused by the conflict you encounter , Then say your solution , If you haven't met , Just answer what we mentioned in this article viewpager+listview Scene . Summarize according to the above content , Then there is the answer of how to solve the conflict , At this time, you can answer that there are two ways to solve the conflict :
Method 1 : In the father view Of onInterceptTouchEvent Conflict resolution in , The code is as follows :
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// In the father view Conflict handling in , There is no need for children view Realization dispatchTouchEvent Method
float x = ev.getX();// Record x,y The initial value of the
float y = ev.getY();
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
super.onInterceptTouchEvent(ev);
// You need to call sdk Medium viewpager Medium
//onInterceptTouchEvent Methods to deal with some special problems
// If we don't call, we can't respond to sliding even if we intercept the event
return false;// Can't intercept down event , Intercepted down
// event , You can't receive the following move, and up The incident is over
case MotionEvent.ACTION_MOVE:
float xDiff = Math.abs(x-mLastX);
// When move When the event comes, we will calculate this x Value and last
//x value , You get a difference
float yDiff = Math.abs(y-mLastY);
//y The calculation of the value and x equally
if(xDiff > yDiff){
//x The difference is greater than y The difference between the , Indicates that the current is sliding left and right . At this time, the event should be handed over to viewpager Handle , Intercept the incident
isIntercept = true;
break;
}
if(yDiff > xDiff){
//y Greater than x value , Indicates that it is currently sliding up and down , At this time, the event should be handed over to listview Handle , Don't intercept events
isIntercept = false;
break;
}
// break;
}
mLastX = x;// Update the last x Values and y value
mLastY = y;
return isIntercept;
}
Method 2: In the child view Do sliding conflict processing in ,listview The code in is as follows :
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
float x = ev.getX();
float y = ev.getY();
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
getParent().requestDisallowInterceptTouchEvent(true);
// Ask the father view Don't intercept events
break;
case MotionEvent.ACTION_MOVE:
float xDiff = Math.abs(x-mLastX);
float yDiff = Math.abs(y-mLastY);
if(xDiff > yDiff){
// Currently, it slides left and right , You don't need to deal with events , Ask the father view Intercept the incident .
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
default:break;
}
mLastX = x;
mLastY = y;
// Calling the dispatchTouchEvent Handling events
return super.dispatchTouchEvent(ev);
}
viewPager The code in is as follows :
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// In the child view Conflict handling in .
if(ev.getAction() == MotionEvent.ACTION_DOWN){
super.onInterceptTouchEvent(ev);
// Must return false, Otherwise the child view Unable to receive event , There will be an interview question here
return false;
}
// return true, To be a son view Ask the father view When intercepting events , Good interception
return true;
}
In the child view Handle conflicts in and in the parent view The principle of dealing with conflicts is similar , Events are distributed to those who need them through interception and non interception view. When answering, roughly describe the two methods .
And then , The interviewer may ask you : Why not intercept down event , Intercepted down event , hinder move,up Can the event still be received ?
These two problems are actually mutually causal , That is to intercept down event , hinder move,up Events cannot be received . At this time, you can start to put out the source code of the event distribution mechanism you see :
... Some code is omitted
// Check for interception.
final boolean intercepted;
if (actionMasked == MotionEvent.ACTION_DOWN
|| mFirstTouchTarget != null) {
final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;
// If son view There is no call requestDisallowInterceptTouchEvent Method to set the flag , This place will be false, Because in the front down The flag will be reset when the event comes
if (!disallowIntercept) {
intercepted = onInterceptTouchEvent(ev);// If intercepted down event , This place will return true; Unable to enter the next event distribution logic , then mFirstTouchTarget Will not be assigned , Cannot walk into the current code logic , Cause the following move and up The event will be directly intercepted
============= Episode ==============
if (!canceled && !intercepted) {
....
// Event distribution processing logic
.....
}
===========================
ev.setAction(action); // restore action in case it was changed
} else {
intercepted = false;
}
} else {
// There are no touch targets and this action is not an initial down
// so this view group continues to intercept touches.
// If not dealt with down At the time of the event ,move and up Events will be intercepted
intercepted = true;
}
... Some code is omitted
Specific event distribution process , See my last blog According to the analysis of popular interview questions Android Event distribution mechanism ( One )
( Four ) summary :
In fact, event distribution mechanism and sliding conflict are not difficult to solve as long as you understand the source code , My suggestion is to read the blog and then go to the source code by yourself , Write demo Simulate every scenario , Then you will find that these principles are all true , It can also help you get the initiative during the interview , Most of the time when we interview, we feel overwhelmed by the interviewer's momentum , In fact, it's all because we don't know much about technology . When we have a thorough understanding of Technology , When you go to the interview, you will find , The interviewer will be abused by you . That feeling is very cool
( 5、 ... and )demo Address
I put this source code in gitee Upper , You have applied for opening permission , It's still being approved , If you urgently need a partner of the source code , You can leave an email , I send it to you in private ~~~~
Event conflict demonstration demo Address
边栏推荐
- js逆向教程第二发-猿人学第一题
- CDZSC_2022寒假个人训练赛21级(1)
- CentOS installs JDK1.8 and mysql5 and 8 (the same command 58 in the second installation mode is common, opening access rights and changing passwords)
- Check the example of where the initialization is when C initializes the program
- JS逆向教程第一发
- 印象笔记终于支持默认markdown预览模式
- flink. CDC sqlserver. 可以再次写入sqlserver中么 有连接器的 dem
- Basic chapter: take you through notes
- 视频化全链路智能上云?一文详解什么是阿里云视频云「智能媒体生产」
- 大佬们,有没有遇到过flink cdc读MySQLbinlog丢数据的情况,每次任务重启就有概率丢数
猜你喜欢
esp8266使用TF卡并读写数据(基于arduino)
How to use clipboard JS library implements copy and cut function
VSCode+mingw64
csdn涨薪技术-浅学Jmeter的几个常用的逻辑控制器使用
Applet popup half angle mask layer
Loxodonframework quick start
In fact, it's very simple. It teaches you to easily realize the cool data visualization big screen
JS reverse tutorial second issue - Ape anthropology first question
面试被问到了解哪些开发模型?看这一篇就够了
【BW16 应用篇】安信可BW16模组/开发板AT指令实现MQTT通讯
随机推荐
How to use Mongo shake to realize bidirectional synchronization of mongodb in shake database?
第一讲:包含min函数的栈
2020ccpc Weihai J - Steins; Game (SG function, linear basis)
【frida实战】“一行”代码教你获取WeGame平台中所有的lua脚本
Dynamics 365online applicationuser creation method change
Binary tree high frequency question type
Liunx command
IIS redirection redirection appears eurl axd
内存==c语言1
La différence entre viewpager 2 et viewpager et la mise en œuvre de la rotation viewpager 2
Gym - 102219j kitchen plates (violent or topological sequence)
沙龙预告|GameFi 领域的瓶颈和解决方案
Elaborate on MySQL mvcc multi version control
Niuke - Huawei question bank (61~70)
The difference between viewpager2 and viewpager and the implementation of viewpager2 in the rotation chart
[original] what is the core of programmer team management?
How to become a senior digital IC Design Engineer (5-2) theory: ULP low power design technology (Part 1)
如何使用clipboard.js库实现复制剪切功能
【无标题】
iNFTnews | 时尚品牌将以什么方式进入元宇宙?