Android Xamarin上的圆形图像视图

Android Xamarin上的圆形图像视图,android,xamarin,imageview,xamarin.android,Android,Xamarin,Imageview,Xamarin.android,我正在开发Xamarin Android应用程序,我需要制作一个循环ImageView 如何做到这一点?我使用这个库。它是用Java编写的,但是您可以轻松地使用它。一旦这样做,您只需将其添加到.axml: <RoundedImageView local:riv_corner_radius="15dp" local:riv_oval="false" android:scaleType="centerCrop" android:layout_width="30d

我正在开发Xamarin Android应用程序,我需要制作一个循环
ImageView

如何做到这一点?

我使用这个库。它是用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还包括一个
MVXroundeImage视图

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)
    {

    }
}
来源:

请参考以下链接:

以上代码适用于本机android。您需要调整代码,将其转换为c#语法,并采用xamarin android。为方便起见,我已将代码改为c

参考链接:


===========================================================================
将Refractored.controls.CircleImageView的引用从nuget软件包添加到您的项目中。

Xamarin组件也可用于该项目,您可以检查它

到目前为止您尝试了什么?我们不想浪费你的时间,建议你知道不适合你的东西。当你需要很多圆形的时候,这样做不是一个好主意。另一种方法是屏蔽一个普通的图像视图,就像谷歌在社交网站和其他地方的“圆形”头像视图一样。你有任何在大型应用程序上运行的基准测试,但没有做出这样的声明吗?我在一个相当大的回收视图中使用了这个,我没有任何性能问题。此外,OP没有指定他需要的形状数量,所以我相信这会完成任务。我在具有ListView的较慢的双核设备上遇到问题(数千个条目,这并不重要),sql游标适配器滚动将开始滞后,并且计时分析会得出simpel覆盖速度更快的结论。。。我的评论应该只指向那个可能的瓶颈,而不是任何真正的问题,因为这个解决方案至少比叠加更干净、可读性更好shapes@WilliamBarbosa编译时出现此错误:
错误APT0000:在包“com.my.app”中未找到属性“riv\u corner\u radius”的资源标识符。
。我错过什么了吗?
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;
}
  <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"/>