mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
always forward move event (flutter/engine#17541)
flutter/flutter#54022 The original issue is the _MotionEventsDispatcher depends on all down pointers to send out their own move events. If the third pointer has the movement of zero, it will get filter out by the PointerDataPacketConverter. This result with only two pointer move events been sent to RenderAndroidView, and they both get ignored because it is waiting for the third one. This pr fixes it by always forward the move event
This commit is contained in:
parent
d5245440ff
commit
2a55af809a
@ -169,11 +169,9 @@ void PointerDataPacketConverter::ConvertPointerData(
|
||||
PointerState state = iter->second;
|
||||
FML_DCHECK(state.isDown);
|
||||
|
||||
if (LocationNeedsUpdate(pointer_data, state)) {
|
||||
UpdatePointerIdentifier(pointer_data, state, false);
|
||||
UpdateDeltaAndState(pointer_data, state);
|
||||
converted_pointers.push_back(pointer_data);
|
||||
}
|
||||
UpdatePointerIdentifier(pointer_data, state, false);
|
||||
UpdateDeltaAndState(pointer_data, state);
|
||||
converted_pointers.push_back(pointer_data);
|
||||
break;
|
||||
}
|
||||
case PointerData::Change::kUp: {
|
||||
|
||||
@ -244,6 +244,43 @@ TEST(PointerDataPacketConverterTest, CanUpdatePointerIdentifier) {
|
||||
ASSERT_EQ(result[6].synthesized, 0);
|
||||
}
|
||||
|
||||
TEST(PointerDataPacketConverterTest, AlwaysForwardMoveEvent) {
|
||||
PointerDataPacketConverter converter;
|
||||
auto packet = std::make_unique<PointerDataPacket>(4);
|
||||
PointerData data;
|
||||
CreateSimulatedPointerData(data, PointerData::Change::kAdd, 0, 0.0, 0.0);
|
||||
packet->SetPointerData(0, data);
|
||||
CreateSimulatedPointerData(data, PointerData::Change::kDown, 0, 0.0, 0.0);
|
||||
packet->SetPointerData(1, data);
|
||||
// Creates a move event without a location change.
|
||||
CreateSimulatedPointerData(data, PointerData::Change::kMove, 0, 0.0, 0.0);
|
||||
packet->SetPointerData(2, data);
|
||||
CreateSimulatedPointerData(data, PointerData::Change::kUp, 0, 0.0, 0.0);
|
||||
packet->SetPointerData(3, data);
|
||||
|
||||
auto converted_packet = converter.Convert(std::move(packet));
|
||||
|
||||
std::vector<PointerData> result;
|
||||
UnpackPointerPacket(result, std::move(converted_packet));
|
||||
|
||||
ASSERT_EQ(result.size(), (size_t)4);
|
||||
ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
|
||||
ASSERT_EQ(result[0].synthesized, 0);
|
||||
|
||||
ASSERT_EQ(result[1].change, PointerData::Change::kDown);
|
||||
ASSERT_EQ(result[1].pointer_identifier, 1);
|
||||
ASSERT_EQ(result[1].synthesized, 0);
|
||||
|
||||
// Does not filter out the move event.
|
||||
ASSERT_EQ(result[2].change, PointerData::Change::kMove);
|
||||
ASSERT_EQ(result[2].pointer_identifier, 1);
|
||||
ASSERT_EQ(result[2].synthesized, 0);
|
||||
|
||||
ASSERT_EQ(result[3].change, PointerData::Change::kUp);
|
||||
ASSERT_EQ(result[3].pointer_identifier, 1);
|
||||
ASSERT_EQ(result[3].synthesized, 0);
|
||||
}
|
||||
|
||||
TEST(PointerDataPacketConverterTest, CanWorkWithDifferentDevices) {
|
||||
PointerDataPacketConverter converter;
|
||||
auto packet = std::make_unique<PointerDataPacket>(12);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user