目的:

1.实现自定义ReleativeLayout圆角化

实现:

1.在res目录中新建attrs.xml文件,自定义属性如下。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="RoundBgRelativeLayout">
<attr name="borderRadius" format="dimension"/><!-- 半径-->
<attr name="src" format="reference"/><!-- 图片资源-->
</declare-styleable>
</resources>

2.新建自定义Layout继承RelativeLayout,重写构造方法。

public class RoundBgRelativeLayout extends RelativeLayout {

    /**
* 圆角大小
*/
private int mRadius; /**背景图片*/
private Bitmap mSrc; public RoundBgRelativeLayout(Context context) {
this(context,null);
} public RoundBgRelativeLayout(Context context, AttributeSet attrs) {
this(context, attrs,0);
} public RoundBgRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setWillNotDraw(false);
TypedArray arr = context.getTheme().obtainStyledAttributes(attrs, R.styleable.RoundBgRelativeLayout, defStyleAttr, 0);
int indexCount = arr.getIndexCount();
for (int i = 0; i < indexCount; i++) {
int index = arr.getIndex(i);
switch (index){
case R.styleable.RoundBgRelativeLayout_src:
mSrc = BitmapFactory.decodeResource(getResources(), arr.getResourceId(index, 0));
break;
case R.styleable.RoundBgRelativeLayout_borderRadius:
mRadius= (int) arr.getDimension(index,20);
break;
default:
break;
} }
arr.recycle();
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(mSrc != null){
int width = getMeasuredWidth();//测量宽度
int height = getMeasuredHeight();//测量高度
mSrc = Bitmap.createScaledBitmap(mSrc,width,height,false);
canvas.drawBitmap(createRoundImage(mSrc,width,height),0,0,null);//绘制圆角背景
}
super.onDraw(canvas);
} private Bitmap createRoundImage(Bitmap mSrc, int width, int height) {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
Bitmap target = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(target);
RectF rectF = new RectF(0,0,width,height); //绘制圆角矩形
canvas.drawRoundRect(rectF,mRadius,mRadius,paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//该模式可以让两个重叠,并取交集
//绘制图片
canvas.drawBitmap(mSrc,0,0,paint); return target;
} public void setBgResource(int r){
this.mSrc = BitmapFactory.decodeResource(getResources(),r);
invalidate();
}
}

实现原理:

主要靠PorterDuff.Mode.SRC_IN 这种模式,第一个图绘制为圆角矩形,第二个图绘制是个BItmap,两者取交集,就实现了圆形图片的效果。

PorterDuff.Mode 16种效果图,如下。

最终实现:

参考

1.鸿神:http://blog.csdn.net/lmj623565791/article/details/24555655

2.https://blog.csdn.net/fhkatuz674/article/details/39271581

自定义View实现圆角化的更多相关文章

  1. Android 自定义View 画圆 画线

    自定义一个DrawCircle继承View 实现构造方法: public DrawCircle(Context context) { super(context); this.mContext = c ...

  2. 自定义view 画圆

    package com.exaple.day01rikao; import android.content.Context; import android.graphics.Canvas; impor ...

  3. Android -- 自定义View小Demo,动态画圆(一)

    1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...

  4. Android绘图机制(三)——自定义View的实现方式以及半弧圆新控件

    Android绘图机制(三)--自定义View的三种实现方式以及实战项目操作 在Android绘图机制(一)--自定义View的基础属性和方法 里说过,实现自定义View有三种方式,分别是 1.对现有 ...

  5. Android自定义View之圆环交替 等待效果

    学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首 ...

  6. [转]Android自定义控件三部曲系列完全解析(动画, 绘图, 自定义View)

    来源:http://blog.csdn.net/harvic880925/article/details/50995268 一.自定义控件三部曲之动画篇 1.<自定义控件三部曲之动画篇(一)—— ...

  7. Android 自定义 view(三)—— onDraw 方法理解

    前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...

  8. Android自定义View之倒计时Countdown实现

    先看一下效果: 在点击OK键之后,开始倒计时. 实现步骤 1.新建Android工程"CountdownView" 2.自定义Drawable 自定义View并没有直接的用户交互, ...

  9. Android自定义View之CircleView

    Android自定义View之CircleView 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/5999 ...

随机推荐

  1. 洛谷 P2144 BZOJ 1003 [FJOI2007]轮状病毒

    题目描述 轮状病毒有很多变种.许多轮状病毒都是由一个轮状基产生.一个n轮状基由圆环上n个不同的基原子和圆心的一个核原子构成.2个原子之间的边表示这2个原子之间的信息通道,如图1. n轮状病毒的产生规律 ...

  2. 修改Xorg.conf配置显示分辨率

    修改Xorg.conf是件简单的事,配置文件结构简单,也没有复杂的语法,但是一但配置失败,后果是比较 严重的,,所以强烈建议每次修改之前做好备份工作. Xorg.conf一般位于/etc/X11/xo ...

  3. windows上开启winrm服务

    原文链接 因为进行远程powershell管理必须需要启用winrm的服务,所以需要在windows平台上启用winrm服务 winrm service 默认都是未启用的状态,先查看状态:如无返回信息 ...

  4. leetcode || 50、Pow(x, n)

    problem: Implement pow(x, n). Hide Tags Math Binary Search 题意:求x的n次幂 thinking: (1)最简单想到的是直观上的数学幂函数求法 ...

  5. [Sencha ExtJS &amp; Touch] 在Sencha(Extjs/Touch)应用程序中使用plugins(插件)和mixins(混入)

    原文链接:http://blog.csdn.net/lovelyelfpop/article/details/50853591 英文原文:Using Plugins and Mixins in You ...

  6. 黑马day07 登录注冊案例(一)

    简单介绍:依据三层架构的思想设计本案例. 1.搭建好开发环境 准备好须要的包和模拟数据库配置文件users.xml -->cn.itheima.dao -->cn.itheima.serv ...

  7. Reorder List 最典型的linkedlist题目

    https://oj.leetcode.com/problems/reorder-list/ Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder ...

  8. [Plugin] 文件上传利器SWFUpload使用指南

    SWFUpload是 一个flash和js相结合而成的文件上传插件,其功能非常强大.以前在项目中用过几次,但它的配置参数太多了,用过后就忘记怎么用了,到以后要用时又得 到官网上看它的文档,真是太烦了. ...

  9. php简单测试slim框架的功能

    php简单测试slim框架的功能 监听主路径/ $app->get( '/', function () { $template = <<<EOT<!DOCTYPE htm ...

  10. 从默认析构函数学习c++,new,delete,内存泄漏,野指针

    默认析构函数:当系统没有显式定义析构函数,编译器同样会为对象定义一个默认析构函数,默认的析构函数只能释放普通数据成员所占用的空间,无法通过释放通过new和malloc进行申请的空间,因此避免内存泄漏, ...