自定义View实现圆角化
目的:
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实现圆角化的更多相关文章
- Android 自定义View 画圆 画线
自定义一个DrawCircle继承View 实现构造方法: public DrawCircle(Context context) { super(context); this.mContext = c ...
- 自定义view 画圆
package com.exaple.day01rikao; import android.content.Context; import android.graphics.Canvas; impor ...
- Android -- 自定义View小Demo,动态画圆(一)
1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...
- Android绘图机制(三)——自定义View的实现方式以及半弧圆新控件
Android绘图机制(三)--自定义View的三种实现方式以及实战项目操作 在Android绘图机制(一)--自定义View的基础属性和方法 里说过,实现自定义View有三种方式,分别是 1.对现有 ...
- Android自定义View之圆环交替 等待效果
学习了前面两篇的知识,对于本篇实现的效果,相信大家都不会感觉太困难,我要实现的效果是什么样呢?下面请先看效果图: 看上去是不很炫的样子,它的实现上也不是很复杂,重点在与onDraw()方法的绘制. 首 ...
- [转]Android自定义控件三部曲系列完全解析(动画, 绘图, 自定义View)
来源:http://blog.csdn.net/harvic880925/article/details/50995268 一.自定义控件三部曲之动画篇 1.<自定义控件三部曲之动画篇(一)—— ...
- Android 自定义 view(三)—— onDraw 方法理解
前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...
- Android自定义View之倒计时Countdown实现
先看一下效果: 在点击OK键之后,开始倒计时. 实现步骤 1.新建Android工程"CountdownView" 2.自定义Drawable 自定义View并没有直接的用户交互, ...
- Android自定义View之CircleView
Android自定义View之CircleView 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/5999 ...
随机推荐
- mybatis使用-高级用法(二)
新建学生表和学生证表 --学生表 CREATE TABLE student( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'id', `nam ...
- jquery-cookie持久化
jQuery.Cookie.js,是一个轻量级的Cookie管理插件 <script src="jQuery.1.8.3.js" type="text/javasc ...
- asp.net--常用的数据库链接字符串
本地连接 privatestring conn_string ="Data Source=localhost;Initial Catalog=SQLtest;Integrated Secur ...
- [bzoj4084][Sdoi2015]双旋转字符串_hash
双旋转字符串 bzoj-4084 Sdoi-2015 题目大意:给定两个字符串集合 S 和 T .其中 S 中的所有字符串长度都恰好为 N ,而 T 中所有字符串长度都恰好为 M .且 N+M 恰好为 ...
- iOS_25_彩票设置的cell的数据源模型的封装
组模型的封装 SettingGroup // // SettingGroup.h // 25_彩票 // // Created by beyond on 14-8-28. // Copyright ( ...
- 在AIX下面查询上一次命令
在AIX下面查询上一次命令 输入 r 或者 set -o vi 用vi的操作找上一次命令: 学习了: http://blog.itpub.net/66634/viewspace-1000843/ ht ...
- UVA 10025(数学)
The ? 1 ? 2 ? ... ? n = k problem The problem Given the following formula, one can set operators ' ...
- C语言开发函数库时利用不透明指针对外隐藏结构体细节
1 模块化设计要求库接口隐藏实现细节 作为一个函数库来说,尽力降低和其调用方的耦合.是最主要的设计标准. C语言,作为经典"程序=数据结构+算法"的践行者,在实现函数库的时候,必定 ...
- POJ3570 Fund Management 动态规划
题目大意 Frank从个人投资者获得了c美元的资金,可用于m天的投资.Frank可以对n(n<=8)支股票进行投资.对于每一支股票:都有一个交易上限si,表示一天最多能交易的股数:还有一个上限k ...
- Intel 的 MKL是可以用来训练的——官方的实验也提到了训练
TensorFlow如何充分使用所有CPU核数,提高TensorFlow的CPU使用率,以及Intel的MKL加速 转载 2017年09月07日 16:34:58 标签: cpu / gpu 转载 ...