未验证 提交 e2fcc66f 编写于 作者: C chunhtai 提交者: GitHub

always forward move event (#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
上级 47c607a0
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册