第一步:在 values 文件夹下新增 Attrs.xml 文件

<?xml version="1.0" encoding="utf-8" ?>
<resources>
<declare-styleable name="RoundImageView">
<attr name="border_width" format="dimension" />
<attr name="border_color" format="color" />
</declare-styleable>
</resources>

第二步:创建名为 RoundImageView 的类,用于自定义图片展示。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Android.App;
using Android.Content;
using Android.Graphics;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
using Java.Util.Jar;
using Android.Graphics.Drawables;
using static Android.Graphics.PorterDuff;
using Android.Content.Res; namespace RoundImageViewDemo
{
/// <summary>
/// 圆角
/// </summary>
public class RoundImageView : ImageView
{
private int mBorderWidth = ; private Bitmap mask;
private Paint paint;
private Color mBorderColor = Color.ParseColor("#CCCCCC"); private Context mContext;
public RoundImageView(Context context) : base(context)
{
mContext = context;
} public RoundImageView(Context context, IAttributeSet attrs) : base(context, attrs)
{
mContext = context;
GetAttributes(context, attrs);
} public RoundImageView(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
{
mContext = context;
GetAttributes(context, attrs);
} /// <summary>
/// 获取自定义属性
/// </summary>
/// <param name="context"></param>
/// <param name="attrs"></param>
private void GetAttributes(Context context, IAttributeSet attrs)
{
TypedArray t_attrs = context.ObtainStyledAttributes(attrs, Resource.Styleable.RoundImageView);
mBorderColor = t_attrs.GetColor(Resource.Styleable.RoundImageView_border_color, mBorderColor);
int defalut = (int)( * context.Resources.DisplayMetrics.Density + 0.5f);
mBorderWidth = t_attrs.GetDimensionPixelOffset(Resource.Styleable.RoundImageView_border_width, defalut);
t_attrs.Recycle();
} protected override void OnDraw(Canvas canvas)
{
Drawable localDrawable = Drawable;
if (localDrawable == null)
return;
if (localDrawable is NinePatchDrawable)
return; if (this.paint == null)
{
PorterDuff.Mode localMode = PorterDuff.Mode.DstIn; Paint localPaint = new Paint();
localPaint.FilterBitmap = false;
localPaint.AntiAlias = true;
localPaint.SetXfermode(new PorterDuffXfermode(localMode));
this.paint = localPaint;
} int width = Width;
int height = Height;
/** 保存layer */
int layer = canvas.SaveLayer(0.0F, 0.0F, width, height, null, SaveFlags.All);
/** 设置drawable的大小 */
localDrawable.SetBounds(, , width, height);
/** 将drawable绑定到bitmap(this.mask)上面(drawable只能通过bitmap显示出来) */
localDrawable.Draw(canvas);
if ((this.mask == null) || (this.mask.IsRecycled))
{
this.mask = CreateOvalBitmap(width, height);
}
/** 将bitmap画到canvas上面 */
canvas.DrawBitmap(this.mask, 0.0F, 0.0F, this.paint);
/** 将画布复制到layer上 */
canvas.RestoreToCount(layer);
DrawBorder(canvas, width, height);
} private void DrawBorder(Canvas canvas, int width, int height)
{
if (mBorderWidth == )
return; Paint mBorderPaint = new Paint();
mBorderPaint.SetStyle(Paint.Style.Stroke);
mBorderPaint.AntiAlias = true;
mBorderPaint.Color = mBorderColor;
mBorderPaint.StrokeWidth = mBorderWidth;
/**
* 坐标x:view宽度的一般 坐标y:view高度的一般 半径r:因为是view的宽度-border的一半
*/
canvas.DrawCircle(width >> , height >> , (width - mBorderWidth) >> , mBorderPaint);
canvas = null;
} /// <summary>
/// 获取一个bitmap,目的是用来承载drawable;
/// 将这个bitmap放在canvas上面承载,并在其上面画一个椭圆(其实也是一个圆,因为width=height)来固定显示区域
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
/// <returns></returns>
public Bitmap CreateOvalBitmap(int width, int height)
{
Bitmap.Config localConfig = Bitmap.Config.Argb8888;
Bitmap localBitmap = Bitmap.CreateBitmap(width, height, localConfig);
Canvas localCanvas = new Canvas(localBitmap);
Paint localPaint = new Paint();
int padding = mBorderWidth - ;
/**
* 设置椭圆的大小(因为椭圆的最外边会和border的最外边重合的,如果图片最外边的颜色很深,有看出有棱边的效果,所以为了让体验更加好,
* 让其缩进padding px)
*/
RectF localRectF = new RectF(padding, padding, width - padding, height - padding);
localCanvas.DrawOval(localRectF, localPaint);
return localBitmap;
}
}
}

第三步:前台控件的调用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<RoundImageViewDemo.RoundImageView
android:src="@drawable/icon_boy"
android:layout_height="80dp"
android:layout_alignParentRight="true"
android:id="@+id/iv_userphoto_mycenter_myprofile"
android:layout_width="80dp"
android:gravity="center_horizontal"/>
</LinearLayout>

效果展示:

参考:https://www.cnblogs.com/mycing/p/5556943.html

源码下载链接: https://pan.baidu.com/s/1y2ON9qP1k9KsNjkn1xmT9A

提取码: k4dc

Xamarin.Android ImageView 图片圆角显示的更多相关文章

  1. xamarin.Android ImageView 图片圆角(自定义属性、扩展控件)

    新增 /values/Attrs.xml 文件 <?xml version="1.0" encoding="utf-8" ?> <resour ...

  2. 怪胎:Android开发ImageView图片无法显示

    今天碰到一个非常奇怪的问题: 在Android中ImageView无法显示加载的本地SDCard图片. 具体过程是:先调用本地照相机程序摄像,然后将拍摄的图片加载在ImageView中显示. publ ...

  3. Android ImageView图片自适应 (转)

    网络上下载下来的图片自适应:android:adjustViewBounds="true"(其详细解释在下面)<ImageView     android:id=" ...

  4. Android ImageView图片自适应

    网络上下载下来的图片自适应:android:adjustViewBounds="true"(其详细解释在下面) <ImageView     android:id=" ...

  5. Android imageView图片按比例缩放

    android:scaleType可控制图片的缩放方式,示例代码如下: <ImageView android:id="@+id/img" android:src=" ...

  6. ImageView图片不显示---------记glide框架使用时遇到的问题

    最近在开发项目的时候,使用了谷歌推荐的glide框架,却发现了一个莫名奇妙的问题,就是imageview始终不显示图片! 发现图片不显示 但是改为安卓本身自带的ic_launch可以显示ic_laun ...

  7. xamarin.android 资源图片问题

    在xamarin.android 中,关于图片的资源一般都在Resources.drawable下面,在Resources这个文件夹下面,包含了drawable.drawale-hdpi.drawab ...

  8. CSS实现图片圆角显示

    问题描述 在自定义博客园侧边栏公告时,想增加博客头像,但图片默认显示成是方形的,不是很好看,想着改成圆角显示会漂亮些 解决方案 增加css样式 border-radius:25px; 上面的像素值根据 ...

  9. Android Imageview 图片居左居右,自定义圆角

    android:scaleType="fitStart"    图片靠左不变形显示, android:scaleType=”fitEnd”  图片靠右显示,不变形. 半透明andr ...

随机推荐

  1. 《Java并发编程的艺术》并发编程的挑战(一)

    并发编程的挑战 并发编程的初衷是让程序运行的更快,但是更多的使用多线程真的会让程序变快吗? 1.线程上下文切换 关于线程上下文切换 多个线程在一个处理器里并不是同时进行的,而是非常快速地在线程之间进行 ...

  2. 关于python-flask中规范创建项目的几个关键py项目文件

    1.config.py——配置文件 DEBUG = True DIALECT = 'mysql' DRIVER = 'mysqldb' USERNAME = 'root' PASSWORD = '' ...

  3. Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again

    Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again https://ac.nowcoder.com/acm/contest/700/I 时间限制:C/C++ 1 ...

  4. 02.02.02 第2章 制作power bi图表(Power BI商业智能分析)

    ---恢复内容开始--- 02.02.02第2章 制作power bi图表 02.02.02.01 power pivot数据导入 00:08:43 02.02.02.02建立数据透视表 00:11: ...

  5. Django项目及应用的创建

    一.url解释 1url是全球资源定位符,网上的每个文件都有唯一的url地址,组成:协议.服务器名称(或IP地址).路径和文件名. 2有时候,URL以斜杠“/”结尾,而没有给出文件名,在这种情况下,U ...

  6. Win7 VS2017编译Audacity2.1.3

    最近比较热衷折腾大型开源软件编译,因为在逐渐用开源软件替换盗版软件,除去盗版用着不安全的原因外,主要还是因为开源软件有源码,可以学习研究,另外就是体积小. 像Matlab每次装完都用不上什么功能,体积 ...

  7. Linux 云计算运维之路

    搭建中小型网站的架构图 s1-2 Linux 硬件基础 s3-4 linux 基础 文件系统 用户权限 s5-6 Linux 标准输出 系统优化 目录结构 w7 rsync-备份服务器 w8 NFS服 ...

  8. android-mediaplayer播放

    优先参考 待补充.android 8.0

  9. 基于jmeter的性能测试平台(一)分布式jmeter搭建

    (1)概述 一台windows虚拟机作为controller,3台Linux虚拟机作为agent. 第一步是在所有虚拟机上安装JDK,版本最好是一样的,然后就是下载安装jmeter,网上资料很多这里不 ...

  10. IOS 模拟器多开集成测试和那些坑

    #### 前言公司一直没有IOS自动化,搞得很尴尬,个人感觉搞自动测试的,不搞IOS自动化,就像金X,少了重要一点啊.也向领导申请过不止一次,总只都各种原因没有分配机器,不了了之.某天线上IOS出bu ...