首先大家可以看一下这个鱼的图案

一.前期准备

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类看作图片即可
自定义ViewDrawable区别不大,主要是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开始搞一个锦鲤游动——画锦鲤相关推荐

  1. AGP7.0|kts 搞一个加固插件

    每次都要手动使用工具去手动加固,非常麻烦,所以自己搞一个加固插件来提高生产力 开发环境使用的AGP7.0.2 ,相比较之前的版本,改动还是蛮大的,自己也踩了不少坑. 更多AGP7.0的内容可以关注一下 ...

  2. 从0开始搞一个锦鲤游动——动起来

    上一篇文章主要讲了如何绘制一条锦鲤,而今天这篇文章,就讲如何让我们的锦鲤动起来.这次需要写一些比较复杂的算法,与数学关系很大,个别地方可能难以理解.不过大家可以多看两遍仔细斟酌,如果还是不理解的话可以 ...

  3. ASP.NET2.0轻松搞定统计图表【月儿原创】

    ASP.NET2.0轻松搞定统计图表 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.3.27 本文讲述如何绘制条形图,折线图, ...

  4. HTML5开发 页游/手游动画及游戏系列教程(Game Tutorial):(一)物体动起来吧

    前言 所谓高手,也就是熟悉别人制定的游戏规则.并且能在规则内跳舞的人.(随笔,转自王哲的博客) 09年的时候,为了跳槽和兴趣,转型游戏行业,因此去网上找资料学习各种游戏相关的资料.也是缘分吧,看到了深 ...

  5. Tensorflow搞一个聊天机器人

     Tensorflow搞一个聊天机器人 catalogue 0. 前言 1. 训练语料库 2. 数据预处理 3. 词汇转向量 4. 训练 5. 聊天机器人 - 验证效果 0. 前言 不是搞机器学习 ...

  6. 从 0 开始搭建一个技术博客,私藏干货~

    2019独角兽企业重金招聘Python工程师标准>>> 技术博客的选型有很多种,如:博客园.CSDN.开源中国.简书.知乎等--都可以用来写文章,形成自己的技术博客. 上面的博客都是 ...

  7. Java //PP2.16编写一个applet,画出北斗七星,并在夜空中添加一些其他的星星

    Java程序设计教程(第七版) John Lewis & William Loftus 电子工业出版社 PP2.16编写一个applet,画出北斗七星,并在夜空中添加一些其他的星星. 注意: ...

  8. 位于东京丰洲“可在水中穿行的展览馆”teamLab Planets现已成为秋季展览空间。水面游动的锦鲤碰到参观者后会变成秋叶。

    在限定期间内,联营餐厅供应用直接从丰洲市场采购的鲜鱼制作的热门美食. 东京--(美国商业资讯)--艺术团体teamLab位于东京丰洲"可在水中穿行的展览馆"teamLab Plan ...

  9. 从‘0’开始完成一个阻抗分析仪(初篇——原理讲解)

    这是一个卑微电子信息学员的开始 哦 现在是通信 4月5日工作记录 这是学习stm32的第n天 卑微通信学员开始了stm32的学习过程. 从'0'开始完成一个阻抗分析仪 怎么说呢,这种东西会者不难 不会 ...

最新文章

  1. SQL2000中默认sa帐号改名和删除的最安全方法
  2. ios label文字行间距_iOS- 设置label的行间距字体间距
  3. SQL server USE GO语句学习总结
  4. 【解决办法】C++2015安装不上,说是要安装Windows6.1-KB2999226-x64.msu这个补丁,下载下来怎么安装!...
  5. 一、vmware的安装
  6. php 网页加背景音乐,网站背景音乐实现方法_HTML/Xhtml_网页制作
  7. 混合线性模型学习笔记2
  8. Keil 5(C51, MDK) 官方下载方法
  9. linux桌面只运行浏览器,4个Linux桌面上的轻量级图像浏览器
  10. 机器学习的L1、L2损失函数
  11. 多媒体-用windows自带录音机录音(转载)
  12. k8s pod 详述
  13. latex 公式编号的自定义
  14. 时间戳转换成字符串,返回Invalid Date(自己遇到的坑)
  15. Python爬虫获取代理ip及端口
  16. 【练习】面向对象系列(002)——双色球
  17. Accurate, Dense, and Robust Multi-View Stereopsis论文分析与代码实现(一)
  18. 五家共井 穷举法_第5讲地图着色问题.ppt
  19. java遍历map(java遍历map的key)
  20. 还在为找不到好看的图标发愁?阿里巴巴矢量图标库全部免费下载

热门文章

  1. 进销存管理之盘点流程
  2. 如何用python计算年龄_计算python中的年龄
  3. Vue项目草料二维码使用失效
  4. VScode 侧栏的资源管理器字体太小,怎么设置?
  5. 视频号如何选品进行分享?
  6. 嵌入式linux中内核,嵌入式Linux研究-对几种典型的系统的内核配置方案
  7. spring boot 项目中遇到的错误(tomcat 400)
  8. 不是走投无路,千万别去创业小公司!把大厂经验和方法带过去,实现业绩增长后,老板开始嫌弃和PUA我!...
  9. HTML5+CSS3学习笔记3
  10. 2023全球最佳医院榜单及简要介绍