发布网友 发布时间:2022-04-20 22:16
共11个回答
懂视网 时间:2022-05-02 07:02
class SendButton extends View31行。继承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方法。
!!
翻翻git之---自己定义邮件发送buttonSendButton(流程分析,实现思路能够学习下)
标签:each 继承 com err 一个 article integer nts ondraw
热心网友 时间:2022-05-02 04:10
零基础学习软件测试无非有两种方式:自学和培训。
关于自学,无需多言,如果你自律性强,具备学习能力、有专研问题的好奇心、以及解决问题的能力,那么自学是完全ok的。蜗牛学院这里也给大家整理了一份软件测试的学习路线,希望可以帮助大家少走弯路。
如果你选择培训,那么就分线上课程培训以及线下面授培训。
线上课程可以在网上找,也可以报一些培训班的课,这种学习效率一般会高于纯自学,因为老师会有一些项目演练,不至于让你只学习理论知识。当然,你学完后能不能融会贯通、合理运用又是另一回事了。
线下面授班因为场地、师资、以及各种硬件设施等成本,学习费用一般高于网教课程,面授班最大优势在于有问题可与老师面对面直接解决,学习效率最高,并且有一个技术学习环境。
总结来看,在线课程更适合有行业基础经验的工作者,他们利用自己下班后或周末的碎片时间给自己充充电,以此来提升技术能力。对于零基础转行者而言,还是线下面授班的学习效率更高一些,花最少的时间学更多的知识,但要考虑下自己的经济情况。
热心网友 时间:2022-05-02 05:28
零基础软件测试第一阶段:测试基础热心网友 时间:2022-05-02 07:02
软件测试对学历的要求不高,软件测试课程一般都从零基础讲起,能够让大部分人都学会。如果真的需要一定基础的话,那就是基本的操作电脑的能力,相信几乎每个人都具备。热心网友 时间:2022-05-02 08:54
软件测试是一门新兴行业,平均薪酬不错,而且入门简单。需要掌握一定的开发语言基础,相关网络和数据库的基础知识,以及主要的软件测试理论。基础学习的话有人引导就会相当简单,因此建议最好找一个做测试工作的朋友指导学习效率最高。如果是完全自学,建议安排好时间,几方面知识学习同时开始:热心网友 时间:2022-05-02 11:02
初级阶段需要掌握以下的内容热心网友 时间:2022-05-02 13:26
零基础you学习软件jiu测试的方法有:热心网友 时间:2022-05-02 16:08
如果你是应届毕业生,专业是计算机相关的,其实很好找软件测试的工作,只要姿态放低一点,不怕辛苦,肯学,一切都很简单;如果是非计算机的,找与自己专业相关的企业,看否有软件测试,比如学音乐的,可以找QQ音乐、网易音乐这类音乐软件的公司。在学习之余,可以看一本软件测试基础的书,学习软件测试思维,至少达到拿到一个东西,就能说出如何从哪些方面展开测试,欢迎你+V:Mr_Chen1112,大家一起交流学习。热心网友 时间:2022-05-02 19:06
给大家分享一份2021年最新的软件测试学习导图、路线(导图详细到每个知识点,上传过程中有压缩,需要原图的小伙伴,可以私聊我),以及往期配套学习视频,希望对正在学习的你有所帮助。
一、新手入门
阶段目标
1、以培养初级系统/功能测试工程师为目标,学员通过对各种基本测试概念、测试过程和方法,以及测试设计方法的学习,结合系统测试的实际项目全流程实战。
2、扎实地掌握初级软件测试工程师所需要具备的全部技能,完全能够胜任一般企业里的功能测试工程师、系统测试工程师的职位和相关工作。
(一)系统测试
课程目标
1. 掌握软件测试的基本概念、测试过程及测试方法,了解软件测试工程师的主要工作内容。
2. 熟练应用测试用例设计方法,能够根据不同测试设计方法的应用场景选择对应的测试设计方
法来设计测试用例。
3. 熟悉测试过程及项目实施流程,能够执行测试及将测试过程中找到的缺陷填入缺陷报告并进行管理。
4. 熟悉测试报告编写方法,在项目完成后能够熟练编写测试报告,总结测试中的相关数据及问题。
5. 能够独立完成一个项目的全流程功能测试工作,胜任功能测试工程师的岗位
知识点
1、软件测试基础概念、测试类型及定义、软件测试流程、需求分析、需求跟踪矩阵及应用
2、测试点分析及测试点提取、主流测试用例设计方法、测试用例编写、缺陷生命周期管理
3、缺陷报告编写、测试报告编写、禅道管理工具应用、系统测试项目实战(Woniu进销存管理系统)
(二)Python开发
课程目标
1. 熟练掌握Python测试开发中需要用到的Python语言
2. 能够利用Python语言完成基本的功能并能阅读简单的代码程序
3. 能够利用Python编写测试代码,理解编程中各种常见的概念
4. 熟练掌握Python的各种代码技巧,实现Python测试中的各种功能
知识点
1、Python安装及环境搭建、基础语法及编程规范
2、六大基本数据类型及应用、循环及判断、函数定义和使用、模块及包导入
3、正则表达式使用、面向对象编程、Python文件对象使用
(三)MySql数据库
课程目标
1. 熟悉测试工作中要用到的常规知识点和技术点
2. 能够自行安装、配置、使用Mysql数据库
3. 熟悉Mysql常用命令,并且能够使用这些命令完成测试相关的工作
知识点
1、数据库基本概念、Mysql数据库安装和配置
2、创建数据库和表、数据库约束及数据库设计方法
3、数据库三大范式及其应用场景、增删改查操作
4、数据库多表连接原理、常见多表连接查询操作、分组聚合函数、数据库子查询
(四)Linux操作系统
课程目标
1. 掌握Linux常用命令,能够对常见Linux系统进行安装和配置
2. 能够使用LInux命令进行测试环境搭建
3. 了解Linux常见的资源参数命令,为后面的性能优化打下基础
知识点
1、Linux系统简介、安装和配置
2、Linux文件系统特点、目录结构
3、Linux用户管理、目录管理、文件管理、系统设置、网络通信、磁盘管理、备份压缩
4、Linux系统环境搭建实战
二、上手干活
阶段目标
1、以培养初中级自动化/接口测试工程师为目标,通过系统地学习自动化测试、接口测试以及性能测试相关的技术和工具,学员能够扎实地掌握目前企业里面主流的自动化、接口、性能测试工具,包括移动端的测试
2、可以通过纯Python代码编程实现相关的测试类型,完全能够胜任初中级测试开发、自动化/接口/性能测试工程的职位和相关工作。
(一)自动化测试实战
课程目标
1. 熟练掌握自动化测试相关的概念和工具使用
2. 熟练掌握自动化测试中的对象识别和对象操作方法
3. 熟练掌握自动化测试中的断言方法
4. 能够利用unittest框架或Pytest框架完成自动化测试
5. 能够生成美观漂亮的测试报告
知识点
1、自动化测试基本概念、优劣势
2、自动化测试用例设计、自动化测试流程、自动化测试常见工具
3、selenium webdriver的安装和配置、八种对象识别方法的应用
4、webdriver的常用API介绍、常见元素对象操作函数、等待时间的设置
5、unittest测试框架介绍、setUp方法和tearDown方法的使用、在unittest中定义测试方法6、6、testsuite测试组件的使用、断言的概念及使用、对操作进行截图、利用HTMLRunner生成测试报告
(二)接口测试实战
课程目标
1. 熟练掌握各种常见的网络协议及内容
2. 熟练掌握Python发起网络请求的方法
3. 熟练掌握利用Python完成接口测试的方法
4. 熟练掌握各种常用网络工具完成抓包的方法
5. 熟练掌握POSTMAN等常见的接口测试工具
知识点
1、网络协议基本概念、HTTP协议基础
2、HTTP请求过程、HTTP中的get和post请求
3、Python常用HTTP请求库的安装和配置、接口的概念和接口测试的测试方法、常见后端接口类型
4、HTTP和HTTPS协议的区别、常见抓包工具应用之浏览器抓包、常见抓包工具应用之fiddler抓包、利用fiddler抓取HTTPS数据包
5、用Python的HTTP库构造GET/POST请求、获取HTTP请求的返回值、对接口返回值进行断言、对加密接口请求的处理
6、Python接口测试实战、接口常用工具之POSTMAN实现接口调试
(三)性能测试实战
课程目标
1. 掌握性能测试的基本概念和基本原理
2. 能够根据系统性能需求设计合理的性能测试场景
3. 能够使用Python结合多线程等方式实现性能测试脚本
4. 熟练掌握Jmeter等商业性能测试工具的使用
5. 了解常见的性能参数优化的方式和办法
知识点
1、性能测试概念、性能测试常见术语及其理解
2、性能测试需求分析、用例编写
3、Python结合多线程开发原生性能测试脚本、监控服务器性能指标,及结合多线程设计门型和拱形应用场景
4、基于woniusales实现完整的性能测试脚本开发和实施、及常用主流性能测试工具对比
5、JMeter工具的组件功能介绍、实现接口测试功能、设置多线程实现性能测试、完成性能测试的结果管理、实现对响应的断言、参数化与变量引用、性能测试综合实战
(四)移动端自动化测试实战
课程目标
1. 熟悉移动端测试的主要特点
2. 了解移动端测试和web端测试的主要区别
3. 熟练掌握移动端常见专项测试的测试方法
4. 能够熟练利用Python实现移动端的专项测试
5. 熟悉常见的adb命令及相关测试工具
知识点
1、移动端测试的特点、移动端测试与web测试的异同比较
2、Android SDK安装与配置、模拟器安装配置、常用ADB命令的使用、Appium工具介绍3、3、Appium Desktop环境搭建、安装Python的Appium库、Appium的工作原理
4、APP启动信息配置、Appium的对象识别方法、利用Appium完成移动端项目测试实战
三、技术进阶
阶段目标
1、培养目标是针对企业中高级测试开发工程师、全栈测试开发工程师职位。
2、通过完成设计和实现自动化测试框架、接口测试框架和持续集成框架,学员可具备当前行业内大部分企业相关主流职位的全部技术栈要求,完全能够胜任中高级全栈测试开发工程师、自动化测试工程师以及接口性能测试工程师等职位。
(一)自动化测试框架设计及开发实战
课程目标
1. 熟悉自动化测试框架的几种不同类型及应用场景
2. 熟悉数据驱动框架的设计和实现过程
3. 熟悉关键字驱动的设计和实现过程
4. 熟悉POM测试模型的设计和实现过程
5. 熟悉日志模块的设计和实现过程
6. 熟悉自动化测试框架从需求分析到生成测试报告全流程
知识点
1、测试框架的概念及意义、常见框架设计模式
2、在unittest框架中使用ddt模块实现数据驱动、以文件形式读取数据并封装数据驱动框架
3、关键字驱动框架的意义和使用场景、利用类反射构造关键字
4、重新根据关键字驱动模型重构excel读取方法、关键字驱动项目实战
5、二次封装webdriver里面的方法
6、PageObject设计模式的概念及应用场景、代码封装思路、项目实战
(二)接口测试框架设计及开发实战
课程目标
1. 熟悉接口测试框架的结构和运行原理
2. 熟悉基本的接口测试框架代码实现
3. 熟悉具有数据依赖的请求上下文之间的处理
4. 能够实现从接口测试框架设计到实现全流程工作
知识点
1、接口测试框架组成架构、为接口测试框架设计excel结构、重构excel操作函数
2、封装对JSON数据格式的操作、重构JSON操作类、封装读取常量的方法、封装获取3、接口数据的类、接口测试框架主流程封装及错误调试、返回数据处理及错误调试、封装断言模块对接口返回结果进行判断
4、将测试结果写入结果文件、解决接口间的数据依赖问题、数据依赖流程代码实现
(三)Docker及Jenkins持续集成测试框架
课程目标
1. 了解持续集成的概念及意义
2. 熟悉持续集成的工作过程和流程
3. 熟悉持续集成相关工具的应用,如Docker,Git、Jekins等
4. 能够熟练利用Jenkins+Python实现持续集成和远程部署
知识点
1、Docker的基本介绍和核心功能、整体架构介绍、底层实现原理、版本了解及安装配置使用方法
2、Docker基础命令与应用、Docker镜像管理相关命令应用
3、Docker中容器的概念、持续集成介绍及环境要求
4、Jeknins持续集成框架、持续集成中结合邮件通知服务、持续集成中实现定时执行工程
5、git基本功能介绍及安装配置、常用命令及应用、gitee介绍及工程创建、利用git上传文件到gitee远程仓库、整合应用:利用gitee保存并管理项目代码
由于无法发链接,欢迎小伙伴前来我们官网学习对应的免费视频,凡云教育最新直播速成就业班即将开课,后期会陆续更新最新学习视频,敬请期待~
热心网友 时间:2022-05-02 22:20
其实联网行业的技术岗中,实在没有比软件测试要求更低的了,学习软件测试需要什么基础?基本上了解一下软件测试的基本概念就行了,能理解这些概念,基本上也就学得软件测试了。热心网友 时间:2022-05-03 01:52
软件测试就业必备知识点&自学软件测试-2019
软件测试就业必备知识点&自学测试-2019
软件测试简历如何包装?
软件测试用例整体编写思路
软件测试必掌握的 Linux常用命令--2.0更新版!
软件测试面试题大全-最真实的面试题
知乎问:小白转行学软件测试;能就业吗?