Xamarin C#将视图宽度设置为Android屏幕的百分比

时间:2016-04-05 18:32:40

标签: c# android xamarin

我有这个按钮,我想要25%的屏幕宽度和方形。我已经看到了一些制作网格的方法但是效果还不好。有人对此事有任何意见吗? 还需要描述更多的背景吗?

3 个答案:

答案 0 :(得分:7)

Android.Support.Design包还提供了一种名为PercentRelativeLayout的新布局类型。

您可以通过将Xamarin.Android.Support.Percent NuGet package添加到项目中来获取它。

这样您就可以将PercentRelativeLayout添加到您的布局中,如:

<android.support.percent.PercentRelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"/>
     <ImageView
         app:layout_widthPercent="50%"
         app:layout_heightPercent="50%"
         app:layout_marginTopPercent="25%"
         app:layout_marginLeftPercent="25%" />
     <!-- more views here -->
</android.support.percent.PercentRelativeLayout>

您可以找到more information about this layout in the Google API docs

答案 1 :(得分:2)

您可以使用水平LinearLayout并将按钮的layout_weight设置为.25,并添加权重为.75的空视图。注意:将layout_width设置为0.

<LinearLayout
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <Button
        android:text="MyButton" 
        android:layout_width="0dp" 
        android:layout_height="wrap_content" 
        android:layout_weight=".25" /> 

    <View
        android:layout_width="0dp" 
        android:layout_height="wrap_content" 
        android:layout_weight=".75" />
</LinearLayout>

如果你想要平方,你必须创建一个自定义布局,如:

public class SquareLayout : LinearLayout
{
    protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        var width = MeasureSpec.GetSize(widthMeasureSpec);
        var height = MeasureSpec.GetSize(heightMeasureSpec);

        if (height == 0 && width == 0)
        {
            base.OnMeasure(widthMeasureSpec, heightMeasureSpec);
            return;
        }

        if (height == 0)
        {
            height = width;
        }
        else if (width == 0)
        {
            width = height;
        }

        if (width > height)
            width = height;
        else
            height = width;

        base.OnMeasure(
            MeasureSpec.MakeMeasureSpec(width, MeasureSpecMode.Exactly),
            MeasureSpec.MakeMeasureSpec(height, MeasureSpecMode.Exactly)
        );
    }

    protected SquareLayout(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
    {
    }

    public SquareLayout(Context context) : base(context)
    {
    }

    public SquareLayout(Context context, IAttributeSet attrs) : base(context, attrs)
    {
    }

    public SquareLayout(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
    {
    }
}

然后在你的axml中使用你的布局

<LinearLayout
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <mynamespacelowercase.SquareLayout
        android:layout_width="0dp" 
        android:layout_height="wrap_content" 
        android:layout_weight=".25">
        <Button
            android:text="MyButton" 
            android:layout_width="match_parent" 
            android:layout_height="match_parent" /> 
    <mynamespacelowercase.SquareLayout>

    <View
        android:layout_width="0dp" 
        android:layout_height="wrap_content" 
        android:layout_weight=".75" />

</LinearLayout>

或者您可以修改自定义布局以根据百分比计算宽度。那么你就不需要空视图和布局权重了。

答案 2 :(得分:0)

感谢您的回复。

我发现这是最简单的。

var metric = Resources.DisplayMetrics;
width = (int)(metric.WidthPixels * .25);

然后我在LayoutParameters

中设置宽度