mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

In the multi view world, `RenderViews` are created by the `View` widget and no longer owned by the binding. Prior to this change, the `LiveTestWidgetsFlutterBinding` owned and managed a special subclass of `RenderView`, the `_LiveTestRenderView`. In the new world, where `RenderView`s can be created anywhere in the widget tree where a `View` widget is used, this setup is no longer feasible. This change removes this special `_LiveTestRenderView` and instead adds debug hocks to `RenderView` to allow the `LiveTestWidgetsFlutterBinding` to draw a debug overlay on top of the content of any `RenderView`.
71 lines
3.7 KiB
Dart
71 lines
3.7 KiB
Dart
// Copyright 2014 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'package:flutter/rendering.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
final LiveTestWidgetsFlutterBinding binding = LiveTestWidgetsFlutterBinding.ensureInitialized();
|
|
|
|
testWidgets('localToGlobal and globalToLocal calculate correct results', (WidgetTester tester) async {
|
|
tester.view.physicalSize = const Size(2400, 1800);
|
|
tester.view.devicePixelRatio = 3.0;
|
|
final RenderView renderView = RenderView(
|
|
view: tester.view,
|
|
configuration: TestViewConfiguration.fromView(
|
|
view: tester.view,
|
|
size: const Size(400, 200),
|
|
)
|
|
);
|
|
|
|
// The configuration above defines a view with a resolution of 2400x1800
|
|
// physical pixels. With a device pixel ratio of 3x, this yields a
|
|
// resolution of 800x600 logical pixels. In this view, a RenderView sized
|
|
// 400x200 (in logical pixels) is fitted using the BoxFit.contain
|
|
// algorithm (as documented on TestViewConfiguration. To fit 400x200 into
|
|
// 800x600 the RenderView is scaled up by 2 to fill the full width and then
|
|
// vertically positioned in the middle. The origin of the RenderView is
|
|
// located at (0, 100) in the logical coordinate space of the view:
|
|
//
|
|
// View: 800 logical pixels wide (or 2400 physical pixels)
|
|
// +---------------------------------------+
|
|
// | |
|
|
// | 100px |
|
|
// | |
|
|
// +---------------------------------------+
|
|
// | |
|
|
// | RenderView (400x200px) |
|
|
// | 400px scaled to 800x400px | View: 600 logical pixels high (or 1800 physical pixels)
|
|
// | |
|
|
// | |
|
|
// +---------------------------------------+
|
|
// | |
|
|
// | 200px |
|
|
// | |
|
|
// +---------------------------------------+
|
|
//
|
|
// All values in logical pixels until otherwise noted.
|
|
//
|
|
// A point can be translated from the local coordinate space of the
|
|
// RenderView (in logical pixels) to the global coordinate space of the View
|
|
// (in logical pixels) by multiplying each coordinate by 2 and adding 100 to
|
|
// the y coordinate. This is what the localToGlobal/globalToLocal methods
|
|
// do:
|
|
|
|
expect(binding.localToGlobal(const Offset(0, -50), renderView), Offset.zero);
|
|
expect(binding.localToGlobal(Offset.zero, renderView), const Offset(0, 100));
|
|
expect(binding.localToGlobal(const Offset(200, 100), renderView), const Offset(400, 300));
|
|
expect(binding.localToGlobal(const Offset(150, 75), renderView), const Offset(300, 250));
|
|
expect(binding.localToGlobal(const Offset(400, 200), renderView), const Offset(800, 500));
|
|
expect(binding.localToGlobal(const Offset(400, 400), renderView), const Offset(800, 900));
|
|
|
|
expect(binding.globalToLocal(Offset.zero, renderView), const Offset(0, -50));
|
|
expect(binding.globalToLocal(const Offset(0, 100), renderView), Offset.zero);
|
|
expect(binding.globalToLocal(const Offset(400, 300), renderView), const Offset(200, 100));
|
|
expect(binding.globalToLocal(const Offset(300, 250), renderView), const Offset(150, 75));
|
|
expect(binding.globalToLocal(const Offset(800, 500), renderView), const Offset(400, 200));
|
|
expect(binding.globalToLocal(const Offset(800, 900), renderView), const Offset(400, 400));
|
|
});
|
|
}
|