转载请注明出处:王亟亟的大牛之路

距离过春节还有1天。继续这一系列的git翻料之旅。

昨天的工具类真的非常棒,这里再推崇一下 传送门:http://blog.csdn.net/ddwhan0123/article/details/50624061 (实际去体验的小伙伴都说好)

今天上一个自己定义的Button:SendButton

效果:

比較建议把代码抠出来由于内容不多,一个类就画完了

地址:https://github.com/ddwhan0123/SendButton

由于内容不多。我们就来分析下

public class SendButton extends View

31行。继承View而不是ViewGroup(也就是不像一个Layout为底板 其中画东西了,纯画)

    int flag = 0;
Point a, b, c, d, e;
Path mOutlinePath, mPlanePath;
int mButtonColor, mButtonSide, mBorderStrokeWidth, mPlaneStrokeWidth, mPlaneColor;
Paint mBackgroundPaint, mPlanePaint;
ValueAnimator mPlaneAnimator;
long mDuration;
AnimationType mAnimationType;

35-42,定义了一系列变量,动画模式啊,持续时间啊。画笔啊,尺寸什么的

public SendButton(Context context, AttributeSet attrs)
{
super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.SendButton,
0, 0);
try
{
mButtonColor = a.getColor(R.styleable.SendButton_buttonColor, Color.WHITE);
mButtonSide = a.getDimensionPixelSize(R.styleable.SendButton_buttonSide, 200);
mBorderStrokeWidth = a.getInteger(R.styleable.SendButton_borderStrokeWidth, 5);
mPlaneStrokeWidth = a.getInteger(R.styleable.SendButton_planeStrokeWidth, 5);
mPlaneColor = a.getColor(R.styleable.SendButton_planeColor, getResources().getColor(R.color.orange));
mAnimationType = AnimationType.values()[a.getInteger(R.styleable
.SendButton_animationType, 0)];
mDuration = a.getInteger(R.styleable.SendButton_duration, 3000);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
a.recycle();
} init();
}

45-74,构造函数,获取标签的一系列内容,然后把前面那些变量填充了一下,然后调用了init()方法。

private void init()
{
mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPlanePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBackgroundPaint.setStyle(Paint.Style.STROKE);
mPlanePaint.setStrokeWidth(mPlaneStrokeWidth);
mBackgroundPaint.setStrokeWidth(mBorderStrokeWidth);
mBackgroundPaint.setColor(mButtonColor);
mOutlinePath = new Path();
mPlanePath = new Path();
mPlaneAnimator = ValueAnimator.ofInt(0, 75);
mPlaneAnimator.setDuration(mDuration);
mPlaneAnimator.setRepeatMode(ValueAnimator.RESTART);
mPlaneAnimator.setRepeatCount(ValueAnimator.INFINITE); switch (mAnimationType)
{
case LINEAR:
mPlaneAnimator.setInterpolator(new LinearInterpolator());
break;
case ANTICIPATE:
mPlaneAnimator.setInterpolator(new AnticipateInterpolator());
break;
case ANTICIPATE_OVERSHOOT:
mPlaneAnimator.setInterpolator(new AnticipateOvershootInterpolator());
break;
case ACCELERATE:
mPlaneAnimator.setInterpolator(new AccelerateInterpolator());
break;
case ACCELERATE_DECELERATE:
mPlaneAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
break;
case BOUNCE:
mPlaneAnimator.setInterpolator(new BounceInterpolator());
break;
case DECELERATE:
mPlaneAnimator.setInterpolator(new DecelerateInterpolator());
break;
case FASTOUTLINEARIN:
mPlaneAnimator.setInterpolator(new FastOutLinearInInterpolator());
break;
case FASTOUTSLOWIN:
mPlaneAnimator.setInterpolator(new FastOutSlowInInterpolator());
break;
case LINEAROUTSLOWIN:
mPlaneAnimator.setInterpolator(new LinearOutSlowInInterpolator());
break;
case OVERSHOOT:
mPlaneAnimator.setInterpolator(new OvershootInterpolator());
break;
} mPlaneAnimator.start(); /**
* The coordinates position calculated by percentage of button side.
*/
a = new Point((mButtonSide * 10) / 100, (mButtonSide * 55) / 100); // Point a : (10% of mButtonSide, 55% of mButtonSide)
b = new Point((mButtonSide * 80) / 100, (mButtonSide * 20) / 100); // Point b : (80% of mButtonSide, 20% of mButtonSide)
c = new Point((mButtonSide * 45) / 100, (mButtonSide * 90) / 100); // Point c : (45% of mButtonSide, 90% of mButtonSide)
d = new Point((mButtonSide * 30) / 100, (mButtonSide * 70) / 100); // Point d : (30% of mButtonSide, 70% of mButtonSide)
e = new Point(mButtonSide / 2, mButtonSide / 2); // Point e : (10% of mButtonSide, 55% of mButtonSide) }

76-139,给画笔着色,然后选定插值器模式(就是突然加速啊,缓慢啊。一系列模式这个我之前View的文章里有,传送门:http://blog.csdn.net/ddwhan0123/article/details/50464283

再一个就是计算各个坐标点,画圆画三角都用的。(算法这部分不研究了。反正就是依据控件大小操作)

public void setPath()
{
mPlanePath = new Path(); mPlanePath.moveTo(a.x, a.y); //Set the starting point to A
mPlanePath.lineTo(a.x, a.y);
mPlanePath.lineTo(b.x, b.y);
mPlanePath.lineTo(c.x, c.y);
mPlanePath.lineTo(d.x, d.y);
mPlanePath.lineTo(e.x, e.y);
mPlanePath.lineTo(d.x, d.y);
mPlanePath.lineTo(a.x, a.y);
}

164-174,画轨迹用的

private void translate()
{
a.set((mButtonSide * 10) / 100, (mButtonSide * 55) / 100); // Point a : (10% of mButtonSide,
// 55% of mButtonSide)
b.set((mButtonSide * 80) / 100, (mButtonSide * 20) / 100); // Point b : (80% of mButtonSide,
// 20% of mButtonSide)
c.set((mButtonSide * 45) / 100, (mButtonSide * 90) / 100); // Point c : (45% of mButtonSide,
// 90% of mButtonSide)
d.set((mButtonSide * 30) / 100, (mButtonSide * 70) / 100); // Point d : (30% of mButtonSide,
// 70% of mButtonSide)
e.set(mButtonSide / 2, mButtonSide / 2); // Point e : (10% of mButtonSide, 55% of
// mButtonSide) int change = 3 * (int) mPlaneAnimator.getAnimatedValue(); Log.i(LOGTAG, "Animated Value: " + change + ", Flag: " + flag++); a.x += change;
a.y -= change;
b.x += change;
b.y -= change;
c.x += change;
c.y -= change;
d.x += change;
d.y -= change;
e.x += change;
e.y -= change; invalidate(); }

178-209,画三角用的,这个三角有一个内凹的角度问题,计算起来还是有点搞脑子了(算法差,心酸)

    private enum AnimationType
{
LINEAR,
ANTICIPATE,
ANTICIPATE_OVERSHOOT,
ACCELERATE,
ACCELERATE_DECELERATE,
BOUNCE,
DECELERATE,
FASTOUTLINEARIN,
FASTOUTSLOWIN,
LINEAROUTSLOWIN,
OVERSHOOT
}

211-224,各类插值器做的枚举

@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
mBackgroundPaint.setAlpha(255);
mOutlinePath.addRoundRect(new RectF(0, 0, mButtonSide, mButtonSide),
mButtonSide / 3, mButtonSide / 3, Path.Direction.CCW);
canvas.drawPath(mOutlinePath, mBackgroundPaint);
canvas.clipPath(mOutlinePath);
// for different color of Fill and Stroke,
// first painted in Fill style and then Stroke style with different color
mPlanePaint.setStyle(Paint.Style.FILL);
mPlanePaint.setColor(mPlaneColor);
mPlanePaint.setAlpha(255 - ((int) mPlaneAnimator.getAnimatedValue() * 25) / 10);
translate();
setPath();
canvas.drawPath(mPlanePath, mPlanePaint);
mPlanePaint.setStyle(Paint.Style.STROKE);
mPlanePaint.setColor(Color.WHITE);
mPlanePaint.setAlpha(255 - ((int) mPlaneAnimator.getAnimatedValue() * 25) / 10);
canvas.drawPath(mPlanePath, mPlanePaint);
}

142-162,详细的绘画实现,这部分来读一读

首先给画笔做了一些圆角的操作。然后画方,画圆。然后用Direction去掉不须要的部分。出现了我们的外圈白线

再之后就是画三角。画三角也是依据位置和动画位置一直在刷UI的。

所以 这控件持续时间多了,可能会有卡顿的现象。。

背景啊,大小啊,三角颜色这些都能够改。可是要在XML里改,作者没有提供一系列set方法。

OK,就到这。明天我休假了。家里有点事可能停更,之后放假在家没事做的时候再补吧,新年快乐。!

!!

翻翻git之---自己定义邮件发送buttonSendButton(流程分析,实现思路能够学习下)的更多相关文章

  1. stm32 usb数据接收与数据发送程序流程分析

    http://blog.csdn.net/u011318735/article/details/17424349 既然学习了USB,那就必须的搞懂USB设备与USB主机数据是怎么通讯的.这里主要讲设备 ...

  2. C#邮件发送问题(二)

    C#邮件发送问题(一) 三.C#下创建基于TcpClient发送邮件组件 在上一节在Dos命令行下测试SMTP服务器连接时,已经使用了SMTP的部分命令,但是当时无法对信息进行编码和解码,也就无法继续 ...

  3. C#邮件发送问题(一)

    邮件发送需考虑很多因素,包括发送邮件客户端(一般编码实现),发送和接收邮件服务器设置等.如果使用第三方邮件服务器作为发送服务器,就需要考虑该服务器的发送限制,(如发送邮件时间间隔,单位时间内发送邮件数 ...

  4. 邮件发送模型及其Python应用实例

    SMTP(Simple Mail Transfer Protocol) 制定: First:RFC 788 in 1981 Last:RFC 5321 in 2008 端口: TCP 25(SMTP) ...

  5. redmine邮件发送功能配置详解

    redmine的邮件发送功能还是很有用的.像项目有更新啦,任务分配啦,都能邮件发送的相关责任人.我自己在linux服务器上安装并启动了redmine后,邮件一直发送了不了.查了网上的资料,都是讲修改下 ...

  6. 测试开发【提测平台】分享11-Python实现邮件发送的两种方法实践

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 按照开发安排,本篇本应该是关于提测页面的搜索和显示实现,怕相似内容疲劳,这期改下内容顺序,将邮件服务的相关的提前,在之前的产品需求和原型中 ...

  7. .NET开发邮件发送功能的全面教程(含邮件组件源码)

    今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2)         ...

  8. J2EE 邮件发送那些事儿

    距离自己写的关于java邮件发送的第一篇博客已经有很长一段时间了,现在回过头看看.虽然代码质量方面有待提高,整体结构也不怎样,但是基本思路和过程还是比较纯的.现在有空写写J2EE中邮件发送的开发,实际 ...

  9. 结合ABP源码实现邮件发送功能

    1. 前言 2. 实现过程 1. 代码图(重) 2.具体实现 2.1 定义AppSettingNames及AppSettingProvider 2.2 EmailSenderConfiguration ...

随机推荐

  1. Http协议详解(转)>>>写的很好

    声明:本片文章非原创,仅供自己学习并分享 内容来源于博客园作者MIN飞翔的HTTP协议详解地址http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html ...

  2. 关于vector.size()和string.length() 的返回类型 size_type

    今天写循环的时候碰到一个问题,发现:string.length()返回的类型是size_type.它是unsigned 类型.string::size_type它在不同的机器上,长度是可以不同的,并非 ...

  3. [转]linux uniq 命令详解

    转自:http://blog.csdn.net/tianmohust/article/details/6997683 uniq 命令   文字 uniq 是LINUX命令 用途 报告或删除文件中重复的 ...

  4. Elasticsearch之CURL命令的DSL查询

    它是Domain Specific Language领域特定语言. https://www.elastic.co/guide/en/elasticsearch/reference/current/in ...

  5. MVC系列学习(八)-分布视图

    1.本次学习实例 1.1.建议:为了尽可能让项目简单,就新建一个空的mvc项目,同时添加任何视图不用模板页 1.2注意:在添加LoginPart的分部视图时,要记得沟一个沟 2.项目代码,如下 总共三 ...

  6. ionic中遇到的一些问题和坑

    接触ionic有一段时间了,一路上踩了不少坑.大部分都记录下来了,分享给大家,可以少走很多弯路 1,ng-init不能在body里面初始化,可以在一个段落里面初始化<div ng-init> ...

  7. vm装xp安装成功后进入不了系统

    1.如果是用虚拟光驱,你肯定步骤是先新建的虚拟机,再安装的虚拟光驱,所以会出现这样的问题.(请先安装虚拟光驱,再新建虚拟机,再用虚拟光驱加载镜像文件,问题解决)2.如果是直接使用的镜像,那么在GHOS ...

  8. smtplib.SMTPDataError: (554, b'DT:SPM 126 smtp

    报错信息 smtplib.SMTPDataError: (554, b'DT:SPM 126 smtp7,DsmowAA3uguL7e1cyvkyFw--.22553S3 1559096715,ple ...

  9. CAD在网页绘一个直线,得到直线id,再调该得到直线对象,然写扩展数据

    IMxDrawDatabase::ObjectIdToObject 实体id返回实体对象. 参数 说明 [in] LONGLONG lId 实体id JS代码,中绘一个直线,得到直线id,再调该得到直 ...

  10. Django - 模版语言循环字典

    1.可以对传入字典参数做循环显示 views.py中代码: urls.py中代码: html中代码: 在模版语言中,可以对字典进行类似python中的操作(keys,values,items),需要注 ...