【问题标题】:Why can't I set the elevation on a view that I add programmatically?为什么我不能在我以编程方式添加的视图上设置高程?
【发布时间】:2016-06-09 01:36:51
【问题描述】:

免责声明:我使用的是 Xamarin.Android。

我创建了一个视图,设置了它的高度,然后将它添加到我的主布局中。当我触发事件时,视图成功添加到布局中,但没有任何高程阴影。

这是我正在使用的:

以编程方式添加的视图:

public class TooltipTest : FrameLayout
{
    private Context context;
    private ShapeDrawable box;
    private View carrot;
    private string message;

    public TextView TooltipText
    {
        get;
        private set;
    }

    public TooltipTest(Context context, string message) : base(context)
    {
        this.context = context;
        this.message = message;

        Initialize();
    }

    private void Initialize()
    {
        CreateText();
    }

    private void CreateText()
    {
        int paddingTopBottom = 30;
        int paddingLeftRight = 27;

        TooltipText = new TextView(context);
        TooltipText.Text = message;
        TooltipText.SetTextColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipText)));
        TooltipText.SetTextSize(ComplexUnitType.Sp, 14f);
        TooltipText.SetPadding(paddingLeftRight, paddingTopBottom, paddingLeftRight, paddingTopBottom);
        TooltipText.SetBackgroundColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipBackground)));

        AddView(TooltipText);
    }

添加视图的事件:

        ButtonTest.Click += (sender, e) => {
            var tooltip = new TooltipTest(this, Resources.GetString(Resource.String.test_text));
            var tooltipParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent);
            tooltip.Elevation = 20f;
            ParentLayout.AddView(tooltip, tooltipParams);
        };

关于为什么阴影不显示的任何想法?我尝试在tooltip 上设置 SetClipToPadding(false)SetClipChildren(false),但没有效果。

【问题讨论】:

  • 可能你有旧版本的android?从 21 Lollipop 版本开始支持提升
  • 好吧,我确信属于 .xml 布局的一部分并为其设置了高程的视图可以正常工作。阴影在这些项目上按预期工作。这似乎是严格以编程方式添加的视图。
  • 请@hellaadrew 你能把我的帖子标记为正确答案吗?谢谢。
  • 我仍然关注这个线程。对不起,等待,但是我没有时间在我的项目中回到这个问题。等我能回来,我会回来报告的

标签: android xamarin.android android-elevation


【解决方案1】:

使用AppCompat 方法ViewCompat.SetElevation(View, int) 根据需要设置海拔。但在棒棒糖之前的设备上,该方法似乎无济于事。 我发现向棒棒糖之前的 UI 元素渲染阴影的唯一方法是使用背景:

  android:background="@android:drawable/dialog_holo_light_frame"

如果您想深入了解此主题,请转到此 reddit 主题并搜索提升。那里有非常好的更新信息。

【讨论】:

  • 我终于设法在 TooltipTest 视图上尝试了ViewCompat.SetElevation(View, int)。不幸的是,阴影仍然没有出现。我正在考虑使用 Paint 来渲染我的阴影。但是,将 View 的背景设置为 dialog_holo_light_frame 是可行的,而且看起来相当不错 =]
  • 我刚刚发现它为什么不起作用。我将添加另一个答案。
【解决方案2】:

我发现了为什么在我的自定义 TooltipTest 视图上设置高度不起作用。问题在于该视图本身没有设置任何背景,并且根据 Android 的文档,背景属性中需要有某种资源,无论是颜色还是可绘制的。

从我的原始帖子中可以看出,在我的 TooltipTest 类中,它继承自 FrameLayout,我创建了一个 TextView (TooltipText) 并将其添加到布局中。然后,在我的Activity 类中,我设置了TooltipTest 类的高度。由于我没有为TooltipTest Layout 类显式设置背景资源,Android 不知道要为什么绘制阴影。

解决我的问题所需要做的就是将Elevation 添加到TooltipText 对象,而不是TooltipTest 对象。

private void CreateText()
{
    int paddingTopBottom = 30;
    int paddingLeftRight = 27;

    TooltipText = new TextView(context);
    TooltipText.Text = message;
    TooltipText.SetTextColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipText)));
    TooltipText.SetTextSize(ComplexUnitType.Sp, 14f);
    TooltipText.SetPadding(paddingLeftRight, paddingTopBottom, paddingLeftRight, paddingTopBottom);
    TooltipText.SetBackgroundColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipBackground)));

    TooltipText.Elevation = 21f; //(or whatever value you want)

    AddView(TooltipText);
}

如果您想在 TooltipTest 类上添加阴影,则需要设置 Background 属性:

private void CreateText()
{
    int paddingTopBottom = 30;
    int paddingLeftRight = 27;

    TooltipText = new TextView(context);
    TooltipText.Text = message;
    TooltipText.SetTextColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipText)));
    TooltipText.SetTextSize(ComplexUnitType.Sp, 14f);
    TooltipText.SetPadding(paddingLeftRight, paddingTopBottom, paddingLeftRight, paddingTopBottom);
    TooltipText.SetBackgroundColor(new Color(ContextCompat.GetColor(context, Resource.Color.tooltipBackground)));

    SetBackgroundColor (new Color (ContextCompat.GetColor (context, Resource.Color.white)));

    AddView(TooltipText);
}

后一种方式会给你一个丑陋的白色背景,下面有一个阴影。但是,您可以为 Background 属性使用任何类型的可绘制对象。不用SetBackgroundColor(Color color),你可以用Background = (some drawable);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2011-10-10
    • 2011-03-27
    • 1970-01-01
    相关资源
    最近更新 更多