Xamarin上的圆形ImageView

5

我正在开发一款Xamarin Android应用程序,需要制作一个圆形的ImageView

如何实现?


你目前尝试了什么?我们不想浪费你的时间,向你建议那些你知道对你没有用的东西。 - Wai Ha Lee
5个回答

6
我使用RoundedImageView库。它是用 Java 编写的,但你可以很容易地编写绑定来使用它。一旦你完成了绑定,你只需在.axml中添加这个即可:
<RoundedImageView
    local:riv_corner_radius="15dp"
    local:riv_oval="false"
    android:scaleType="centerCrop"
    android:layout_width="30dp"
    android:layout_height="30dp" />
未来读者请注意: 我为Xamarin.Android编写了RoundedImageView的端口,基于此帖子中链接的库。源代码可以在这里找到,NuGet包可以在这里找到。同时还包括用于MvvmCross的MvxRoundedImageView

当你需要很多圆形的形状时,这样做并不是一个好主意。 另一种方法是像谷歌在Hangouts和其他地方使用的"round"头像视图那样,对普通的图像视图进行遮罩处理。 - DooMMasteR
你有这个在大型应用程序上运行的基准测试,并且不能做出这样的声明吗?我在一个相当大的RecyclerView中使用了它,没有任何性能问题。此外,OP没有指定他需要多少形状,所以我相信这将完成工作。 - William Barbosa
我在较慢的双核设备上使用listviews(数千个条目),并且使用sql-cursor适配器进行滚动时会出现延迟问题。时间分析得出结论:简单的覆盖更快... 我的评论只应指出可能的瓶颈,而不是真正的问题,因为这种解决方案至少比覆盖形状更清洁和易读。 - DooMMasteR
@WilliamBarbosa 我在编译时遇到了以下错误:error APT0000: No resource identifier found for attribute 'riv_corner_radius' in package 'com.my.app'。我是不是漏掉了什么东西? - Felix

1
Xamarin组件已经可用,您可以在这里检查。

1

参考链接:https://github.com/jamesmontemagno/CircleImageView-Xamarin.Android/blob/master/CircleImageSample/Resources/layout/Main.axml

  <refractored.controls.CircleImageView 
android:id="@+id/ImageProfile"
   android:layout_width="80dp" 
android:layout_height="80dp"
   android:scaleType="fitCenter" 
android:src="@drawable/app_icon"
   android:layout_gravity="center_horizontal"/>

=========================================================================== 从Nuget包中添加Refractored.controls.CircleImageView的引用到您的项目中。


0
请参考以下链接:

如何在Android中创建圆形ImageView?

如何制作带圆角的ImageView?

以上代码适用于原生Android。您需要调整代码以将其转换为C#语法并采用Xamarin Android。为了方便起见,我已将代码更改为C#。
public class ImageHelper
{
    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
    Bitmap output = Bitmap.CreateBitmap(bitmap.Width, bitmap.Height
            , Android.Graphics.Bitmap.Config.Argb8888);
    Canvas canvas = new Canvas(output);
    Color color = Color.DodgerBlue;
    Paint paint = new Paint();
    Rect rect = new Rect(0, 0, bitmap.Width, bitmap.Height);
    RectF rectF = new RectF(rect);
    float roundPx = pixels;

    paint.AntiAlias = true;
    canvas.DrawARGB(0, 0, 0, 0);
    paint.Color = color;
    canvas.DrawRoundRect(rectF, roundPx, roundPx, paint);

    paint.SetXfermode(new PorterDuffXfermode(Android.Graphics.PorterDuff.Mode.SrcIn));
    canvas.DrawBitmap(bitmap, rect, rect, paint);

    return output;
}

0
public class CircleDrawable : Drawable
{
    Bitmap bmp;
    BitmapShader bmpShader;
    Paint paint;
    RectF oval;

    public CircleDrawable (Bitmap bmp)
    {
        this.bmp = bmp;
        this.bmpShader = new BitmapShader (bmp, Shader.TileMode.Clamp, Shader.TileMode.Clamp);
        this.paint = new Paint () { AntiAlias = true };
        this.paint.SetShader (bmpShader);
        this.oval = new RectF ();
    }

    public override void Draw (Canvas canvas)
    {
        canvas.DrawOval (oval, paint);
    }

    protected override void OnBoundsChange (Rect bounds)
    {
        base.OnBoundsChange (bounds);
        oval.Set (0, 0, bounds.Width (), bounds.Height ());
    }

    public override int IntrinsicWidth {
        get {
            return bmp.Width;
        }
    }

    public override int IntrinsicHeight {
        get {
            return bmp.Height;
        }
    }

    public override void SetAlpha (int alpha)
    {

    }

    public override int Opacity {
        get {
            return (int)Format.Opaque;
        }
    }

    public override void SetColorFilter (ColorFilter cf)
    {

    }
}

源代码:https://github.com/xamarin/xamarin-store-app/blob/master/XamarinStore.Droid/Views/CircleDrawable.cs


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接