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

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

距离过春节还有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,就到这。明天我休假了。家里有点事可能停更,之后放假在家没事做的时候再补吧,新年快乐。!

!!

时间: 2024-08-05 08:14:26

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

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

http://blog.csdn.net/u011318735/article/details/17424349 既然学习了USB,那就必须的搞懂USB设备与USB主机数据是怎么通讯的.这里主要讲设备端,因为我们的代码是做USB设备用的. 我们需要必须要定义了USB中断.起始在STM32的中断向量表中给USB两个中断,我们可以在stm32f10x.h中找到这两个中断: USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1

C#邮件发送问题(二)

C#邮件发送问题(一) 三.C#下创建基于TcpClient发送邮件组件 在上一节在Dos命令行下测试SMTP服务器连接时,已经使用了SMTP的部分命令,但是当时无法对信息进行编码和解码,也就无法继续进行身份验证和信息传输.在.Net库中,我们可以使用System.Net.Sockets.TcpClient类实现上一节发送邮件组件的同样功能(其实OpenSmtp也同样是基于这个组件开发的),这里仅作为测试以充分了解SMTP协议规范. 1.SMTP命令及其响应 邮件发送的基本过程是一问一答的方式与

C#邮件发送问题(一)

邮件发送需考虑很多因素,包括发送邮件客户端(一般编码实现),发送和接收邮件服务器设置等.如果使用第三方邮件服务器作为发送服务器,就需要考虑该服务器的发送限制,(如发送邮件时间间隔,单位时间内发送邮件数量,是否使用安全连接SSL),同时无论使用第三方还是自己的邮件服务器都还需要考虑接收邮件服务器的限制.为理清思路,下面我们简单回顾电子邮件系统的基本网络结构和邮件发送接收流程. 一.电子邮件系统的基本网络结构 如下图: 邮件发送接收一般经过以下几个节点: 发送邮件客户端(Mail User Agen

Zend_Mail 邮件发送(SMTP方式)

Zend_Mail邮件发送 转载请注明出处,尊重原创:http://blog.csdn.net/a437629292/article/details/41700009 一. 邮件发送方式: 1.直接邮件服务器发送: 直接使用邮件服务器发送,也就是php程序所在服务器上本来就是邮件服务器(即配置成SMTP邮件服务器),并且发送到的对方也必须是邮件服务器,比如QQ邮箱,163邮箱等等,他们直接也是使用SMTP协议 2. 委托其他邮件服务器发送: php程序委托其他邮件服务器发送邮件(必须条件:该服务

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

SMTP(Simple Mail Transfer Protocol) 制定: First:RFC 788 in 1981 Last:RFC 5321 in 2008 端口: TCP 25(SMTP), TCP 465/587(SMTP_SSL) 功能: 用户客户端: 发送消息:SMTP 接收和管理消息:POP3.IMAP 邮件服务器: 发送和接收消息:SMTP 说明: SMTP仅定义了消息传输格式(如消息发送者参数),而非消息内容(如消息头和消息体). 邮件发送模型 流程描述: (1)    

redmine邮件发送功能配置详解

redmine的邮件发送功能还是很有用的. 像项目有更新啦,任务分配啦,都能邮件发送的相关责任人. 我自己在linux服务器上安装并启动了redmine后,邮件一直发送了不了. 查了网上的资料,都是讲修改下配置文件就可以了,他们没错,只是没有讲全. 下面是我整理的一个redmine邮件发送功能设置的一个完整流程. 1. sendmail安装与检查 linux机器上安装的redmine要能发送邮件,先得是本机的sendmail功能是正常的. 查看sendmail进程是否已正常启动: $ ps au

邮件发送的实现

一.了解邮件发送的流程 如上图,假如用户A使用QQ邮箱向163邮箱的使用者用户B发送邮件.用户A登录邮件客户端软件,填写收件人,主题和正文,邮件服务器按照SMTP协议将用户填写的内容进行数据格式化处理,再通过邮件服务器通过互联网发送到用户B的邮件服务器. 用户B的邮件服务器接收到了用户A发送的邮件后会把该邮件依据SMTP协议将从互联网接收的邮件进行处理然后保存在用户B的163邮件内部存储空间,用户登录邮箱客户端后会从该163邮件内部存储空间中依照POP3协议读取存在服务器中的邮件. 其中SMTP

学习笔记之邮件发送篇

用脚本语言发送邮件是系统管理员必备技能 对系统定期检查或者当服务器受到攻击时生成文档和报表. 发布这些文档最快速有效的方法就是发送邮件. python中email模块使得处理邮件变得比较简单 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍: 本段摘录于    http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html 1.smtplib模块 smtplib.SMTP([host[, p

python邮件发送

在基于互联网的应用中,程序经常需要自动地发送电子邮件.如:一个网站的注册系统会在用户注册时发送一封邮件来确认注册:当用户忘记登陆密码的时候,通过邮件来取回密码.smtplib模块是python中smtp(简单邮件传输协议)的客户端实现.我们可以使用smtplib模块,轻松的发送电子邮件.下面的例子用了不到十行代码来发送电子邮件: #coding=gbk import smtplib smtp = smtplib.SMTP() smtp.connect("smtp.yeah.net",