How to Set An Image's Borders to Make It Resizable

Sunghyun Min

Staff Engineer

App developers may want to set a resizable image as background to better fit the content size. However, if you resize the image as it is, you may not get the shape you want.

Tizen provides an API to set border, a region of the image to be resized by scale to keep the correct aspect ratio. The following figures provide a visual explanation.


How to set image borders

To create image borders, use the ElmSharp.Image.SetBorder() method after image loading.

For information about using native controls in Xamarin.Forms, see Xamarin.Forms Custom Renderers

Create custom renderer

public class CustomImage : Image
{
    public static readonly BindableProperty BorderLeftProperty = BindableProperty.Create("BorderLeft", typeof(int), typeof(CustomImage), default(int));
    public static readonly BindableProperty BorderRightProperty = BindableProperty.Create("BorderRight", typeof(int), typeof(CustomImage), default(int));
    public static readonly BindableProperty BorderTopProperty = BindableProperty.Create("BorderTop", typeof(int), typeof(CustomImage), default(int));
    public static readonly BindableProperty BorderBottomProperty = BindableProperty.Create("BorderBottom", typeof(int), typeof(CustomImage), default(int));

    public CustomImage()
    {
    }

    public int BorderLeft
    {
        get { return (int)GetValue(BorderLeftProperty); }
        set { SetValue(BorderLeftProperty, value); }
    }

    public int BorderRight
    {
        get { return (int)GetValue(BorderRightProperty); }
        set { SetValue(BorderRightProperty, value); }
    }

    public int BorderTop
    {
        get { return (int)GetValue(BorderTopProperty); }
        set { SetValue(BorderTopProperty, value); }
    }

    public int BorderBottom
    {
        get { return (int)GetValue(BorderBottomProperty); }
        set { SetValue(BorderBottomProperty, value); }
    }
}
[assembly: ExportRenderer(typeof(CustomImage), typeof(CustomImageRenderer))]
class CustomImageRenderer : ImageRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Image> e)
    {
        base.OnElementChanged(e);
        UpdateBorder();
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if ((e.PropertyName == CustomImage.BorderBottomProperty.PropertyName)
            || (e.PropertyName == CustomImage.BorderLeftProperty.PropertyName)
            || (e.PropertyName == CustomImage.BorderRightProperty.PropertyName)
            || (e.PropertyName == CustomImage.BorderTopProperty.PropertyName))
        {
            UpdateBorder();
        }
        base.OnElementPropertyChanged(sender, e);
    }

    void UpdateBorder()
    {
        var img = Element as CustomImage;
        Control.SetBorder(img.BorderLeft, img.BorderRight, img.BorderTop, img.BorderBottom);
    }

    protected override void UpdateAfterLoading(bool initialize)
    {
        base.UpdateAfterLoading(initialize);
        UpdateBorder(); // SetBorder should be called after image loading
    }
}

Note: Because ElmSharp.Image allows you to use the override UpdateAfterLoading() method for post processing, you can call the SetBorder() method after image loading.

Example

public class App : Application
{
    public App()
    {
        // The root page of your application
        MainPage = new ContentPage
        {
            BackgroundColor = Color.White,
            Content = new StackLayout
            {
                VerticalOptions = LayoutOptions.Center,
                Children = {
                    new CustomImage
                    {
                        Source = FileImageSource.FromFile("sample.png"),
                        HorizontalOptions = LayoutOptions.Center,
                        VerticalOptions = LayoutOptions.Center,
                        WidthRequest = 300,
                        HeightRequest = 100,
                        Aspect = Aspect.Fill,
                        BorderLeft = 50,
                        BorderRight = 50,
                        BorderTop = 50,
                        BorderBottom = 50
                    }
                }

            }
        };
    }
}



The sample application with original image (100x100).




The sample application with resized image (300x100).

You can check that the image is resized and keeps its borders.

For further information about Tizen .NET, see Samsung Developers Tizen.

Need help? You can sign in to your Samsung Account and submit a Samsung Developers support request.