android自定义表盘部件,Android自定义view仿支付宝芝麻信用表盘

演示效果

4b91e2d75a0c

实现步骤:

1.画不同宽度和半径的内外圆弧

2.通过循环旋转canvas,在固定位置绘制短线刻度,长线刻度,刻度文字

3.绘制view中心几个文本,并调整位置

4.实时更新当前旋转角度刷新小圆点位置;

5.判断分数应该坐落的区间,再根据该区间的角度比例获取实际的角度。

6.用ObjectAnimator实现滚动文字

步骤代码讲解:

这里是声明的变量及常量

/** 圆环paint */

private Paint ringPaint;

/** 信用分文字paint */

private Paint scoreTextPaint;

/** 指示器paint */

private Paint dotPaint;

/** 外圆环宽度 */

private int outerRingWidth;

/** 内圆环宽度 */

private int innerRingWidth;

/** 表盘圆环总度数 */

private final int totalAngle = 210;

/** 圆弧上总共刻度数 */

private final int totalDegreeScale = 30;

/** 各分数刻度文本 */

private String[] scores = new String[] {"350", "较差", "550", "中等", "600", "良好", "650", "优秀", "700", "极好", "950"};

/** 信用分数 */

private int score = 715;

/** 当前扫过的数值角度 */

private float curProgressAngle;

/** 动画时长 */

private final long ANIM_DURATION = 2000;

/** 指示器结束时的角度 */

private float stopAngle;

/** 信用评级文字 */

private String creditStr;

绘制外层两个圆弧,以12点钟为圆弧中点,左右各有105°

private void drawRing (Canvas canvas) {

ringPaint.setAlpha(80);

int startAngle = -90-totalAngle/2; //圆环起始角度,12点钟位置为-90°

//绘制外圆环

ringPaint.setStrokeWidth(outerRingWidth);

RectF rectF = new RectF(outerRingWidth, outerRingWidth, getWidth()-outerRingWidth, getHeight()-outerRingWidth);

canvas.drawArc(rectF, startAngle, totalAngle, false, ringPaint);

//绘制内圆环

ringPaint.setStrokeWidth(innerRingWidth);

int padding = outerRingWidth + dp2px(getContext(), 12);

RectF innerRectF = new RectF(padding, padding, getWidth()-padding, getHeight()-padding);

canvas.drawArc(innerRectF, startAngle, totalAngle, false, ringPaint);

}

圆弧上总共有30个小刻度,遍历每隔小刻度,每个小刻度绘制较细的线,每3个刻度绘制一次文本,每6个刻度绘制一次较粗的线,通过旋转画布来实现,以使在同一位置绘制刻度和文本得以实现,最后要恢复画布。

private void drawDegreeScale(Canvas canvas) {

canvas.save();

int padding = dp2px(getContext(), 10);

canvas.rotate(-totalAngle/2, getWidth()/2, getHeight()/2); //将画布逆时间旋转一半弧度,使以左端点为刻度起点

for (int i=0;i<=totalDegreeScale;i++) {

ringPaint.setAlpha(80);

ringPaint.setStrokeWidth(2);

//每一格绘制一个浅色刻度

canvas.drawLine(getWidth()/2, padding, getWidth()/2, padding+innerRingWidth, ringPaint);

ringPaint.setAlpha(100);

ringPaint.setStrokeWidth(3);

//每6格刻度绘制一个深色刻度,即大刻度

if (i%6==0) {

canvas.drawLine(getWidth()/2, padding, getWidth()/2, padding+innerRingWidth+5, ringPaint);

}

//每三格刻度绘制一个文字

if (i%3==0) {

scoreTextPaint.setAlpha(180);

float textWidth = scoreTextPaint.measureText(scores[i/3]); //测量该文本宽度,需向左移动半个文本宽度以对齐

canvas.drawText(scores[i/3], getWidth()/2-textWidth/2, padding+innerRingWidth+dp2px(getContext(), 12), scoreTextPaint);

}

canvas.rotate(totalAngle/totalDegreeScale, getWidth()/2, getHeight()/2); //每次画完从中心开始旋转画布单位刻度的弧度

}

canvas.restore(); //恢复角度

}

绘制中心文本,包括beta,分数,信用评级,评估时间,这个很简单,就是需要获取文本的宽高调节依次垂直居中。

private void drawCenterText(Canvas canvas) {

//绘制当前分数

scoreTextPaint.setAlpha(255);

scoreTextPaint.setTextSize(170);

String curScore = String.valueOf(score);

Rect scoreRect = new Rect();

scoreTextPaint.getTextBounds(curScore, 0, curScore.length(), scoreRect); //需左移文字宽度以居中

canvas.drawText(curScore, getWidth()/2-scoreRect.width()/2, getHeight()/2, scoreTextPaint);

//绘制BETA文字

scoreTextPaint.setAlpha(150);

scoreTextPaint.setTextSize(35);

Rect betaRect= new Rect();

String betaStr = "BETA";

scoreTextPaint.getTextBounds(betaStr, 0, betaStr.length(), betaRect); //beta需向坐上移动

canvas.drawText(betaStr, getWidth()/2-betaRect.width()/2, getHeight()/2-scoreRect.height()-betaRect.height()/2, scoreTextPaint);

//绘制信用等级文本

scoreTextPaint.setAlpha(200);

scoreTextPaint.setTextSize(75);

Rect creditRect = new Rect();

scoreTextPaint.getTextBounds(creditStr, 0, creditStr.length(), creditRect);

canvas.drawText(creditStr, getWidth()/2-creditRect.width()/2, getHeight()/2+scoreRect.height()/2+20, scoreTextPaint);

//绘制评估时间

scoreTextPaint.setAlpha(150);

scoreTextPaint.setTextSize(35);

float timeStrWidth = scoreTextPaint.measureText("评估时间:2020.07.27");

canvas.drawText("评估时间:2020.07.27", getWidth()/2-timeStrWidth/2, getHeight()/2+scoreRect.height()+10, scoreTextPaint);

}

绘制进度动画小圆点:根据属性curProgressAngle的值来绘制指示器小圆点,圆心为中心,小圆点轨迹为圆,由三角函数知识得到坐标轨迹方程。

同时,使用Paint的BlurMaskFilter实现小圆点高斯模糊发光效果,发光模式为Blur.SOLID,内外发光。

private void drawDot(Canvas canvas) {

scoreTextPaint.setAlpha(230);

float x = (float) (getWidth()/2 + (getWidth()/2-outerRingWidth)*Math.sin(Math.toRadians(curProgressAngle)));

float y = (float) (getHeight()/2 - (getWidth()/2-outerRingWidth)*Math.cos(Math.toRadians(curProgressAngle)));

canvas.drawCircle(x, y, outerRingWidth, dotPaint);

}

使用ValueAnimator动画实时更新curProgressAngle并重绘,以实现小圆点实时更新位置实现进度动画。

private void startIndicatorAnim() {

ValueAnimator valueAnimator = ValueAnimator.ofFloat(-105, stopAngle);

valueAnimator.setDuration(ANIM_DURATION);

valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

curProgressAngle = (float) animation.getAnimatedValue();

postInvalidate(); //数值改变实时更新绘制

}

});

valueAnimator.start();

}

根据分数计算小圆点结束时的实际角度:在当前大刻度范围的结束角度,为之前刻度角度加上在该区间按比例得出的角度,30个小刻度共210°,每个小刻度perLevelAngle角度为7°

private String showCreditLevel() {

int startAngle = -105;

int perLevelAngle = totalAngle/5; //有5段大刻度

String creditLevelStr = null;

if (score < 350) {

creditLevelStr = "信用较差";

stopAngle = startAngle;

} else if (score >= 350 && score < 550) {

creditLevelStr = "信用较差";

stopAngle = startAngle + (float)(score-350)/(550-350)*perLevelAngle;

} else if (score >= 550 && score < 600) {

creditLevelStr = "信用中等";

stopAngle = startAngle + perLevelAngle + (float)(score-550)/(600-550)*perLevelAngle;

} else if (score >= 600 && score < 650) {

creditLevelStr = "信用良好";

stopAngle = startAngle + perLevelAngle*2 + (float)(score-600)/(650-600)*perLevelAngle;

} else if (score >= 650 && score < 700) {

creditLevelStr = "信用优秀";

stopAngle = startAngle + perLevelAngle*3 + (float)(score-650)/(700-650)*perLevelAngle;

} else if (score >= 700 && score < 950) {

creditLevelStr = "信用极好";

stopAngle = startAngle + perLevelAngle*4 + (float)(score-700)/(950-700)*perLevelAngle;

}

return creditLevelStr;

}

最后,通过ObjectAnimator实时更新分数。

public void runWithAnimation(int number){

ObjectAnimator objectAnimator = ObjectAnimator.ofInt(this, "score", 0, number);

objectAnimator.setDuration(ANIM_DURATION);

objectAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

objectAnimator.start();

}

最后附上完整代码,喜欢的给个❤️吧。

/**

* create by libo

* create on 2020/7/27

* description 支付宝芝麻信用自定义view

*/

public class SesameCreditView extends View {

/** 圆环paint */

private Paint ringPaint;

/** 信用分文字paint */

private Paint scoreTextPaint;

/** 指示器paint */

private Paint dotPaint;

/** 外圆环宽度 */

private int outerRingWidth;

/** 内圆环宽度 */

private int innerRingWidth;

/** 表盘圆环总度数 */

private final int totalAngle = 210;

/** 圆弧上总共刻度数 */

private final int totalDegreeScale = 30;

/** 各分数刻度文本 */

private String[] scores = new String[] {"350", "较差", "550", "中等", "600", "良好", "650", "优秀", "700", "极好", "950"};

/** 信用分数 */

private int score = 715;

/** 当前扫过的数值角度 */

private float curProgressAngle;

/** 动画时长 */

private final long ANIM_DURATION = 2000;

/** 指示器结束时的角度 */

private float stopAngle;

/** 信用评级文字 */

private String creditStr;

public SesameCreditView(Context context) {

super(context);

init();

}

public SesameCreditView(Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

init();

}

private void init() {

outerRingWidth = dp2px(getContext(), 3);

innerRingWidth = dp2px(getContext(), 10);

ringPaint = new Paint();

ringPaint.setColor(getResources().getColor(R.color.white));

ringPaint.setAntiAlias(true);

ringPaint.setStyle(Paint.Style.STROKE);

scoreTextPaint = new Paint();

scoreTextPaint.setColor(getResources().getColor(R.color.white));

scoreTextPaint.setAntiAlias(true);

scoreTextPaint.setTextSize(32);

dotPaint = new Paint();

dotPaint.setColor(getResources().getColor(R.color.white));

dotPaint.setAntiAlias(true);

dotPaint.setMaskFilter(new BlurMaskFilter(outerRingWidth, BlurMaskFilter.Blur.SOLID)); //设置指示器发光

creditStr = showCreditLevel();

startIndicatorAnim();

runWithAnimation(score);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

drawRing(canvas);

drawDegreeScale(canvas);

drawCenterText(canvas);

drawDot(canvas);

}

/**

* 绘制圆弧

* @param canvas

*/

private void drawRing (Canvas canvas) {

ringPaint.setAlpha(80);

int startAngle = -90-totalAngle/2; //圆环起始角度,12点钟位置为-90°

//绘制外圆环

ringPaint.setStrokeWidth(outerRingWidth);

RectF rectF = new RectF(outerRingWidth, outerRingWidth, getWidth()-outerRingWidth, getHeight()-outerRingWidth);

canvas.drawArc(rectF, startAngle, totalAngle, false, ringPaint);

//绘制内圆环

ringPaint.setStrokeWidth(innerRingWidth);

int padding = outerRingWidth + dp2px(getContext(), 12);

RectF innerRectF = new RectF(padding, padding, getWidth()-padding, getHeight()-padding);

canvas.drawArc(innerRectF, startAngle, totalAngle, false, ringPaint);

}

/**

* 绘制圆环刻度,分数文字

*/

private void drawDegreeScale(Canvas canvas) {

canvas.save();

int padding = dp2px(getContext(), 10);

canvas.rotate(-totalAngle/2, getWidth()/2, getHeight()/2); //将画布逆时间旋转一半弧度,使以左端点为刻度起点

for (int i=0;i<=totalDegreeScale;i++) {

ringPaint.setAlpha(80);

ringPaint.setStrokeWidth(2);

//每一格绘制一个浅色刻度

canvas.drawLine(getWidth()/2, padding, getWidth()/2, padding+innerRingWidth, ringPaint);

ringPaint.setAlpha(100);

ringPaint.setStrokeWidth(3);

//每6格刻度绘制一个深色刻度,即大刻度

if (i%6==0) {

canvas.drawLine(getWidth()/2, padding, getWidth()/2, padding+innerRingWidth+5, ringPaint);

}

//每三格刻度绘制一个文字

if (i%3==0) {

scoreTextPaint.setAlpha(180);

float textWidth = scoreTextPaint.measureText(scores[i/3]); //测量该文本宽度,需向左移动半个文本宽度以对齐

canvas.drawText(scores[i/3], getWidth()/2-textWidth/2, padding+innerRingWidth+dp2px(getContext(), 12), scoreTextPaint);

}

canvas.rotate(totalAngle/totalDegreeScale, getWidth()/2, getHeight()/2); //每次画完从中心开始旋转画布单位刻度的弧度

}

canvas.restore(); //恢复角度

}

/**

* 绘制中心文本

*/

private void drawCenterText(Canvas canvas) {

//绘制当前分数

scoreTextPaint.setAlpha(255);

scoreTextPaint.setTextSize(170);

String curScore = String.valueOf(score);

Rect scoreRect = new Rect();

scoreTextPaint.getTextBounds(curScore, 0, curScore.length(), scoreRect); //需左移文字宽度以居中

canvas.drawText(curScore, getWidth()/2-scoreRect.width()/2, getHeight()/2, scoreTextPaint);

//绘制BETA文字

scoreTextPaint.setAlpha(150);

scoreTextPaint.setTextSize(35);

Rect betaRect= new Rect();

String betaStr = "BETA";

scoreTextPaint.getTextBounds(betaStr, 0, betaStr.length(), betaRect); //beta需向坐上移动

canvas.drawText(betaStr, getWidth()/2-betaRect.width()/2, getHeight()/2-scoreRect.height()-betaRect.height()/2, scoreTextPaint);

//绘制信用等级文本

scoreTextPaint.setAlpha(200);

scoreTextPaint.setTextSize(75);

Rect creditRect = new Rect();

scoreTextPaint.getTextBounds(creditStr, 0, creditStr.length(), creditRect);

canvas.drawText(creditStr, getWidth()/2-creditRect.width()/2, getHeight()/2+scoreRect.height()/2+20, scoreTextPaint);

//绘制评估时间

scoreTextPaint.setAlpha(150);

scoreTextPaint.setTextSize(35);

float timeStrWidth = scoreTextPaint.measureText("评估时间:2020.07.27");

canvas.drawText("评估时间:2020.07.27", getWidth()/2-timeStrWidth/2, getHeight()/2+scoreRect.height()+10, scoreTextPaint);

}

/**

* 绘制进度动画小圆点

*/

private void drawDot(Canvas canvas) {

scoreTextPaint.setAlpha(230);

float x = (float) (getWidth()/2 + (getWidth()/2-outerRingWidth)*Math.sin(Math.toRadians(curProgressAngle)));

float y = (float) (getHeight()/2 - (getWidth()/2-outerRingWidth)*Math.cos(Math.toRadians(curProgressAngle)));

canvas.drawCircle(x, y, outerRingWidth, dotPaint);

}

/**

* 启动指示器加载动画

*/

private void startIndicatorAnim() {

ValueAnimator valueAnimator = ValueAnimator.ofFloat(-105, stopAngle);

valueAnimator.setDuration(ANIM_DURATION);

valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

curProgressAngle = (float) animation.getAnimatedValue();

postInvalidate(); //数值改变实时更新绘制

}

});

valueAnimator.start();

}

/**

* 设置信用水平,每一刻小刻度是7°

* 在当前大刻度范围的结束角度,为之前刻度角度加上在该区间按比例得出的角度

*/

private String showCreditLevel() {

int startAngle = -105;

int perLevelAngle = totalAngle/5; //有5段大刻度

String creditLevelStr = null;

if (score < 350) {

creditLevelStr = "信用较差";

stopAngle = startAngle;

} else if (score >= 350 && score < 550) {

creditLevelStr = "信用较差";

stopAngle = startAngle + (float)(score-350)/(550-350)*perLevelAngle;

} else if (score >= 550 && score < 600) {

creditLevelStr = "信用中等";

stopAngle = startAngle + perLevelAngle + (float)(score-550)/(600-550)*perLevelAngle;

} else if (score >= 600 && score < 650) {

creditLevelStr = "信用良好";

stopAngle = startAngle + perLevelAngle*2 + (float)(score-600)/(650-600)*perLevelAngle;

} else if (score >= 650 && score < 700) {

creditLevelStr = "信用优秀";

stopAngle = startAngle + perLevelAngle*3 + (float)(score-650)/(700-650)*perLevelAngle;

} else if (score >= 700 && score < 950) {

creditLevelStr = "信用极好";

stopAngle = startAngle + perLevelAngle*4 + (float)(score-700)/(950-700)*perLevelAngle;

}

return creditLevelStr;

}

public void runWithAnimation(int number){

ObjectAnimator objectAnimator = ObjectAnimator.ofInt(this, "score", 0, number);

objectAnimator.setDuration(ANIM_DURATION);

objectAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

objectAnimator.start();

}

public int getScore() {

return score;

}

public void setScore(int score) {

this.score = score;

}

private int dp2px(Context context, float dp) {

final float scale = context.getResources().getDisplayMetrics().density;

return (int) (dp * scale + 0.5f);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录的详细操作

拷贝表拷贝结构 与数据create table copy_table select *from customer ;仅拷贝结构create table copy_table select *from customer where 0 > 1;共同点&#xff1a; 索引 描述&#xff08;自增&#xff09; 不能以下语法中记录的详细操作[] 表示可选的{}表示必选的增ins…

linux查看文件有多少行

使用wc命令 具体通过wc --help 可以查看。 如&#xff1a;wc -l filename 就是查看文件里有多少行 wc -w filename 看文件里有多少个word。 wc -L filename 文件里最长的那一行是多少个字。 wc命令 wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。 …

java 消息通知_用Java弹出创建新的消息通知

java 消息通知首先创建JFrame作为弹出窗口。 在其中添加一些JLabel以包含信息&#xff0c;并在适当的位置分配它们&#xff0c;使其看起来像一条通知消息。 下面给出了示例代码&#xff1a; String message You got a new notification message. Isnt it awesome to have suc…

vs android 压缩,Android Studio是否压缩classes.dex文件?

看起来输出文件夹中apk文件的classes.dex与已安装的应用程序不同.我正在使用classes.dex文件来解决一些安全问题,所以通常我解压缩最终的apk文件并从classes.dex文件中获取信息.但是当我在运行时读取classes.dex文件时文件大小是如此不同. (8MB vs 46KB)应用程序本身工作得很好…

自己写的py文件中调用django models

import os os.environ[DJANGO_SETTINGS_MODULE] 项目名.settingsimport djangodjango.setup()from blog import modelsentry models.Entry.objects.get(pk1)tech_blog models.Blog.objects.get(name科技)print(entry, tech_blog) 转载于:https://www.cnblogs.com/dangrui072…

shell脚本 -d 是目录文件,那么-e,-f分别是什么?还有! -e这又是什么意思呢?

shell脚本 -d 是目录文件&#xff0c;那么-e&#xff0c;-f分别是什么?还有"&#xff01; -e"这又是什么意思呢&#xff1f; -e filename 如果 filename存在&#xff0c;则为真 -d filename 如果 filename为目录&#xff0c;则为真 -f filename 如果 filename为常规…

将Java应用程序作为Windows服务安装

这听起来像是您不需要的东西&#xff0c;但是有时候&#xff0c;当您分发最终用户软件时&#xff0c;可能需要将Java程序安装为Windows服务。 我之所以必须这样做&#xff0c;是因为我开发了一种用于公务员的工具 &#xff0c;可以自动将其Excel文件转换并将其推入我国的openda…

怎样实现banner自动播放html,纯CSS3实现banner图片自动轮播效果方式总结

自动轮播&#xff1a;实现切换图片&#xff0c;图片循环播放&#xff1b;鼠标悬停某张图片&#xff0c; 则暂停切换。css方法一、opacity控制透明度实现轮播效果依照需求咱们选择用CSS3的animation动画进行实现&#xff1b;transition动画须要触发才能启动&#xff0c;html因此…

你好a+b(非入门)

题目传送门&#xff1a;https://www.nowcoder.com/acm/contest/165/A来源&#xff1a;牛客网 牛牛刚学习了输入输出&#xff0c;他遇到了一道这样的题目。 输入2个整数a和b保证输入的a和b在long long范围之内&#xff0c;即满足-9223372036854775808 < a, b < 9223372036…

/etc/sysconfig/i18n文件详解

编辑/etc/sysconfig/i18n这个文件&#xff0c; 不管你装的是中文版,还是英文版.删掉原来的设置,把下面的拷贝过去 LANG"zh_CN.GB18030" SUPPORTED"zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en" SYSFONT"latarcyrheb-sun16" 保存,重起.OK了 这时…

201771010112罗松《面向对象程序设计(java)》第三周学习总结

实验三 Java基本程序设计 201771010112 罗松 1、实验目的与要求 &#xff08;1&#xff09;进一步掌握Eclipse集成开发环境下java程序开发基本步骤&#xff1b; &#xff08;2&#xff09;熟悉PTA平台线上测试环境&#xff1b; &#xff08;3&#xff09;掌握Java语言构造基本…

构建openjdk镜像_在Windows上构建OpenJDK

构建openjdk镜像通过做一些实验&#xff0c;我发现手头提供JDK源代码来进行一些更改&#xff0c;使用它等等通常很有用。因此&#xff0c;我决定下载并编译该野兽。 显然&#xff0c;这花了我一些时间&#xff0c;尽管我最初的想法是&#xff0c;它应该和运行make命令一样简单:…

html图像特征提取,图像识别之图像特征提取

图像识别之图像特征提取HOG特征&#xff1a;方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处置中用来停止物体检测的特征描绘子。它经过计算和统计图像部分区域的梯度方向直方图来构成特征。Hog特征分离SVM分类器曾经被普遍应用于图像辨认…

190. 颠倒二进制位

题目 代码 class Solution { public:uint32_t reverseBits(uint32_t n) {n(n>>16)|(n<<16);n((n&0xff00ff00)>>8)|((n&0x00ff00ff)<<8);n((n&0xf0f0f0f0)>>4)|((n&0x0f0f0f0f)<<4);n((n&0xcccccccc)>>2)|((n&am…

Linux--date命令 date命令

Linux--date命令 date命令 date命令的功能是显示和设置系统日期和时间。 该命令的一般格式为&#xff1a; date [选项] 显示时间格式&#xff08;以开头&#xff0c;后面接格式&#xff09; date 设置时间格式 命令中各选项的含义分别为&#xff1a; -d datestr, --date datest…

为某人命名以重新连接到您的服务器

在进行测试自动化时&#xff0c;通常需要知道当前计算机的名称&#xff0c;以提示另一台计算机连接到它&#xff0c;特别是在并行运行测试的情况下。 本周&#xff0c;我试图对服务器进行测试&#xff0c;以使其连接回在从属测试计算机上运行的WireMock服务器。 堆栈溢出的标准…

as转html5工具,将keras的h5模型转换为tensorflow的pb模型

背景&#xff1a;目前keras框架使用简单&#xff0c;很容易上手&#xff0c;深得广大算法工程师的喜爱&#xff0c;但是当部署到客户端时&#xff0c;可能会出现各种各样的bug&#xff0c;甚至不支持使用keras&#xff0c;本文来解决的是将keras的h5模型转换为客户端常用的tens…

暑假第六周

刘思翔来深圳玩&#xff0c;陪玩 转载于:https://www.cnblogs.com/cts1234/p/9664244.html

linux shell数据重定向(输入重定向与输出重定向)详细分析

在了解重定向之前&#xff0c;我们先来看看linux 的文件描述符。 linux文件描述符&#xff1a;可以理解为linux跟踪打开文件&#xff0c;而分配的一个数字&#xff0c;这个数字有点类似c语言操作文件时候的句柄&#xff0c;通过句柄就可以实现文件的读写操作。 用户可以自定义文…

计算机科学技术的教育应用论文,浅谈计算机科学技术在计算机教学中的应用论文...

计算机科学&#xff0c;研究计算机及其周围各种现象和规律的科学&#xff0c;亦即研究计算机系统结构、程序系统(即软件)、人工智能以及计算本身的性质和问题的学科。计算机科学是一门包含各种各样与计算和信息处理相关主题的系统学科&#xff0c;从抽象的算法分析、形式化语法…