2015-08-19 44 views
5

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

这是如何实现的?

+0

你尝试过什么到目前为止办?我们不想通过暗示你知道不适合你的事情来浪费你的时间。 –

回答

6

我使用RoundedImageView库。它是用Java编写的,但是您可以使用write a binding而没有太多问题。对于未来的读者

<RoundedImageView 
    local:riv_corner_radius="15dp" 
    local:riv_oval="false" 
    android:scaleType="centerCrop" 
    android:layout_width="30dp" 
    android:layout_height="30dp" /> 

编辑:一旦你这样做,你可以简单地添加到您的.axml我写的RoundedImageView为Xamarin.Android的端口,基于这个帖子链接的库。源代码可以找到here和NuGet包here。 A MvxRoundedImageView也包含在MvvmCross中使用。

+0

当你需要很多圆形时,这不是一个好主意。 另一种方式是屏蔽正常的图片视图,就像在环聊和其他地方使用Google圆角头像视图完成的一样。 – DooMMasteR

+0

你有没有在大型应用程序上运行的任何基准,并且不愿做出这样的声明?我在一个相当大的RecyclerView中使用了这个,我没有任何性能问题。此外,OP没有指定他需要的形状的数量,所以我相信这将完成这项工作 –

+0

我在使用列表视图(成千上万的条目并不重要)和一个sql-cursor适配器滚动的慢速双核设备上遇到了问题将开始滞后和时间分析导致的结论,simpel覆盖更快... 我的评论应该只指出可能的瓶颈,而不是任何真正的问题,因为这种解决方案至少是更清洁,比覆盖形状更好的可读性 – DooMMasteR

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

0

请参考以下链接:

How to create a circular ImageView in Android?

How to make an ImageView with rounded corners?

上面的代码适用于原生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; 
} 
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"/> 

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

1

Xamarin组件可供一样的,你可以检查它here