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人阅读 ...
随机推荐
- 用rekit创建react项目
第一步 先进入github.com 然后搜索rekit 往下滑 1 . 先全局安装 npm install -g rekit 2 . 进入自己想要创建项目文件的目录输入 rekit create / ...
- ubuntu,day1基础命令,shutdown,man,touch,rm,mv,cp,stat,locale,apt,date,tzselect,cal,快捷方式,echo,查看文件
基本设置命令 1,shutdown 命令, shutdown -r now # 现在立即重启 shutdown -r + # 三分钟后重启 shutdown -r : #在12:12时将重启计算机 s ...
- python基础之Day15
一.函数递归 什么是函数递归: 函数递归调用是一种特殊的嵌套调用,在调用一个函数的过程中,又直接或间接地调用了该函数本身. 其中,函数的递归有明确的结束条件,不能无限制的调用,否则会撑破内存,在Pyt ...
- AutoCAD开发2--添加带属性的点
Private Sub CommandButton11_Click() Dim pPoint As AcadPoint Dim DataType(0 To 1) As Integer Dim Data ...
- docker日志设置定期清理
1.新建/etc/docker/daemon.json,若有就不用新建了 2.添加log-dirver和log-opts参数,样例如下 "log-driver":"jso ...
- Python3实战系列之八(获取印度售后数据项目)
问题:续接上一篇.说干咱就干呀,勤勤恳恳写程序呀! 目标:此篇开始进入正题了.为实现我们整个项目功能而开始实现各个子模块功能.首先实现第一篇列出的分步功能模块的第五步: 5.python连接SQL S ...
- http错误代码提示
1×× 保留 2×× 表示请求成功地接收 3×× 为完成请求客户需进一步细化请求 4×× 客户错误 5×× 服务器错误 200 正常:请求已完成. 201 正常:紧接 POST 命令. 202 ...
- html 2
一.列表 信息资源的一种展示形式 二.列表的分类 1.有序列表 <ol> <li>列表项1</li> <li>列表项2</li> </ ...
- visual2017专业版MFC编程环境搭建及第一个MFC程序的创建
1.MFC介绍及环境搭建 MFC全程为Microsoft Foundation class Library,即微软的基本类库,MFC实际上是一个庞大的文件库,它由指向文件和源文件组成. 首先,打开vi ...
- 冲刺博客NO.8
今天做了什么: 多天学习后,实现了短信验证的功能,可以选择国家,可以在Mob的后台管理短信验证 遇到的困难: 注册回调事件,afterEvent的判定(事件完成后调用)