Android 自定义控件之圆形扩散View(DiffuseView)
实现效果
使用
XML中:
<com.airsaid.diffuseview.widget.DiffuseView
android:id="@+id/diffuseView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=""
app:diffuse_color="@color/colorAccent"
app:diffuse_coreColor="@color/colorPrimaryDark"
app:diffuse_coreImage="@android:drawable/ic_menu_search"
app:diffuse_coreRadius=""
app:diffuse_maxWidth=""
app:diffuse_width=""/>
代码中:
DiffuseView mDiffuseView = (DiffuseView) findViewById(R.id.diffuseView);
mDiffuseView.start(); // 开始扩散
mDiffuseView.stop();// 停止扩散
属性&方法
| 属性名 | java方法 | 作用 |
|---|---|---|
| diffuse_color | setColor(int colorId) | 设置扩散圆颜色 |
| diffuse_coreColor | setCoreColor(int colorId) | 设置中心圆颜色 |
| diffuse_coreImage | setCoreImage(int imageId) | 设置中心圆图片 |
| diffuse_coreRadius | setCoreRadius(int radius) | 设置中心圆半径 |
| diffuse_maxWidth | setMaxWidth(int maxWidth) | 设置最大扩散宽度 |
| diffuse_width | setDiffuseWidth(int width) | 设置扩散圆宽度,值越小越宽 |
代码
/**
* Created by zhouyou on 2016/9/27.
* Class desc:
*
* 这是一个自定义圆圈扩散View
*/
public class DiffuseView extends View { /** 扩散圆圈颜色 */
private int mColor = getResources().getColor(R.color.colorAccent);
/** 圆圈中心颜色 */
private int mCoreColor = getResources().getColor(R.color.colorPrimary);
/** 圆圈中心图片 */
private Bitmap mBitmap;
/** 中心圆半径 */
private float mCoreRadius = ;
/** 扩散圆宽度 */
private int mDiffuseWidth = ;
/** 最大宽度 */
private Integer mMaxWidth = ;
/** 是否正在扩散中 */
private boolean mIsDiffuse = false;
// 透明度集合
private List<Integer> mAlphas = new ArrayList<>();
// 扩散圆半径集合
private List<Integer> mWidths = new ArrayList<>();
private Paint mPaint; public DiffuseView(Context context) {
this(context, null);
} public DiffuseView(Context context, AttributeSet attrs) {
this(context, attrs, -);
} public DiffuseView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DiffuseView, defStyleAttr, );
mColor = a.getColor(R.styleable.DiffuseView_diffuse_color, mColor);
mCoreColor = a.getColor(R.styleable.DiffuseView_diffuse_coreColor, mCoreColor);
mCoreRadius = a.getFloat(R.styleable.DiffuseView_diffuse_coreRadius, mCoreRadius);
mDiffuseWidth = a.getInt(R.styleable.DiffuseView_diffuse_width, mDiffuseWidth);
mMaxWidth = a.getInt(R.styleable.DiffuseView_diffuse_maxWidth, mMaxWidth);
int imageId = a.getResourceId(R.styleable.DiffuseView_diffuse_coreImage, -);
if(imageId != -) mBitmap = BitmapFactory.decodeResource(getResources(), imageId);
a.recycle();
} private void init() {
mPaint = new Paint();
mPaint.setAntiAlias(true);
mAlphas.add();
mWidths.add();
} @Override
public void invalidate() {
if(hasWindowFocus()){
super.invalidate();
}
} @Override
public void onDraw(Canvas canvas) {
// 绘制扩散圆
mPaint.setColor(mColor);
for (int i = ; i < mAlphas.size(); i++) {
// 设置透明度
Integer alpha = mAlphas.get(i);
mPaint.setAlpha(alpha);
// 绘制扩散圆
Integer width = mWidths.get(i);
canvas.drawCircle(getWidth() / , getHeight() / , mCoreRadius + width, mPaint); if(alpha > && width < mMaxWidth){
mAlphas.set(i, alpha - );
mWidths.set(i, width + );
}
}
// 判断当扩散圆扩散到指定宽度时添加新扩散圆
if (mWidths.get(mWidths.size() - ) == mMaxWidth / mDiffuseWidth) {
mAlphas.add();
mWidths.add();
}
// 超过10个扩散圆,删除最外层
if(mWidths.size() >= ){
mWidths.remove();
mAlphas.remove();
} // 绘制中心圆及图片
mPaint.setAlpha();
mPaint.setColor(mCoreColor);
canvas.drawCircle(getWidth() / , getHeight() / , mCoreRadius, mPaint); if(mBitmap != null){
canvas.drawBitmap(mBitmap, getWidth() / - mBitmap.getWidth() /
, getHeight() / - mBitmap.getHeight() / , mPaint);
} if(mIsDiffuse){
invalidate();
}
} /**
* 开始扩散
*/
public void start() {
mIsDiffuse = true;
invalidate();
} /**
* 停止扩散
*/
public void stop() {
mIsDiffuse = false;
} /**
* 是否扩散中
*/
public boolean isDiffuse(){
return mIsDiffuse;
} /**
* 设置扩散圆颜色
*/
public void setColor(int colorId){
mColor = colorId;
} /**
* 设置中心圆颜色
*/
public void setCoreColor(int colorId){
mCoreColor = colorId;
} /**
* 设置中心圆图片
*/
public void setCoreImage(int imageId){
mBitmap = BitmapFactory.decodeResource(getResources(), imageId);
} /**
* 设置中心圆半径
*/
public void setCoreRadius(int radius){
mCoreRadius = radius;
} /**
* 设置扩散圆宽度(值越小宽度越大)
*/
public void setDiffuseWidth(int width){
mDiffuseWidth = width;
} /**
* 设置最大宽度
*/
public void setMaxWidth(int maxWidth){
mMaxWidth = maxWidth;
}
}
源码下载
GitHub:https://github.com/Airsaid/DiffuseView
Android 自定义控件之圆形扩散View(DiffuseView)的更多相关文章
- Android - 自定义控件之圆形控件
自定义控件 - 圈圈 Android L: Android Studio 效果:能够自定义圆圈半径和位置:设定点击效果:改变背景颜色 下面是demo图 点击前: 点击后: 自定义控件一般要继承View ...
- android自定义控件(二) 入门,继承View
转载请注明地址:http://blog.csdn.net/ethan_xue/article/details/7313788 ps: 可根据apidemo里LableView,list4,list6学 ...
- Android自定义控件之圆形进度条ImageView
From:http://blog.csdn.net/xiadik/article/details/41648181package com.wangran.beautiful_girl_show.vie ...
- 一起来学习android自定义控件—边缘凹凸的View
1前言 最近做项目的时候遇到一个卡劵的效果,由于自己觉得用图片来做的话可以会出现适配效果不好,再加上自己自定义view方面的知识比较薄弱,所以想试试用自定义View来实现.但是由于自己知识点薄弱,一开 ...
- Android实现边缘凹凸的View
转载 最近做项目的时候遇到一个卡劵的效果,由于自己觉得用图片来做的话可以会出现适配效果不好,再加上自己自定义view方面的知识比较薄弱,所以想试试用自定义View来实现.但是由于自己知识点薄弱,一开始 ...
- Android自定义控件系列之应用篇——圆形进度条
一.概述 在上一篇博文中,我们给大家介绍了Android自定义控件系列的基础篇.链接:http://www.cnblogs.com/jerehedu/p/4360066.html 这一篇博文中,我们将 ...
- android 自定义控件---圆形方向盘
在做Android平台开发的时候,经常会遇到安卓原生控件无法满足需求的情况,安卓允许开发者去继承已经存在的控件或者实现你自己的控件. 先来看一下效果图 采用直接集成View类,重写onDrow方法绘制 ...
- Android自定义控件View(三)组合控件
不少人应该见过小米手机系统音量控制UI,一个圆形带动画效果的音量加减UI,效果很好看.它是怎么实现的呢?这篇博客来揭开它的神秘面纱.先上效果图 相信很多人都知道Android自定义控件的三种方式,An ...
- Android自定义控件View(二)继承控件
在前一篇博客中学习了Android自定义控件View的流程步骤和注意点,不了解的童鞋可以参考Android自定义控件View(一).这一节开始学习自定义控件View(二)之继承系统已有的控件.我们来自 ...
随机推荐
- 移动APP 微信支付完整过程(wxPay 方案一)
apicloud.weixinpay官方提供了两种方案. 本模块封装了两套支付方案: 方案一:开发者通过 getOrderId.payOrder 自己处理签名过程(微信开放平台建议把 getOrder ...
- 团体程序设计天梯赛-练习集-L1-032. Left-pad
L1-032. Left-pad 根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模 ...
- 安卓 九宫格 GridView 的表格布局
首先,请大家理解一下“迭代显示”这个概念,这个好比布局嵌套,我们在一个大布局里面重复的放入一些布局相同的小布局,那些重复的部分是由图片和文字组成的小控件,图片在上方,文字在下方,之后我们只需要把这些小 ...
- 如何在 vuex action 中获取到 vue 实例
问题:在做运营开发工具的时候 我想要请求后台服务器保存成功后 弹出一个弹框(饿了吗 的 message 弹框), 由于$message 是挂在 Vue原型链上的方法 (Vue.prototype.$m ...
- Selenium Webdriver——操作隐藏的元素display属性
有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了.例如,下面的情况: 页面主要通过“display:none”来控制整个下拉框不可见.这个时候如果直接操作这个下拉框, ...
- 第三次训练 密码acmore
网站:CSUST7月23号 A题:大意是:一个N多边形,用红,绿,蓝三色给定点上色,要求划分成顶点颜色不同的三角形. 解析: 这道题是黑书上分治法的例题,还是比较巧的. 首先很容易发现当某种颜色的点只 ...
- HDU - 4074 - Sum
先上题目: Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- 【ACM】nyoj_7_街区最短路径问题_201308051737
街区最短路径问题时间限制:3000 ms | 内存限制:65535 KB 难度:4描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间隔相等. ...
- Linux Storage Stack Diagram 4.0
https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram
- python使用pytest+pytest报告
需要安装pytest和pytest-html pip3 install -U pytest pip3 install -U pytest-html