当前位置: 首页 > 编程日记 > 正文

【Android动画】之Tween动画 (渐变、缩放、位移、旋转)

Android 平台提供了两类动画。 一类是Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变)。

第二类就是 Frame动画,即顺序的播放事先做好的图像,与gif图片原理类似。

下面就讲一下Tweene Animations。

主要类:

Animation   动画

AlphaAnimation 渐变透明度

RotateAnimation 画面旋转

ScaleAnimation 渐变尺寸缩放

TranslateAnimation 位置移动

AnimationSet  动画集

有了这些类,那么我们如何来实现动画效果呢?

以自定义View为例,该View很简单,画面上只有一个图片。 现在我们要对整个View分别实现各种Tween动画效果。

AlphaAnimation

通过代码实现 AlphaAnimation,如下:

[java] view plaincopyprint?
  1. //初始化  
  2. Animation alphaAnimation = new AlphaAnimation(0.1f, 1.0f);  
  3. //设置动画时间            alphaAnimation.setDuration(3000);  
  4. this.startAnimation(alphaAnimation);  

其中AlphaAnimation类第一个参数fromAlpha表示动画起始时的透明度, 第二个参数toAlpha表示动画结束时的透明度。

setDuration用来设置动画持续时间。

RotateAnimation

 

代码:

[java] view plaincopyprint?
  1. Animation rotateAnimation = new RotateAnimation(0f, 360f);  
  2. rotateAnimation.setDuration(1000);  
  3. this.startAnimation(rotateAnimation);  

其中RotateAnimation类第一个参数fromDegrees表示动画起始时的角度, 第二个参数toDegrees表示动画结束时的角度。

另外还可以设置伸缩模式pivotXType、pivotYType, 伸缩动画相对于x,y 坐标的开始位置pivotXValue、pivotYValue等。

ScaleAnimation

代码:

[java] view plaincopyprint?
  1. //初始化  
  2. Animation scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f);  
  3. //设置动画时间  
  4. scaleAnimation.setDuration(500);  
  5. this.startAnimation(scaleAnimation);  

ScaleAnimation类中

第一个参数fromX ,第二个参数toX:分别是动画起始、结束时X坐标上的伸缩尺寸。

第三个参数fromY ,第四个参数toY:分别是动画起始、结束时Y坐标上的伸缩尺寸。

另外还可以设置伸缩模式pivotXType、pivotYType, 伸缩动画相对于x,y 坐标的开始位置pivotXValue、pivotYValue等。

TranslateAnimation

代码:

[java] view plaincopyprint?
  1. //初始化  
  2. Animation translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);  
  3. //设置动画时间                translateAnimation.setDuration(1000);  
  4. this.startAnimation(translateAnimation);  

TranslateAnimation类

第一个参数fromXDelta ,第二个参数toXDelta:分别是动画起始、结束时X坐标。

第三个参数fromYDelta ,第四个参数toYDelta:分别是动画起始、结束时Y坐标。

参数详细说明:

表二

XML节点功能说明
alpha渐变透明度动画效果
<alpha
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />
fromAlpha

属性为动画起始时透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字
toAlpha属性为动画结束时透明度

表三

scale渐变尺寸伸缩动画效果
<scale
android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
android:fromXScale=”0.0″
android:toXScale=”1.4″
android:fromYScale=”0.0″
android:toYScale=”1.4″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″ />
fromXScale[float] fromYScale[float]为动画起始时,X、Y坐标上的伸缩尺寸0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
toXScale [float]
toYScale[float]
为动画结束时,X、Y坐标上的伸缩尺寸
pivotX[float]
pivotY[float]
为动画相对于物件的X、Y坐标的开始位置属性值说明:从0%-100%中取值,50%为物件的X或Y方向坐标上的中点位置

表四

translate画面转换位置移动动画效果
<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
fromXDelta
toXDelta
为动画、结束起始时 X坐标上的位置
fromYDelta
toYDelta
为动画、结束起始时 Y坐标上的位置

表五

rotate画面转移旋转动画效果
<rotate
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
fromDegrees为动画起始时物件的角度说明
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
toDegrees属性为动画结束时物件旋转的角度 可以大于360度
pivotX
pivotY
为动画相对于物件的X、Y坐标的开始位说明:以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置

以上都是单独的使用某个动画,那么如何让多个动画同时生效呢?

 

答案是 AnimationSet。

初看整个类名,还以为只是用来存放 Animation的一个Set, 细看才发现,该类也是继承自 Animation的。

下面我们实现一个动画,该动画会让图片移动的同时,图片透明度渐变,直接看代码吧。

[java] view plaincopyprint?
  1. //初始化 Translate动画  
  2. translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);  
  3. //初始化 Alpha动画  
  4. alphaAnimation = new AlphaAnimation(0.1f, 1.0f);  
  5. //动画集  
  6. AnimationSet set = new AnimationSet(true);  
  7. set.addAnimation(translateAnimation);
  8. set.addAnimation(alphaAnimation);
  9. //设置动画时间 (作用到每个动画)  
  10. set.setDuration(1000);  
  11. this.startAnimation(set);  

是不是觉得很简单呢?

附上整个View类的代码吧。

[java] view plaincopyprint?
  1. package com.yfz.view;  
  2. import com.yfz.R;  
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.drawable.BitmapDrawable;  
  6. import android.util.Log;  
  7. import android.view.KeyEvent;  
  8. import android.view.View;  
  9. import android.view.animation.AlphaAnimation;  
  10. import android.view.animation.Animation;  
  11. import android.view.animation.AnimationSet;  
  12. import android.view.animation.RotateAnimation;  
  13. import android.view.animation.ScaleAnimation;  
  14. import android.view.animation.TranslateAnimation;  
  15. public class TweenAnim extends View {  
  16. //Alpha动画 - 渐变透明度  
  17. private Animation alphaAnimation = null;  
  18. //Sacle动画 - 渐变尺寸缩放  
  19. private Animation scaleAnimation = null;  
  20. //Translate动画 - 位置移动  
  21. private Animation translateAnimation = null;  
  22. //Rotate动画 - 画面旋转  
  23. private Animation rotateAnimation = null;  
  24. public TweenAnim(Context context) {  
  25. super(context);  
  26. }
  27. @Override  
  28. protected void onDraw(Canvas canvas) {  
  29. super.onDraw(canvas);  
  30. Log.e("Tween", "onDraw");  
  31. //加载一个图片  
  32. canvas.drawBitmap(((BitmapDrawable)getResources().getDrawable(R.drawable.gallery_photo_5)).getBitmap(), 0, 0, null);  
  33. }
  34. @Override  
  35. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  36. Log.e("Tween", "onKeyDown");  
  37. return true;  
  38. }
  39. @Override  
  40. public boolean onKeyUp(int keyCode, KeyEvent event) {  
  41. Log.e("Tween", "onKeyDown");  
  42. switch (keyCode) {  
  43. case KeyEvent.KEYCODE_DPAD_UP:  
  44. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_UP");  
  45. alphaAnimation = new AlphaAnimation(0.1f, 1.0f);  
  46. //设置动画时间  
  47. alphaAnimation.setDuration(3000);  
  48. this.startAnimation(alphaAnimation);  
  49. break;  
  50. case KeyEvent.KEYCODE_DPAD_DOWN:  
  51. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_DOWN");  
  52. rotateAnimation = new RotateAnimation(0f, 360f);  
  53. rotateAnimation.setDuration(1000);  
  54. this.startAnimation(rotateAnimation);  
  55. break;  
  56. case KeyEvent.KEYCODE_DPAD_LEFT:  
  57. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_LEFT");  
  58. //初始化  
  59. scaleAnimation = new ScaleAnimation(0.1f, 1.0f,0.1f,1.0f);  
  60. //设置动画时间  
  61. scaleAnimation.setDuration(500);  
  62. this.startAnimation(scaleAnimation);  
  63. break;  
  64. case KeyEvent.KEYCODE_DPAD_RIGHT:  
  65. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_RIGHT");  
  66. //初始化  
  67. translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);  
  68. //设置动画时间  
  69. translateAnimation.setDuration(1000);  
  70. this.startAnimation(translateAnimation);  
  71. break;  
  72. case KeyEvent.KEYCODE_DPAD_CENTER:  
  73. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_CENTER");  
  74. //初始化 Translate动画  
  75. translateAnimation = new TranslateAnimation(0.1f, 100.0f,0.1f,100.0f);  
  76. //初始化 Alpha动画  
  77. alphaAnimation = new AlphaAnimation(0.1f, 1.0f);  
  78. //动画集  
  79. AnimationSet set = new AnimationSet(true);  
  80. set.addAnimation(translateAnimation);
  81. set.addAnimation(alphaAnimation);
  82. //设置动画时间 (作用到每个动画)  
  83. set.setDuration(1000);  
  84. this.startAnimation(set);  
  85. break;  
  86. default:  
  87. break;  
  88. }
  89. return true;  
  90. }
  91. }

在Activity中调用该类时,需要注意一定setFocusable(true), 否则焦点在Activity上的话,onKeyUp方法是不会生效的。

调用该View的代码:

[java] view plaincopyprint?
  1. TweenAnim anim = new TweenAnim(Lesson_11.this);  
  2. anim.setFocusable(true);  
  3. setContentView(anim);


上面通过Java代码,实现了4中不同的Tween动画,其实在Android中完全可以通过 XML文件来实现动画。这种方式可能更加简洁、清晰,也更利于重用。

下面我们分别对这几种动画改用xml来实现。

首先是AlphaAnimation。

alpha_anim.xml:

[xhtml] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <alpha  
  4.         android:fromAlpha="0.1"  
  5.         android:toAlpha="1.0"  
  6.         android:duration="2000"  
  7.     />  
  8. </set>  

 

不用解释了吧。

RotateAnimation

rotate_anim.xml:

[xhtml] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3. <rotate  
  4. android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
  5. android:fromDegrees="0"  
  6. android:toDegrees="360"  
  7. android:pivotX="50%"  
  8. android:pivotY="50%"  
  9. android:duration="500"  
  10. />  
  11. </set>  

ScaleAnimation

scale_anim.xml:

[xhtml] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3. <scale  
  4. android:interpolator="@android:anim/accelerate_decelerate_interpolator"  
  5. android:fromXScale="0.0"  
  6. android:toXScale="1.0"  
  7. android:fromYScale="0.0"  
  8. android:toYScale="1.0"  
  9. android:pivotX="50%"  
  10. android:pivotY="50%"  
  11. android:fillAfter="false"  
  12. android:duration="500"  
  13. />     
  14. </set>  

TranslateAnimation

translate_anim.xml:

[xhtml] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">  
  3. <translate  
  4. android:fromXDelta="10"  
  5. android:toXDelta="100"  
  6. android:fromYDelta="10"  
  7. android:toYDelta="100"  
  8. />  
  9. </set>  

布局文件都已经写完,那么如何来使用这些文件呢?

其实也很简单,此时需要用到AnimationUtils类。 通过该类中 loadAnimation 方法来加载这些布局文件。

如:

[java] view plaincopyprint?
  1. rotateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.rotate_anim);  

这次View类的代码如下:

[java] view plaincopyprint?
  1. package com.yfz.view;  
  2. import com.yfz.R;  
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.drawable.BitmapDrawable;  
  6. import android.util.Log;  
  7. import android.view.KeyEvent;  
  8. import android.view.View;  
  9. import android.view.animation.AlphaAnimation;  
  10. import android.view.animation.Animation;  
  11. import android.view.animation.AnimationSet;  
  12. import android.view.animation.AnimationUtils;  
  13. import android.view.animation.RotateAnimation;  
  14. import android.view.animation.ScaleAnimation;  
  15. import android.view.animation.TranslateAnimation;  
  16. public class TweenAnim2 extends View {  
  17. //Alpha动画 - 渐变透明度  
  18. private Animation alphaAnimation = null;  
  19. //Sacle动画 - 渐变尺寸缩放  
  20. private Animation scaleAnimation = null;  
  21. //Translate动画 - 位置移动  
  22. private Animation translateAnimation = null;  
  23. //Rotate动画 - 画面旋转  
  24. private Animation rotateAnimation = null;  
  25. public TweenAnim2(Context context) {  
  26. super(context);  
  27. }
  28. @Override  
  29. protected void onDraw(Canvas canvas) {  
  30. super.onDraw(canvas);  
  31. Log.e("Tween", "onDraw");  
  32. //加载一个图片  
  33. canvas.drawBitmap(((BitmapDrawable)getResources().getDrawable(R.drawable.gallery_photo_5)).getBitmap(), 0, 0, null);  
  34. }
  35. @Override  
  36. public boolean onKeyDown(int keyCode, KeyEvent event) {  
  37. Log.e("Tween", "onKeyDown");  
  38. return true;  
  39. }
  40. @Override  
  41. public boolean onKeyUp(int keyCode, KeyEvent event) {  
  42. Log.e("Tween", "onKeyDown");  
  43. switch (keyCode) {  
  44. case KeyEvent.KEYCODE_DPAD_UP:  
  45. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_UP");  
  46. alphaAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.alpha_anim);  
  47. this.startAnimation(alphaAnimation);  
  48. break;  
  49. case KeyEvent.KEYCODE_DPAD_DOWN:  
  50. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_DOWN");  
  51. rotateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.rotate_anim);  
  52. this.startAnimation(rotateAnimation);  
  53. break;  
  54. case KeyEvent.KEYCODE_DPAD_LEFT:  
  55. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_LEFT");  
  56. scaleAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.scale_anim);  
  57. this.startAnimation(scaleAnimation);  
  58. break;  
  59. case KeyEvent.KEYCODE_DPAD_RIGHT:  
  60. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_RIGHT");  
  61. translateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.translate_anim);  
  62. this.startAnimation(translateAnimation);  
  63. break;  
  64. case KeyEvent.KEYCODE_DPAD_CENTER:  
  65. Log.e("Tween", "onKeyDown - KEYCODE_DPAD_CENTER");  
  66. //初始化 Translate动画  
  67. translateAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.translate_anim);  
  68. //初始化 Alpha动画  
  69. alphaAnimation = AnimationUtils.loadAnimation(this.getContext(), R.anim.alpha_anim);  
  70. //动画集  
  71. AnimationSet set = new AnimationSet(true);  
  72. set.addAnimation(translateAnimation);
  73. set.addAnimation(alphaAnimation);
  74. //设置动画时间 (作用到每个动画)  
  75. set.setDuration(1000);  
  76. this.startAnimation(set);  
  77. break;  
  78. default:  
  79. break;  
  80. }
  81. return true;  
  82. }
  83. }

转载于:https://www.cnblogs.com/Free-Thinker/p/4380002.html

相关文章:

Mac下PHP7.1+Nginx安装和配置

https://blog.csdn.net/haiyanggeng/article/details/79186982 PHP&#xff1a;7.1.13Nginx&#xff1a;1.12.2 1. 安装PHP# 添加源brew tap homebrew/dupesbrew tap homebrew/versionsbrew tap homebrew/homebrew-php#更新源brew update#安装brew install php71 --with-imap -…

黑木耳的功效是什么

黑木耳&#xff0c;生长在朽木上&#xff0c;形似人的耳朵&#xff0c;色黑或褐黑&#xff0c;故名黑木耳&#xff0c;又名木菌、树鸡。黑木耳营养极为丰富&#xff0c;据史料记载&#xff0c;它是上古时代帝王独享之佳品&#xff0c;含有大量的碳水化合物、蛋白质、铁、钙、磷…

Javascript 移动的海绵宝宝

效果描述&#xff1a; 做一个简单的动画效果&#xff0c;刚刷新页面时&#xff0c;SpongeBob在页面的左上角位置&#xff0c;随着时间推移&#xff0c;他匀速向右移动&#xff0c;直到右侧抵达页面右侧停下来。 分析&#xff1a; SpongeBob作为一张图片被存放在<img>里…

sqlserver任务导出Excle

--sql语句就用下面的存储过程 /*--数据导出Excel 导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件,如果文件不存在,将自动创建文件,如果表不存在,将自动创建表基于通用性考虑,仅支持导出标准数据类型 使用方法&#xff1a; 直接复制执行创建储存过程-&#xff0d;陈…

Oracle集合操作

Oracle集合操作 UNION&#xff1a;并集&#xff0c;所有的内容都查询&#xff0c;重复的显示一次 UNION ALL&#xff1a;并集&#xff0c;所有的内容都显示&#xff0c;包括重复的 INTERSECT&#xff1a;交集&#xff1a;只显示重复的 MINUS&#xff1a;差集&#xff1a…

Mongodb 4.0+安装

mongodb 4.0&#xff1a;windows 环境选择默认安装路径&#xff1b;存储文件夹自定义&#xff1a; 1.原配置文件删除.mp2.data下新建db文件夹 Mongod -- dbpath D:MongoDB/data3.&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;close windows防火墙&#xff08;…

JavaScript 慢慢移动的海绵宝宝

前情提要&#xff1a;Javascript 移动的海绵宝宝 这个海绵宝宝是匀速运动、突然停下来的&#xff0c;有点不合理。现实中我们跑步都是速度慢慢减小到0。 要实现这个效果&#xff0c;就必须速度逐渐减小&#xff0c;本质上是盒子的步长逐渐减小。 step (targetLocation - nowL…

Linux(CentOS)目录操作命令、文件操作命令、压缩解压缩命令

一、目录操作命令  ls命令    — 功能说明&#xff1a;显示文件和目录列表。    — 命令格式&#xff1a;ls [参数] [<文件或目录> …]    — 常用参数&#xff1a;      -a : 不隐藏任何以“.”字符开始的条目。      -b : 用八进制形式显示非打…

阿里巴巴持续投入,etcd 正式加入 CNCF

2018 年 12 月 11 日&#xff0c;在 KubeCon CloudNativeCon 北美峰会上&#xff0c;etcd 项目正式加入云原生计算基金会&#xff08;CNCF&#xff09;。CNCF 是一个厂商中立的基金会、云原生技术推广和普及的领导者。 etcd 在 2013 年由李响&#xff0c;Brandon Philips, Al…

小机上监控AIX和数据库管理系统的运行情况直到性能优化(SQL语句优化和排除硬件问题)...

AIX下的命令 1)topas 检测操作系统的运行状况 2)nmon(c--cpu,m--memory,d--disk) 检测这3个的情况 ORACLE下的命令 提示&#xff1a;下面这些视图都是实时监控生产机上数据库的情况查询结果每个时刻都随数据库系统当时的情况在变化 &#xff08;1&#xff09; selectopname,…

从前端框架到前端架构参考资料

参考资料 • Wiki - MVC https://zh.wikipedia.org/wiki/MVC • Wiki - MVVM https://zh.wikipedia.org/wiki/MVVM • Mustach https://github.com/janl/mustache.js#usage • Handlebars Introduction | Handlebars • React React – A JavaScript library for building us…

(转)(c#)数据结构与算法分析 --树

树 首先&#xff0c;在win下&#xff0c;进入命令行&#xff0c;输入tree&#xff0c;它会以树的形式返回当前文件夹下的所有子文件夹及文件。如上图&#xff0c;就是一个树。就像一棵被颠倒过来的苹果树&#xff0c;每一个元素称之为节点&#xff0c;如图&#xff0c;A就是这棵…

.vimrc文件

1 set number 2 set shiftwidth4 3 set softtabstop4 4 set tabstop4 5 set expandtab 6 "set hlsearch 7 set noerrorbells 8 set smartindent 9 set autoindent 10 set nobackup 11 syntax on 12 filetype on 13 filetype plugin on 14 filetype indent on转载于:https:…

Javascript中undefined,NaN等特殊比较

以下内容转自&#xff1a;http://blog.csdn.net/hongweigg/article/details/380900931、问题&#xff1a;在Javascript中&#xff0c;typeof(undefined) undefined成立吗&#xff1f; 答案&#xff1a;不成立&#xff0c;全局函数 typeof()返回值类型为字符串类型&#xff0c;…

ECMAScript 6 模板字面量的常见用法

模板字面量可以理解成是字符串的一种&#xff0c;形式上用反引号 将内容括起来。 目录 特点一&#xff1a;模板字面量会保留反引号内部的空格、回车、tab,会将\n,\t翻译。 特点二&#xff1a;支持字符串插值 特点三&#xff1a;和标签函数搭配食用 特点一&#xff1a;模板…

Pycharm去掉项目所有 # 注释

通过快捷键ctrlshiftR 进入 项目全局替换窗口&#xff0c;点击右上角 勾选正则&#xff0c;然后 搜索框输入 (#.*) 即可 &#xff0c;然后点击 replace all 去掉所有注释 转载于:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_890days.html

引擎设计跟踪(九.14.2i) Android GLES 3.0 完善

最近把渲染设备对应的GLES的API填上了. 主要有IRenderDevice/IShader/ITexture/IGraphicsResourceManager/IIndexBuffer/IVertexBuffer.都是体力活, 根据文档(https://www.khronos.org/opengles/sdk/docs/man3/)填上对应的API就可了.遇到的问题纪录在下面: Stick to the standa…

NUnit在VS2008中的安装使用

声明&#xff1a;在方法二中图片可以显示不完整&#xff0c;读者可以将图片保存到本地查看。看完再删除了。方法一为转载的。方法二是自己写的。 方法一、 1、从NUnit官网&#xff08;http://www.nunit.org/index.php&#xff09;下载最新版本NUnit&#xff0c;当前版本为NUnit…

Egg 初学笔记

egg是什么 egg.js简称egg&#xff0c;属于小而美的框架&#xff0c;不直接提供功能&#xff0c;它拥有强大的插件机制&#xff0c;扩展性好&#xff0c;egg基于koa(https://eggjs.org/zh-cn/intro/egg-and-koa.html)开发&#xff0c;可基于egg制定上层框架。 Koa特点 提供很好…

HttpModule与HttpHandler详解

ASP.NET对请求处理的过程&#xff1a;当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll会通过http管道&…

《梦断代码Dreaming In Code》阅读笔记(三)

最后这几章感觉上更多是从软件完成整体上来讲的。比如说技术、方法等。 在我看来&#xff0c;其实一个团队一直坚持一种好的、先进的方法是不可少的。如果一个优秀的团队刚愎自用&#xff0c;只随着成员们喜好发展&#xff0c;那不能长久。比如说&#xff0c;在开发软件工程课程…

个人建议之PHP面试的准备

你好&#xff0c;是我琉忆——PHP程序员面试笔试系列图书的作者。 随着越来越多的人开始迈入PHP开发工程师的队列&#xff0c;不管是一个PHP新手还是一个有一两年开发经验的PHPer都不得不去面对找工作前面试这件事。 我现在以个人对面试的经历和见解来全面的对PHP面试考点PHP真…

关于2D互动技术的一些要点

没有动画的程序很难称作是互动产品。 2D图形技术主要涵盖 动画原理 动画是定时器改变元素属性&#xff0c;渲染引擎重新渲染的过程。 动画的本质是 关于时间的函数 PS:右图就是一个快进慢出的动画 动画的要素

Xamarin开发Anroid应用介绍

第1章 Xamarin开发Anroid应用介绍 如今智能手机已经盛行了好几年&#xff0c;而针对这些智能手机的软件开发也变得异常火热。但是在Android平台下只能使用Java开发&#xff0c;iOS平台下也只能使用Objective-C或Swift开发本文选自Xamarin Android开发实战上册。 对于那些C#程序…

忘记Rxjava吧,你应该试试Kotlin的协程

0.前言 协程以前一直是Kotlin作为实验性的一个库&#xff0c;前些日子发现1.3版本的kotlin relese了协程&#xff0c;所以就找时间研究了一下&#xff0c;本来早就想写这篇文章了&#xff0c;但是因为离职换工作的原因&#xff0c;迟迟未能动笔&#xff0c;这两天终于算搞完了&…

数据可视化相关网站

D3 gallery Gallery / D3 / Observable Flowing Data / NYTimes / … FlowingData | Data Visualization and Statistics Data Video Explorer Data Video Explorer 配色网站 配色网站 Material Design Color, Flat Colors, Icons, Color Palette | Material UI Colo…

【2012天津区域赛】部分题解 hdu4431—4441

1001&#xff1a; 题意&#xff1a;给你13张麻将牌&#xff0c;问可以胡哪些张 思路&#xff1a; 枚举可能接到的牌&#xff0c;然后dfs判断能否胡 1002&#xff1a; 题意&#xff1a; 已知n&#xff0c;m 求 n的所有约数在m进制下的平方和 做法&#xff1a;队长用java高精度写…

彻底理解OkHttp - OkHttp 源码解析及OkHttp的设计思想

OkHttp 现在统治了Android的网络请求领域&#xff0c;最常用的框架是&#xff1a;Retrofitokhttp。OkHttp的实现原理和设计思想是必须要了解的&#xff0c;读懂和理解流行的框架也是程序员进阶的必经之路&#xff0c;代码和语言只是工具&#xff0c;重要的是思想。 在OKhttp 源…

访问 Microsoft SQL Server 元数据的三种

上海微创软件有限公司 肖桂东适用读者&#xff1a;Microsoft SQL Server 中、高级用户元数据简介元数据 (metadata) 最常见的定义为"有关数据的结构数据"&#xff0c;或者再简单一点就是"关于数据的信息"&#xff0c;日常生活中的图例、图书馆目录卡和名片…

apply()智用:需要几个参数但只有一个参数数组

比奇堡的居民海绵宝宝&#xff0c;派大星&#xff0c;蟹老板正在开party let arr [SpongeBob,Patrick,Mr.Crab]; 如果章鱼哥来了&#xff0c;珊迪也来了 arr.push(Squidward Tentacles,Sandy); 此时一共派对有5人 如果章鱼哥和珊迪一起来了 arr.push.apply(arr,[Squidwar…