从0开始搞一个锦鲤游动——画锦鲤
首先大家可以看一下这个鱼的图案
一.前期准备
1.新建一个项目
2.将MainActivity的XML文件写成
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ImageViewandroid:id="@+id/iv_fish"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"/>
</RelativeLayout>
相当于我们后面只是对ImageView
进行涂画
3.新建fishDrawable类,继承Drawable
不用多想,就把fishDrawable
类看作图片即可
自定义View
和Drawable
区别不大,主要是Drawable
使用起来更简单一些
public class fishDrawable extends Drawable {@Overridepublic void draw(@NonNull Canvas canvas) {}@Overridepublic void setAlpha(int alpha) {}@Overridepublic void setColorFilter(@Nullable ColorFilter colorFilter) {}@Overridepublic int getOpacity() {return 0;}
}
4.在MainActivity中将ImageView控件与fishDrawable类进行关联
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//建立关联ImageView fishView = findViewById(R.id.iv_fish);fishView.setImageDrawable(new fishDrawable());}
}
二.具体实操
参考比例
分解图
注意:由于代码添加并不是非常的规律,所以有时可能会忽略非常小一部分代码。但是大家不用担心,在这篇文章的最后我会把完整代码展示,并且会将项目上传到github,并给出链接
1.其余三个方法进行套公式
除了draw
,其余三个方法都是比较固定的写法
2.新增两个方法,固定大小
细心的朋友们可能发现了,我们一开始在XML
中设置ImageView
的大小的时候都是Wrap_Content
,那总得固定一个默认大小吧,所以这两个方法就用上了
(HEAD_RADIUS
为鱼头的圆的半径)
3.进行一些初始化
public class fishDrawable extends Drawable {//创建路径和画笔private Path mPath;private Paint mPaint;//设置画笔的透明度private int OTHER_ALPHA = 110;//设置鱼头的圆的大小private float HEAD_RADIUS = 100;fishDrawable(){init();}//初始化private void init() {mPath = new Path();mPaint = new Paint();mPaint.setStyle(Paint.Style.FILL);//抗锯齿mPaint.setAntiAlias(true);//防抖动mPaint.setDither(true);//设置颜色mPaint.setARGB(OTHER_ALPHA,244,92,71);}@Overridepublic void draw(@NonNull Canvas canvas) {}//下面三个方法一般为固定写法@Overridepublic void setAlpha(int alpha) {mPaint.setAlpha(alpha);}@Overridepublic void setColorFilter(@Nullable ColorFilter colorFilter) {mPaint.setColorFilter(colorFilter);}@Overridepublic int getOpacity() {return PixelFormat.TRANSLUCENT;}@Overridepublic int getIntrinsicWidth() {//设置宽度return (int) (8.38 * HEAD_RADIUS);}@Overridepublic int getIntrinsicHeight() {//设置高度return (int) (8.38 * HEAD_RADIUS);}
}
4.确定鱼的重心(PointF)
这里我们中心和重心就不进行区分了,就通俗理解为鱼的中心点那个位置。鱼头的中心点是以鱼中心点为参考进行绘制的。
//保存鱼的重心private PointF middlePoint;fishDrawable(){init();}//初始化private void init() {mPath = new Path();mPaint = new Paint();mPaint.setStyle(Paint.Style.FILL);//抗锯齿mPaint.setAntiAlias(true);//防抖动mPaint.setDither(true);//设置颜色mPaint.setARGB(OTHER_ALPHA,244,92,71);//确定鱼的重心middlePoint = new PointF(4.19f * HEAD_RADIUS,4.19F * HEAD_RADIUS);}
5.写出核心求坐标算法
此算法为后面所有算法的基础。利用数学知识,此算法的思想是,
- 根据一个点的坐标,以及另外一个点到这个点的连线与X轴夹角,以及这条连线的长度,求出另外一个点的坐标。(数学知识,三角函数)
可能光说就有些抽象,我们看下面的图
比如我们知道a点,知道ab这条直线的长度,知道角α的大小,就可以求出b点的坐标。这样说大家应该就理解了。
比如这里面求b的坐标
b点的横坐标就是
a.x+ab*cosα
b点的纵坐标就是
a.y+ab*sinα
OK,知道了原理,我们就开始写这个算法
private PointF calculatePoint(PointF startPoint,float length,float angle){//x坐标的一部分float deltaX = (float) (Math.cos(Math.toRadians(angle))*length);//y坐标的一部分float deltaY = (float) Math.sin(Math.toRadians(angle - 180))*length;return new PointF(startPoint.x + deltaX,startPoint.y + deltaY);}
注意:
①Math.toRadians
是把角度换算为弧度,因为Math.sin/cos
的参数是接收弧度的。
②由于安卓坐标系和数学坐标系的y轴正好相反,所以这里的求y坐标时要-180
度,以达到正好相反的效果
6.利用鱼中心坐标计算鱼头圆心坐标
@Overridepublic void draw(@NonNull Canvas canvas) {//鱼的朝向float fishAngle = fishMainAngle;//计算鱼头的圆心坐标PointF headPoint = calculatePoint(middlePoint,BODY_RADIUS/2,fishAngle);//画鱼头的圆canvas.drawCircle(headPoint.x,headPoint.y,HEAD_RADIUS,mPaint);}
效果如下
7.画鱼鳍
//设置鱼鳍边界点和鱼头中心点的距离private float FIND_FINS_LENGTH = 0.9f * HEAD_RADIUS;//鱼鳍长度private float FINS_LENGTH = 1.3f * HEAD_RADIUS;@Overridepublic void draw(@NonNull Canvas canvas) {//画右鱼鳍PointF rightFinsPoint = calculatePoint(headPoint,FIND_FINS_LENGTH,fishAngle - 100);makeFins(canvas,rightFinsPoint,fishAngle,true);//画左鱼鳍PointF leftFinsPoint = calculatePoint(headPoint,FIND_FINS_LENGTH,fishAngle + 100);makeFins(canvas,leftFinsPoint,fishAngle,false);}
画鱼鳍的算法
private void makeFins(Canvas canvas, PointF startFinsPoint, float fishAngle,boolean isRight) {//设置二阶贝塞尔曲线控制点的角度float controlAngle = 110;//通过看示意图得知,它要比上面那个110要大//求出右鱼鳍终点的坐标点PointF endFinsPoint = calculatePoint(startFinsPoint,FINS_LENGTH,fishAngle - 180);//求出控制点的坐标PointF controlPoint = calculatePoint(startFinsPoint,FINS_LENGTH * 1.8f,isRight ? fishAngle - controlAngle : fishAngle + controlAngle);//画线mPath.reset();//首先别忘了resetmPath.moveTo(startFinsPoint.x,startFinsPoint.y);mPath.quadTo(controlPoint.x,controlPoint.y,endFinsPoint.x,endFinsPoint.y);canvas.drawPath(mPath,mPaint);
}
效果
8.画鱼节肢
//大圆的半径private float BIG_CIRCLE_RADIUS = 0.7f * HEAD_RADIUS;//中圆的半径private float MIDDLE_CIRCLE_RADIUS = 0.6f * BIG_CIRCLE_RADIUS;//小圆的半径private float SMALL_CIRCLE_RADIUS = 0.4f * MIDDLE_CIRCLE_RADIUS;//寻找尾部中圆圆心的线长private final float FIND_MIDDLE_CIRCLE_LENGTH = BIG_CIRCLE_RADIUS * (0.6f + 1);//寻找尾部小圆圆心的线长private final float FIND_SMALL_CIRCLE_LENGTH = MIDDLE_CIRCLE_RADIUS * (0.4f + 2.7f);@Overridepublic void draw(@NonNull Canvas canvas) {//画节肢1//首先找到鱼身体底部的中心点PointF bodyBottomCenterPoint = calculatePoint(headPoint,BODY_LENGTH,fishAngle-180);PointF middleCirclePoint = makeSegment(canvas,bodyBottomCenterPoint,MIDDLE_CIRCLE_RADIUS,BIG_CIRCLE_RADIUS,FIND_MIDDLE_CIRCLE_LENGTH,fishAngle,true);//画节肢2makeSegment(canvas,middleCirclePoint,SMALL_CIRCLE_RADIUS,MIDDLE_CIRCLE_RADIUS,FIND_SMALL_CIRCLE_LENGTH,fishAngle,false);}
画节肢算法
private PointF makeSegment(Canvas canvas, PointF bottomCenterPoint,float smallRadius,float bigRadius,float findSmallCircleLength, float fishAngle,boolean hasBigCircle) {//根据梯形下底中心点的坐标,求出上底中心点的坐标PointF upperCenterPoint = calculatePoint(bottomCenterPoint,findSmallCircleLength,fishAngle-180);//求出梯形四个顶点的坐标PointF bottomLeftPoint = calculatePoint(bottomCenterPoint,bigRadius,fishAngle + 90);PointF bottomRightPoint = calculatePoint(bottomCenterPoint,bigRadius,fishAngle - 90);PointF upperLeftPoint = calculatePoint(upperCenterPoint,smallRadius,fishAngle + 90);PointF upperRightPoint = calculatePoint(upperCenterPoint,smallRadius,fishAngle - 90);//画大圆和中圆//大圆只有在节肢1的时候才会画if(hasBigCircle){canvas.drawCircle(bottomCenterPoint.x,bottomCenterPoint.y, bigRadius,mPaint);}canvas.drawCircle(upperCenterPoint.x,upperCenterPoint.y,smallRadius,mPaint);//画梯形mPath.reset();mPath.moveTo(bottomLeftPoint.x,bottomLeftPoint.y);mPath.lineTo(bottomRightPoint.x,bottomRightPoint.y);mPath.lineTo(upperRightPoint.x,upperRightPoint.y);mPath.lineTo(upperLeftPoint.x,upperLeftPoint.y);canvas.drawPath(mPath,mPaint);//将中圆的圆心坐标返回return upperCenterPoint;}
效果展示
9.画底边三角形
//寻找大三角形底边中心点的线长
private final float FIND_TRIANGLE_LENGTH = MIDDLE_CIRCLE_RADIUS * 2.7f;
//画底边三角形
@Override
public void draw(@NonNull Canvas canvas) {//画底边三角形
makeTriangle(canvas,middleCirclePoint,FIND_TRIANGLE_LENGTH,BIG_CIRCLE_RADIUS,fishAngle);
makeTriangle(canvas,middleCirclePoint,FIND_TRIANGLE_LENGTH-20,BIG_CIRCLE_RADIUS - 10,fishAngle);
}
画三角形的算法
private void makeTriangle(Canvas canvas, PointF middleCirclePoint, float findCenterLength,float halfFdge,float fishAngle) {//首先得到三角形底边中点坐标PointF triangleBottomPoint = calculatePoint(middleCirclePoint,findCenterLength,fishAngle + 180);//然后计算三角形各个顶点的坐标PointF leftPoint = calculatePoint(triangleBottomPoint,halfFdge,fishAngle + 90);PointF rightPoint = calculatePoint(triangleBottomPoint,halfFdge,fishAngle - 90);//画线mPath.reset();mPath.moveTo(middleCirclePoint.x,middleCirclePoint.y);mPath.lineTo(leftPoint.x,leftPoint.y);mPath.lineTo(rightPoint.x,rightPoint.y);canvas.drawPath(mPath,mPaint);
}
效果展示
10.画身体
@Overridepublic void draw(@NonNull Canvas canvas) {//画身体makeBody(canvas,headPoint,bodyBottomCenterPoint,fishAngle);}
画身体的算法
private void makeBody(Canvas canvas, PointF headPoint, PointF bodyBottomCenterPoint, float fishAngle) {//首先得到身体的四个顶点PointF topLeftPoint = calculatePoint(headPoint,HEAD_RADIUS,fishAngle + 90);PointF topRightPoint = calculatePoint(headPoint,HEAD_RADIUS,fishAngle - 90);PointF bottomLeftPoint = calculatePoint(bodyBottomCenterPoint,BIG_CIRCLE_RADIUS,fishAngle + 90);PointF bottomRightPoint = calculatePoint(bodyBottomCenterPoint,BIG_CIRCLE_RADIUS,fishAngle - 90);//然后得到控制点的坐标PointF controlLeft = calculatePoint(headPoint,BODY_LENGTH*0.56F,fishAngle + 130);PointF controlRight = calculatePoint(headPoint,BODY_LENGTH*0.56F,fishAngle - 130);mPath.reset();mPath.moveTo(topLeftPoint.x,topLeftPoint.y);mPath.lineTo(topRightPoint.x,topRightPoint.y);mPath.quadTo(controlRight.x,controlRight.y,bottomRightPoint.x,bottomRightPoint.y);mPath.lineTo(bottomLeftPoint.x,bottomLeftPoint.y);mPath.quadTo(controlLeft.x,controlLeft.y,topLeftPoint.x,topLeftPoint.y);canvas.drawPath(mPath,mPaint);
}
效果展示
全部代码
public class fishDrawable extends Drawable {//创建路径和画笔private Path mPath;private Paint mPaint;//设置画笔的透明度private int OTHER_ALPHA = 110;//保存鱼的重心private PointF middlePoint;//设置鱼的主要角度,与X轴的夹角private float fishMainAngle = 0;/*** 与鱼的长度有关的所有值*///设置鱼头的圆的大小private float HEAD_RADIUS = 100f;//设置鱼身的大小private float BODY_LENGTH = 3.2f*HEAD_RADIUS;//设置鱼鳍边界点和鱼头中心点的距离private float FIND_FINS_LENGTH = 0.9f * HEAD_RADIUS;//鱼鳍长度private float FINS_LENGTH = 1.3f * HEAD_RADIUS;//大圆的半径private float BIG_CIRCLE_RADIUS = 0.7f * HEAD_RADIUS;//中圆的半径private float MIDDLE_CIRCLE_RADIUS = 0.6f * BIG_CIRCLE_RADIUS;//小圆的半径private float SMALL_CIRCLE_RADIUS = 0.4f * MIDDLE_CIRCLE_RADIUS;//寻找尾部中圆圆心的线长private final float FIND_MIDDLE_CIRCLE_LENGTH = BIG_CIRCLE_RADIUS * (0.6f + 1);//寻找尾部小圆圆心的线长private final float FIND_SMALL_CIRCLE_LENGTH = MIDDLE_CIRCLE_RADIUS * (0.4f + 2.7f);//寻找大三角形底边中心点的线长private final float FIND_TRIANGLE_LENGTH = MIDDLE_CIRCLE_RADIUS * 2.7f;fishDrawable(){init();}//初始化private void init() {mPath = new Path();mPaint = new Paint();mPaint.setStyle(Paint.Style.FILL);//抗锯齿mPaint.setAntiAlias(true);//防抖动mPaint.setDither(true);//设置颜色mPaint.setARGB(OTHER_ALPHA,244,92,71);middlePoint = new PointF(4.19f * HEAD_RADIUS,4.19F * HEAD_RADIUS);}@Overridepublic void draw(@NonNull Canvas canvas) {//鱼的朝向float fishAngle = fishMainAngle;//计算鱼头的圆心坐标PointF headPoint = calculatePoint(middlePoint,BODY_LENGTH/2,fishAngle);//画鱼头的圆canvas.drawCircle(headPoint.x,headPoint.y,HEAD_RADIUS,mPaint);//画右鱼鳍PointF rightFinsPoint = calculatePoint(headPoint,FIND_FINS_LENGTH,fishAngle - 100);makeFins(canvas,rightFinsPoint,fishAngle,true);//画左鱼鳍PointF leftFinsPoint = calculatePoint(headPoint,FIND_FINS_LENGTH,fishAngle + 100);makeFins(canvas,leftFinsPoint,fishAngle,false);//画节肢1//首先找到鱼身体底部的中心点PointF bodyBottomCenterPoint = calculatePoint(headPoint,BODY_LENGTH,fishAngle-180);PointF middleCirclePoint = makeSegment(canvas,bodyBottomCenterPoint,MIDDLE_CIRCLE_RADIUS,BIG_CIRCLE_RADIUS,FIND_MIDDLE_CIRCLE_LENGTH,fishAngle,true);//画节肢2makeSegment(canvas,middleCirclePoint,SMALL_CIRCLE_RADIUS,MIDDLE_CIRCLE_RADIUS,FIND_SMALL_CIRCLE_LENGTH,fishAngle,false);//画底边三角形makeTriangle(canvas,middleCirclePoint,FIND_TRIANGLE_LENGTH,BIG_CIRCLE_RADIUS,fishAngle);makeTriangle(canvas,middleCirclePoint,FIND_TRIANGLE_LENGTH-20,BIG_CIRCLE_RADIUS - 10,fishAngle);//画身体makeBody(canvas,headPoint,bodyBottomCenterPoint,fishAngle);}private void makeBody(Canvas canvas, PointF headPoint, PointF bodyBottomCenterPoint, float fishAngle) {//首先得到身体的四个顶点PointF topLeftPoint = calculatePoint(headPoint,HEAD_RADIUS,fishAngle + 90);PointF topRightPoint = calculatePoint(headPoint,HEAD_RADIUS,fishAngle - 90);PointF bottomLeftPoint = calculatePoint(bodyBottomCenterPoint,BIG_CIRCLE_RADIUS,fishAngle + 90);PointF bottomRightPoint = calculatePoint(bodyBottomCenterPoint,BIG_CIRCLE_RADIUS,fishAngle - 90);//然后得到控制点的坐标PointF controlLeft = calculatePoint(headPoint,BODY_LENGTH*0.56F,fishAngle + 130);PointF controlRight = calculatePoint(headPoint,BODY_LENGTH*0.56F,fishAngle - 130);mPath.reset();mPath.moveTo(topLeftPoint.x,topLeftPoint.y);mPath.lineTo(topRightPoint.x,topRightPoint.y);mPath.quadTo(controlRight.x,controlRight.y,bottomRightPoint.x,bottomRightPoint.y);mPath.lineTo(bottomLeftPoint.x,bottomLeftPoint.y);mPath.quadTo(controlLeft.x,controlLeft.y,topLeftPoint.x,topLeftPoint.y);canvas.drawPath(mPath,mPaint);}private void makeTriangle(Canvas canvas, PointF middleCirclePoint, float findCenterLength,float halfFdge,float fishAngle) {//首先得到三角形底边中点坐标PointF triangleBottomPoint = calculatePoint(middleCirclePoint,findCenterLength,fishAngle + 180);//然后计算三角形各个顶点的坐标PointF leftPoint = calculatePoint(triangleBottomPoint,halfFdge,fishAngle + 90);PointF rightPoint = calculatePoint(triangleBottomPoint,halfFdge,fishAngle - 90);//画线mPath.reset();mPath.moveTo(middleCirclePoint.x,middleCirclePoint.y);mPath.lineTo(leftPoint.x,leftPoint.y);mPath.lineTo(rightPoint.x,rightPoint.y);canvas.drawPath(mPath,mPaint);}private PointF makeSegment(Canvas canvas, PointF bottomCenterPoint,float smallRadius,float bigRadius,float findSmallCircleLength, float fishAngle,boolean hasBigCircle) {//根据梯形下底中心点的坐标,求出上底中心点的坐标PointF upperCenterPoint = calculatePoint(bottomCenterPoint,findSmallCircleLength,fishAngle-180);//求出梯形四个顶点的坐标PointF bottomLeftPoint = calculatePoint(bottomCenterPoint,bigRadius,fishAngle + 90);PointF bottomRightPoint = calculatePoint(bottomCenterPoint,bigRadius,fishAngle - 90);PointF upperLeftPoint = calculatePoint(upperCenterPoint,smallRadius,fishAngle + 90);PointF upperRightPoint = calculatePoint(upperCenterPoint,smallRadius,fishAngle - 90);//画大圆和中圆//大圆只有在节肢1的时候才会画if(hasBigCircle){canvas.drawCircle(bottomCenterPoint.x,bottomCenterPoint.y, bigRadius,mPaint);}canvas.drawCircle(upperCenterPoint.x,upperCenterPoint.y,smallRadius,mPaint);//画梯形mPath.reset();mPath.moveTo(bottomLeftPoint.x,bottomLeftPoint.y);mPath.lineTo(bottomRightPoint.x,bottomRightPoint.y);mPath.lineTo(upperRightPoint.x,upperRightPoint.y);mPath.lineTo(upperLeftPoint.x,upperLeftPoint.y);canvas.drawPath(mPath,mPaint);//将中圆的圆心坐标返回return upperCenterPoint;}private void makeFins(Canvas canvas, PointF startFinsPoint, float fishAngle,boolean isRight) {//设置二阶贝塞尔曲线控制点的角度float controlAngle = 110;//通过看示意图得知,它要比上面那个110要大//求出右鱼鳍终点的坐标点PointF endFinsPoint = calculatePoint(startFinsPoint,FINS_LENGTH,fishAngle - 180);//求出控制点的坐标PointF controlPoint = calculatePoint(startFinsPoint,FINS_LENGTH * 1.8f,isRight ? fishAngle - controlAngle : fishAngle + controlAngle);//画线mPath.reset();//首先别忘了resetmPath.moveTo(startFinsPoint.x,startFinsPoint.y);mPath.quadTo(controlPoint.x,controlPoint.y,endFinsPoint.x,endFinsPoint.y);canvas.drawPath(mPath,mPaint);}private PointF calculatePoint(PointF startPoint,float length,float angle){//x坐标的一部分float deltaX = (float) (Math.cos(Math.toRadians(angle))*length);//y坐标的一部分float deltaY = (float) Math.sin(Math.toRadians(angle - 180))*length;return new PointF(startPoint.x + deltaX,startPoint.y + deltaY);}//下面三个方法一般为固定写法@Overridepublic void setAlpha(int alpha) {mPaint.setAlpha(alpha);}@Overridepublic void setColorFilter(@Nullable ColorFilter colorFilter) {mPaint.setColorFilter(colorFilter);}@Overridepublic int getOpacity() {return PixelFormat.TRANSLUCENT;}//设置宽度和高度@Overridepublic int getIntrinsicWidth() {return (int) (8.38 * HEAD_RADIUS);}@Overridepublic int getIntrinsicHeight() {return (int) (8.38 * HEAD_RADIUS);}
}
三.总结
感觉逻辑上并没有什么难度,难的在于点与点之间长度大小的确定和度数的确定。这个需要不断的去调试来看效果。我这边就直接给出现成的结果了。
再一个是从画各种身体部位的算法中,要学会一些设计算法的思想。比如要提高方法的复用性,可以加一个boolean
型的参数,如果是右肢就传入true
,进行相关操作,如果是左肢就传入false
,然后再进行相关操作。而进行的这个相关操作很多都是一样的,不一样的地方就是靠这个boolean
值来进行区分的。
从0开始搞一个锦鲤游动——画锦鲤相关推荐
- AGP7.0|kts 搞一个加固插件
每次都要手动使用工具去手动加固,非常麻烦,所以自己搞一个加固插件来提高生产力 开发环境使用的AGP7.0.2 ,相比较之前的版本,改动还是蛮大的,自己也踩了不少坑. 更多AGP7.0的内容可以关注一下 ...
- 从0开始搞一个锦鲤游动——动起来
上一篇文章主要讲了如何绘制一条锦鲤,而今天这篇文章,就讲如何让我们的锦鲤动起来.这次需要写一些比较复杂的算法,与数学关系很大,个别地方可能难以理解.不过大家可以多看两遍仔细斟酌,如果还是不理解的话可以 ...
- ASP.NET2.0轻松搞定统计图表【月儿原创】
ASP.NET2.0轻松搞定统计图表 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.3.27 本文讲述如何绘制条形图,折线图, ...
- HTML5开发 页游/手游动画及游戏系列教程(Game Tutorial):(一)物体动起来吧
前言 所谓高手,也就是熟悉别人制定的游戏规则.并且能在规则内跳舞的人.(随笔,转自王哲的博客) 09年的时候,为了跳槽和兴趣,转型游戏行业,因此去网上找资料学习各种游戏相关的资料.也是缘分吧,看到了深 ...
- Tensorflow搞一个聊天机器人
Tensorflow搞一个聊天机器人 catalogue 0. 前言 1. 训练语料库 2. 数据预处理 3. 词汇转向量 4. 训练 5. 聊天机器人 - 验证效果 0. 前言 不是搞机器学习 ...
- 从 0 开始搭建一个技术博客,私藏干货~
2019独角兽企业重金招聘Python工程师标准>>> 技术博客的选型有很多种,如:博客园.CSDN.开源中国.简书.知乎等--都可以用来写文章,形成自己的技术博客. 上面的博客都是 ...
- Java //PP2.16编写一个applet,画出北斗七星,并在夜空中添加一些其他的星星
Java程序设计教程(第七版) John Lewis & William Loftus 电子工业出版社 PP2.16编写一个applet,画出北斗七星,并在夜空中添加一些其他的星星. 注意: ...
- 位于东京丰洲“可在水中穿行的展览馆”teamLab Planets现已成为秋季展览空间。水面游动的锦鲤碰到参观者后会变成秋叶。
在限定期间内,联营餐厅供应用直接从丰洲市场采购的鲜鱼制作的热门美食. 东京--(美国商业资讯)--艺术团体teamLab位于东京丰洲"可在水中穿行的展览馆"teamLab Plan ...
- 从‘0’开始完成一个阻抗分析仪(初篇——原理讲解)
这是一个卑微电子信息学员的开始 哦 现在是通信 4月5日工作记录 这是学习stm32的第n天 卑微通信学员开始了stm32的学习过程. 从'0'开始完成一个阻抗分析仪 怎么说呢,这种东西会者不难 不会 ...
最新文章
- SQL2000中默认sa帐号改名和删除的最安全方法
- ios label文字行间距_iOS- 设置label的行间距字体间距
- SQL server USE GO语句学习总结
- 【解决办法】C++2015安装不上,说是要安装Windows6.1-KB2999226-x64.msu这个补丁,下载下来怎么安装!...
- 一、vmware的安装
- php 网页加背景音乐,网站背景音乐实现方法_HTML/Xhtml_网页制作
- 混合线性模型学习笔记2
- Keil 5(C51, MDK) 官方下载方法
- linux桌面只运行浏览器,4个Linux桌面上的轻量级图像浏览器
- 机器学习的L1、L2损失函数
- 多媒体-用windows自带录音机录音(转载)
- k8s pod 详述
- latex 公式编号的自定义
- 时间戳转换成字符串,返回Invalid Date(自己遇到的坑)
- Python爬虫获取代理ip及端口
- 【练习】面向对象系列(002)——双色球
- Accurate, Dense, and Robust Multi-View Stereopsis论文分析与代码实现(一)
- 五家共井 穷举法_第5讲地图着色问题.ppt
- java遍历map(java遍历map的key)
- 还在为找不到好看的图标发愁?阿里巴巴矢量图标库全部免费下载