function TPlatformAndroid.GetScreenScale: Single; const // Default values taken from Android SDK reference: // http://developer.android.com/reference/android/util/DisplayMetrics.html#density DefaultDensityScale = 1; DefaultDensityDPI = 160; var Metrics: JDisplayMetrics; DensityScale, DensityDPI: Single; begin if SameValue(FScreenScale, 0, TEpsilon.Scale) then begin Metrics := GetJDisplayMetrics; if Assigned(Metrics) then begin DensityScale := Metrics.density; // API level 1 DensityDPI := Metrics.densityDpi; // API level 4 end else begin DensityScale := DefaultDensityScale; DensityDPI := DefaultDensityDPI; end;
FScreenScale := DensityScale;
if Assigned(ScreenScaleOverrideHook) then begin ScreenScaleOverrideHook(ScreenScaleOverrideHookContext, DensityScale, DensityDPI, FScreenScale);
if FScreenScale < 1 then FScreenScale := 1 else if FScreenScale > 3 then FScreenScale := 3; end; end;
Result := FScreenScale; end;
constructor TWindowManager.Create; begin ...... FScale := PlatformAndroid.GetScreenScale; ...... end;
看起来相当美好。然而下述代码并不能生效,引用该单元后屏幕缩放比例并未改变。
unit TestScreenScale;
uses FMX.Platform.Android;
implementation
procedure MyHook(const UserContext: Pointer; const DensityScale, DensityDPI: Single; var ScreenScale: Single); begin ScreenScale := ScreenScale / 2; end;