【问题标题】:Is it possible to use ImageSpan in Xamarin.Forms?是否可以在 Xamarin.Forms 中使用 ImageSpan?
【发布时间】:2014-10-17 14:41:39
【问题描述】:

我正在尝试调整 Xamarin.Forms.Labs 中的 ImageButtonRenderer 以在图像按钮上呈现图像和文本居中(作为一个块)的 ImageButtons,而不是让图像与左/右边缘对齐按钮,这是渲染器的默认行为。

我遇到了StackOverflow article,指出这种布局可以在 Android 中使用 ImageSpan 实现 - 但是,当我将代码转换为 Xamarin.Forms C# 时,显示的是文本,而不是图像。有人能看出这段代码有什么明显的问题吗?...

source是ImageButton控件的ImageSource值

var handler = new FileImageSourceHandler();

var bitmap = await handler.LoadImageAsync(source, this.Context);

if (bitmap != null)
{
    var bitmapWidth = this.ImageButton.ImageWidthRequest.Equals(0) ? bitmap.Width : (int)(this.ImageButton.ImageWidthRequest);
    var bitmapHeight = this.ImageButton.ImageHeightRequest.Equals(0) ? bitmap.Height : (int)(this.ImageButton.ImageHeightRequest);

    Drawable drawable = new BitmapDrawable(Resources, bitmap);
    var scaledDrawable = new ScaleDrawable(drawable, 0, bitmapWidth, bitmapHeight).Drawable;
    scaledDrawable.SetBounds(0, 0, bitmapWidth, bitmapHeight);

    var scaledBitmap = Bitmap.CreateScaledBitmap(bitmap, bitmapWidth, bitmapHeight, true);

    var leftPadding = (int)this.ImageButton.ButtonPadding.Left;
    var rightPadding = (int)this.ImageButton.ButtonPadding.Right;
    var topPadding = (int)this.ImageButton.ButtonPadding.Top;
    var bottomPadding = (int)this.ImageButton.ButtonPadding.Bottom;

    Control.SetPadding(leftPadding, topPadding, rightPadding, bottomPadding);
    Control.Gravity = GravityFlags.CenterHorizontal | GravityFlags.CenterVertical;

    switch (this.ImageButton.Orientation)
    {
        case ImageOrientation.ImageToRight:
            var rightButtonLabel = new SpannableString(string.Format("{0} ", this.Control.Text));
            //rightButtonLabel.SetSpan(new ImageSpan(scaledBitmap), rightButtonLabel.Length() - 1, rightButtonLabel.Length(), SpanTypes.InclusiveInclusive);
            //rightButtonLabel.SetSpan(new ImageSpan(scaledDrawable, SpanAlign.Bottom), rightButtonLabel.Length() - 1, rightButtonLabel.Length(), SpanTypes.InclusiveInclusive);
            //rightButtonLabel.SetSpan(new ImageSpan(scaledDrawable), rightButtonLabel.Length() - 1, rightButtonLabel.Length(), SpanTypes.InclusiveInclusive);
            rightButtonLabel.SetSpan(new ImageSpan(Forms.Context, scaledBitmap, SpanAlign.Bottom), rightButtonLabel.Length() - 1, rightButtonLabel.Length(), SpanTypes.InclusiveInclusive);
            Control.SetText(rightButtonLabel, Android.Widget.TextView.BufferType.Spannable);
            break;

        case ImageOrientation.ImageToLeft:
        default:
            var leftButtonLabel = new SpannableString(string.Format(" {0}", this.Control.Text));
            //leftButtonLabel.SetSpan(new ImageSpan(scaledBitmap), 0, 1, SpanTypes.InclusiveInclusive);
            //leftButtonLabel.SetSpan(new ImageSpan(scaledDrawable, SpanAlign.Bottom), 0, 1, SpanTypes.InclusiveInclusive);
            //leftButtonLabel.SetSpan(new ImageSpan(scaledDrawable), 0, 1, SpanTypes.ExclusiveExclusive);
            leftButtonLabel.SetSpan(new ImageSpan(Forms.Context, scaledBitmap, SpanAlign.Bottom), 0, 1, SpanTypes.InclusiveInclusive);
            Control.SetText(leftButtonLabel, Android.Widget.TextView.BufferType.Spannable);
            break;
    }
}

文本居中很好,但没有图像。我已经使用 Forms.Context 尝试了几种不同的 ImageSpan 重载与 Drawable、Bitmaps,但它们都不起作用。

在 Xamarin.Forms 中使用 ImageSpan 是否有一些限制?

【问题讨论】:

  • 不,在 Xamarin.Forms 中使用来自 Android 的任何东西没有任何限制,有些东西设置和开始工作可能有点古怪,因为你正在与框架争吵,但你不应该'不要局限于您可以在自定义视图中执行的操作。

标签: xamarin.android xamarin.forms


【解决方案1】:

是的,这是一个老问题。不管怎样,我想this 的帖子可以帮助解决这个问题。

只需将图像加载到某个(不可见的)视图中,您的ImageSpan 图像就会显示出来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多