根据屏幕尺寸调整对象大小

乔·约翰斯顿

给定不同的屏幕尺寸,什么是可接受的缩放UI的方法?

在设置UI时,它在一个屏幕上看起来不错,但在另一个屏幕上却很糟糕。尝试根据屏幕尺寸设置可能的动态样式。我这里有一个简单的标头,标签中带有FormattedString。我想使整个标签居中,而跨度格式保持不变。理想情况下,我想将文本的高度设置为Current.MainPage.Height的某个百分比。

从App.xaml

<Application.Resources>
    <ResourceDictionary>
        <Style x:Key="HeaderSpans" TargetType="Span" >
            <Setter Property="BackgroundColor" Value="Transparent"></Setter>
            <Setter Property="HorizontalOptions" Value="Center"></Setter>
            <Setter Property="TextColor" Value="White"></Setter>
            <Setter Property="VerticalTextAlignment" Value="Center"></Setter>
            <Setter Property="Margin" Value="0, 20, 0, 0"></Setter>
        </Style>
        <Style x:Key="HeaderSpan" TargetType="Span" >
            <Setter Property="TextColor" Value="White"></Setter>
            <Setter Property="FontSize" Value="32"></Setter>

        </Style>
        <Style x:Key="HeaderSpanB" TargetType="Span" >
            <Setter Property="TextColor" Value="White"></Setter>
            <Setter Property="FontSize" Value="32"></Setter>
            <Setter Property="FontAttributes" Value="Bold"></Setter>
        </Style>
    </ResourceDictionary>
</Application.Resources>

后面的代码

        switch (Device.RuntimePlatform)
        {
            case Device.iOS:
                //MainPage.BackgroundColor = Color.Black;
                break;
            case Device.Android:
                //MainPage.BackgroundColor = Color.Red;
                break;
            case Device.UWP:
                //MainPage.BackgroundColor = Color.Orange;
                break;
            default:
                //MainPage.BackgroundColor = Color.Transparent;
                break;
        }

我以为我可以利用这段代码来完成任务。但是我不知道如何从那里影响样式。我认为二传手可能是正确的道路。我没有取得扎实的进展。

从Header.xaml

<!-- dark-blue backing header -->
<Image Source="Header752x135.png" VerticalOptions="Start" HorizontalOptions="CenterAndExpand"></Image>

<!-- SHIPSHAPE text placed on the backing header -->
<Label

    Style="{StaticResource HeaderSpans}"
>
    <Label.FormattedText>
        <FormattedString>
            <Span Text="SHIP" Style="{StaticResource HeaderSpan}" />
            <Span Text="SHAPE" Style="{StaticResource HeaderSpanB}" />
        </FormattedString>
    </Label.FormattedText>
</Label>

没有任何代码。

如果有人可以引导我找到正确的解决方案,我将不胜感激。

马库斯·米歇尔(Markus Michel)

如果要根据平台更改UI的值,则可以使用“在平台上”语句。例如,如果您想在iOS上使用不同于在Android上使用的网格边距,则可以这样使用:

<Grid>
    <Grid.Margin>
        <On Platform x:TypeArguments="Thickness">
            <On Platform="iOS">0,0,0,0</On>
            <On Platform="Android">15,0,15,0</On>
        </OnPlatform>
    </Grid.Margin>
</Grid>

当然,您也可以将其用于其他属性。请记住,如果在view.xaml中设置属性,它将覆盖相同属性的样式定义(如果存在)。

可以根据屏幕高度来设置字体大小,如下所示:

获取屏幕尺寸-共享

我们将需要实现一个依赖服务,该服务允许我们检索实际的屏幕高度或宽度。

因此,在共享代码中,创建一个新接口:

IScreenDimensions.cs

public interface IScreenDimensions
{
    double GetScreenWidth();
    double GetScreenHeight();
}

在您的android实现中,添加接口的实现:

获取屏幕尺寸-Android

ScreenDimensions.cs

[assembly: Dependency(typeof(ScreenDimensions))]
namespace MyAppNamespace.Droid
{
    public class ScreenDimensions : IScreenDimensions
    {
        public double GetScreenHeight()
        {
            return ((double)Android.App.Application.Context.Resources.DisplayMetrics.HeightPixels / (double)Android.App.Application.Context.Resources.DisplayMetrics.Density);
        }

        public double GetScreenWidth()
        {
            return ((double)Android.App.Application.Context.Resources.DisplayMetrics.WidthPixels / (double)Android.App.Application.Context.Resources.DisplayMetrics.Density);
        }
    }
}

获取屏幕尺寸-iOS

ScreenDimensions.cs

[assembly: Dependency(typeof(ScreenDimensions))]
namespace MyAppNamespace.iOS
{
    public class ScreenDimensions : IScreenDimensions
    {
        public double GetScreenHeight()
        {
            return (double)UIScreen.MainScreen.Bounds.Height;
        }

        public double GetScreenWidth()
        {
            return (double)UIScreen.MainScreen.Bounds.Width;
        }
    }
}

构建一个值转换器以消耗屏幕尺寸

现在,我们创建一个IValueConverter(再次在共享代码中):

ScreenSizeToRelativeSizeConverter.cs

public class ScreenSizeToRelativeSizeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double height = DependencyService.Get<IScreenDimensions>().GetScreenHeight();
        return (double) height * (double) parameter;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // no need to convert anything back
        throw new NotImplementedException();
    }
}

请注意,转换器需要一个参数,该参数告诉它最终得到的屏幕尺寸的哪一部分。

全部放在一起

最后,将以下资源添加到App.xaml文件中:

<Application.Resources>
    <ResourceDictionary>
        <converter:ScreenSizeToRelativeSizeConverter x:Key="SizeToRelativeSizeConverter"/>
        <x:Double x:Key="fontSizeFactor">0.03</x:Double>
        <Style x:Key="LabelStyle" TargetType="Label">
            <Setter Property="FontSize" Value="{Binding Converter={StaticResource SizeToRelativeSizeConverter}, ConverterParameter={StaticResource fontSizeFactor}}" />
        </Style>
    </ResourceDictionary>
</Application.Resources>

并将样式设置为有问题的标签(或其他元素):

<Label Text="Welcome to Xamarin.Forms!" Style="{StaticResource LabelStyle}"
       HorizontalOptions="Center"
       VerticalOptions="CenterAndExpand" />

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何根据屏幕尺寸调整页面上Divs的大小?

如何根据屏幕尺寸调整网格图像的大小?

根据屏幕尺寸调整可绘制尺寸

根据屏幕比例调整大小

自动调整按钮大小以适应屏幕尺寸?

调整UITableViewCell的大小以适合不同的屏幕尺寸

如何根据屏幕尺寸调整图像

根据颤动的屏幕尺寸调整类

如何根据屏幕尺寸 webform 调整 Datagridview 列的宽度和大小?

如何根据设备屏幕尺寸调整收藏视图单元格的大小?

如何根据屏幕尺寸适当调整画布大小?Javascript(p5.js)[已解决]

如何根据屏幕尺寸调整输入的大小(由用户在弹出窗口中选择)

根据屏幕大小调整文本大小

根据显示尺寸自动调整图像大小

旋转然后根据父母的尺寸调整大小

根据屏幕尺寸更改分区大小

如何根据屏幕大小进行自动布局调整标签和其他对象的大小

ImageView-根据Android屏幕调整大小

布局根据屏幕大小调整

如何随着屏幕尺寸的变化调整 div 的大小?

根据屏幕尺寸调整 3D 游戏

移动版式未根据屏幕尺寸进行调整

根据屏幕大小按比例调整文本大小

Flutter:如何根据设备的屏幕大小调整文本大小

使用更少的CSS根据屏幕大小调整视频大小

iOS:UICollectionViewCell根据屏幕大小自动调整大小

如何根据屏幕大小调整php中的图像大小?

导航栏根据屏幕大小调整大小

如何根据屏幕大小调整表单字段的大小?