xamarin.Android ImageView 图片圆角(自定义属性、扩展控件)
新增 /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>
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 Dorid.UI
{
/// <summary>
/// 圆角
/// </summary>
public class RoundImageView: ImageView
{
private int mBorderWidth = ; private Bitmap mask;
private Paint paint;
private Color mBorderColor = Color.ParseColor("#FFFFFF"); 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;
}
}
}
axml 使用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:controls="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="25px"
android:minHeight="25px"
android:background="@color/activity_bg_color">
<Dorid.UI.RoundImageView
android:src="@drawable/icon"
android:layout_height="40dp"
android:layout_alignParentRight="true"
controls:border_width="3dp"
controls:border_color="#CCCCCC"
android:id="@+id/iv_userphoto_mycenter_myprofile"
android:layout_width="40dp"
android:layout_marginRight="20dp" />
</LinearLayout>
xamarin.Android ImageView 图片圆角(自定义属性、扩展控件)的更多相关文章
- Xamarin.Android ImageView 图片圆角显示
第一步:在 values 文件夹下新增 Attrs.xml 文件 <?xml version="1.0" encoding="utf-8" ?> & ...
- [置顶]
xamarin android自定义标题栏(自定义属性、回调事件)
自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...
- Android CardView卡片布局 标签: 控件
CardView介绍 CardView是Android 5.0系统引入的控件,相当于FragmentLayout布局控件然后添加圆角及阴影的效果:CardView被包装为一种布局,并且经常在ListV ...
- Android support library支持包常用控件介绍(二)
谷歌官方推出Material Design 设计理念已经有段时间了,为支持更方便的实现 Material Design设计效果,官方给出了Android support design library ...
- [APP] Android 开发笔记 004-Android常用基本控件使用说明
TextView 文本框 EditText控件 Button 与 ImageButton ImageView RadioButton CheckBox复选框 TextView 文本框 ,用于显示文本的 ...
- (转载)Android UI设计之AlertDialog弹窗控件
Android UI设计之AlertDialog弹窗控件 作者:qq_27630169 字体:[增加 减小] 类型:转载 时间:2016-08-18我要评论 这篇文章主要为大家详细介绍了Android ...
- JavaFX的扩展控件库ControlsFX介绍
声明: 本博客文章原创类别的均为个人原创,版权所有.转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com. ...
- WPF自定义控件(三)の扩展控件
扩展控件,顾名思义就是对已有的控件进行扩展,一般继承于已有的原生控件,不排除继承于自定义的控件,不过这样做意义不大,因为既然都自定义了,为什么不一步到位呢,有些不同的需求也可以通过此来完成,不过类似于 ...
- (转载) Android 带清除功能的输入框控件ClearEditText,仿IOS的输入框
Android 带清除功能的输入框控件ClearEditText,仿IOS的输入框 标签: Android清除功能EditText仿IOS的输入框 2013-09-04 17:33 70865人阅读 ...
随机推荐
- php RSA非对称加密 的实现
基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...
- 【前言】Go语言开坑
很早之前就已经听过Go语言的大名,今天终于要开坑研究Go了,来吧看看<Go语言从入门到入坟>. [Go语言学习目录] 1. Go安装 2. Go变量(Variables) 3. Go语言基 ...
- djjango models表关系
*** detail表级联 student表,detail获取student的学生信息,自己做为扩展 一对一关系 models.OneToOneField student = models.OneTo ...
- iview表格高度自适应只需要三步即可
1. 需要增加到table表格里的 highlight-row :height="tableHeight" ref="table" 2.在return 定义一个 ...
- vue-router 动态添加 路由
动态添加路由可以用了做权限管理.登录后服务器端返回权限菜单,前端动态添加路由 然后在设置菜单 1.vue-router 有方法router.addRoutes(routes) 动态添加更多的路由规则 ...
- c#mysql批量更新的两种方法
总体而言update 更新上传速度还是慢. 1: 简单的insert 速度稍稍比MySqlDataAdapter慢一点 配合dapper 配置文件 <?xml version="1 ...
- CSS学习总结4:派生选择器学习总结
派生选择器:通过依据元素在其位置的上下文关系来定义样式,你可以使标记更加简洁.派生选择器中一共分为三种:后代选择器.子元素选择器.相邻兄弟选择器. 1.初识派生选择器 实例:你希望列表中的 stron ...
- 操作系统学习笔记(二) 页式映射及windbg验证方式
页式映射 本系列截图来自网络搜索及以下基本书籍: <Windows内核设计思想> <Windows内核情景分析> <WINDOWS内核原理与实现> 一个32位虚拟地 ...
- 教你轻松快速学会用Calibre TXT转MOBI
教你轻松快速学会TXT转为有目录的MOBI###授人以渔,lllll5500制作### 需使用软件按先后顺序如下:一.排版助手 官网http://www.gidot.net/typesetter/二. ...
- 解决win10系统无法安装.NET Framework 3.5
方法1:“我的电脑”,单击右键选择“管理” 在打开的“计算机管理”窗口中依路径“服务和应用程序—服务”打开,在列表中找到“Windows Update”并双击打开. 启动类型:自动. 服务状态下面点击 ...