SuperLoadingProgress,一款优美的加载器
介绍:
SuperLoadingProgress,一款优美的加载器,根据进度设置加载效果
本例子主要由自定义类实现SuperLoadingProgress。
项目来源:http://www.itlanbao.com/code/100698.html
效果截图:
代码如下:
调用类代码
mSuperLoadingProgress = (SuperLoadingProgress) findViewById(R.id.pro); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(){ @Override public void run() { try { mSuperLoadingProgress.setProgress(0); while(mSuperLoadingProgress.getProgress()<100) { Thread.sleep(10); mSuperLoadingProgress.setProgress(mSuperLoadingProgress.getProgress() + 1); } mSuperLoadingProgress.finishFail(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } });
SuperLoadingProgress类主要实现代码:
package com.example.kaiyicky.myapplication; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.PathMeasure; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.graphics.RegionIterator; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation; import com.example.kaiyicky.myapplication.R; import java.security.KeyStore; import java.security.PublicKey; /** * @author crazychen * @version 1.0 * @date 2015/12/9 */ public class SuperLoadingProgress extends View { /** * 当前进度 */ private int progress = 0; /** * 最大进度 */ private static final int maxProgress = 100; /** * 小方块抛出动画 */ private ValueAnimator mRotateAnimation; /** * 小方块下落 */ private ValueAnimator mDownAnimation; /** * 小方块下落 */ private ValueAnimator mForkAnimation; /** * 打钩 */ private ValueAnimator mTickAnimation; /** * 绘制感叹号 */ private ValueAnimator mshockAnimation; /** * 绘制感叹号震动 */ private ValueAnimator mCommaAnimation; private int mWidth,mHeight; private RectF mRectF = new RectF(); private Paint circlePaint = new Paint(); private Paint smallRectPaint = new Paint(); private Paint downRectPaint = new Paint(); private Paint commaPaint = new Paint(); private Paint tickPaint = new Paint(); /** * 画笔宽度 */ private int strokeWidth = 20; /** * */ private float radius = 0; //0画圆,1抛出方块,2下落变粗,挤压圆形,3,绘制三叉,圆形恢复,4,绿色勾,5,红色感叹号出现,6,红色感叹号震动 private int status = 0; /** * 测量下落路径 */ private PathMeasure downPathMeasure1; private PathMeasure downPathMeasure2; /** * 测量分叉 */ private PathMeasure forkPathMeasure1; private PathMeasure forkPathMeasure2; private PathMeasure forkPathMeasure3; /** * 测量打钩 */ private PathMeasure tickPathMeasure; /** * 感叹号 */ private PathMeasure commaPathMeasure1; private PathMeasure commaPathMeasure2; /** * 下落百分比 * @param context */ float downPrecent = 0; /** * 分叉百分比 * @param context */ float forkPrecent = 0; /** * 打钩百分比 * @param context */ float tickPrecent = 0; /** * 感叹号百分比 * @param context */ float commaPrecent = 0; /** * 震动百分比 * @param context */ int shockPrecent = 0; /** * 是否loading成功 */ public boolean isSuccess = false; /** * 起始角度 */ private static final float startAngle = -90; /** * 扫过角度 */ private float curSweepAngle = 0; /** * 震动角度 */ private int shockDir = 20; public SuperLoadingProgress(Context context) { super(context); init(); } public SuperLoadingProgress(Context context, AttributeSet attrs) { super(context, attrs); init(); } public SuperLoadingProgress(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { mWidth = w; mHeight = h; radius = Math.min(getMeasuredWidth(),getMeasuredHeight())/4-strokeWidth; mRectF.set(new RectF(radius+strokeWidth, radius+strokeWidth, 3 * radius+strokeWidth, 3 * radius+strokeWidth)); //初始化下落路径 Path downPath1 = new Path(); downPath1.moveTo(2*radius+strokeWidth,strokeWidth); downPath1.lineTo(2 * radius+strokeWidth, radius+strokeWidth); Path downPath2 = new Path(); downPath2.moveTo(2 * radius+strokeWidth, strokeWidth); downPath2.lineTo(2 * radius+strokeWidth, 2 * radius+strokeWidth); downPathMeasure1 = new PathMeasure(downPath1,false); downPathMeasure2 = new PathMeasure(downPath2,false); //初始化分叉路径 Path forkpath1 = new Path(); forkpath1.moveTo(2*radius+strokeWidth,2*radius+strokeWidth); forkpath1.lineTo(2 * radius+strokeWidth, 3 * radius+strokeWidth); float sin60 = (float) Math.sin(Math.PI/3); float cos60 = (float) Math.cos(Math.PI / 3); Path forkpath2 = new Path(); forkpath2.moveTo(2 * radius+strokeWidth, 2 * radius+strokeWidth); forkpath2.lineTo(2*radius-radius*sin60+strokeWidth, 2*radius+radius*cos60+strokeWidth); Path forkpath3 = new Path(); forkpath3.moveTo(2 * radius+strokeWidth, 2 * radius+strokeWidth); forkpath3.lineTo(2 * radius + radius * sin60+strokeWidth, 2 * radius + radius * cos60+strokeWidth); forkPathMeasure1 = new PathMeasure(forkpath1,false); forkPathMeasure2 = new PathMeasure(forkpath2,false); forkPathMeasure3 = new PathMeasure(forkpath3,false); //初始化打钩路径 Path tickPath = new Path(); tickPath.moveTo(1.5f * radius+strokeWidth, 2 * radius+strokeWidth); tickPath.lineTo(1.5f * radius + 0.3f * radius+strokeWidth, 2 * radius + 0.3f * radius+strokeWidth); tickPath.lineTo(2*radius+0.5f * radius+strokeWidth,2*radius-0.3f * radius+strokeWidth); tickPathMeasure = new PathMeasure(tickPath,false); //感叹号路径 Path commaPath1 = new Path(); Path commaPath2 = new Path(); commaPath1.moveTo(2f * radius+strokeWidth, 1.25f * radius+strokeWidth); commaPath1.lineTo(2f * radius+strokeWidth, 2.25f * radius+strokeWidth); commaPath2.moveTo(2f * radius+strokeWidth, 2.75f * radius+strokeWidth); commaPath2.lineTo(2f * radius+strokeWidth, 2.5f * radius+strokeWidth); commaPathMeasure1 = new PathMeasure(commaPath1,false); commaPathMeasure2 = new PathMeasure(commaPath2,false); super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(widthSpecSize + 10 * strokeWidth, heightSpecSize + 10 * strokeWidth); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); } private float endAngle; private void init(){ circlePaint.setAntiAlias(true); circlePaint.setColor(Color.argb(255, 48, 63, 159)); circlePaint.setStrokeWidth(strokeWidth); circlePaint.setStyle(Paint.Style.STROKE); smallRectPaint.setAntiAlias(true); smallRectPaint.setColor(Color.argb(255, 48, 63, 159)); smallRectPaint.setStrokeWidth(strokeWidth/2); smallRectPaint.setStyle(Paint.Style.STROKE); downRectPaint.setAntiAlias(true); downRectPaint.setColor(Color.argb(255, 48, 63, 159)); downRectPaint.setStrokeWidth(strokeWidth); downRectPaint.setStyle(Paint.Style.FILL); commaPaint.setAntiAlias(true); commaPaint.setColor(Color.argb(255, 229, 57, 53)); commaPaint.setStrokeWidth(strokeWidth); commaPaint.setStyle(Paint.Style.STROKE); tickPaint.setColor(Color.argb(255, 0, 150, 136)); tickPaint.setAntiAlias(true); tickPaint.setStrokeWidth(strokeWidth); tickPaint.setStyle(Paint.Style.STROKE); //抛出动画 endAngle = (float) Math.atan(4f/3); mRotateAnimation = ValueAnimator.ofFloat(0f, endAngle*0.9f ); mRotateAnimation.setDuration(500); mRotateAnimation.setInterpolator(new AccelerateDecelerateInterpolator()); mRotateAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { curSweepAngle = (float) animation.getAnimatedValue(); invalidate(); } }); mRotateAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); curSweepAngle = 0; if (isSuccess) { status = 2; mDownAnimation.start(); } else { status = 5; mCommaAnimation.start(); } } }); //下落动画 mDownAnimation = ValueAnimator.ofFloat(0f, 1f ); mDownAnimation.setDuration(500); mDownAnimation.setInterpolator(new AccelerateInterpolator()); mDownAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { downPrecent = (float) animation.getAnimatedValue(); invalidate(); } }); mDownAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); status = 3; mForkAnimation.start(); } }); //分叉动画 mForkAnimation = ValueAnimator.ofFloat(0f, 1f ); mForkAnimation.setDuration(100); mForkAnimation.setInterpolator(new LinearInterpolator()); mForkAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { forkPrecent = (float) animation.getAnimatedValue(); invalidate(); } }); mForkAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); } @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mTickAnimation.start(); } }); //打钩动画 mTickAnimation = ValueAnimator.ofFloat(0f, 1f); mTickAnimation.setStartDelay(1000); mTickAnimation.setDuration(500); mTickAnimation.setInterpolator(new AccelerateInterpolator()); mTickAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { tickPrecent = (float) animation.getAnimatedValue(); invalidate(); } }); mTickAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); status = 4; } }); //感叹号动画 mCommaAnimation = ValueAnimator.ofFloat(0f, 1f); mCommaAnimation.setDuration(300); mCommaAnimation.setInterpolator(new AccelerateInterpolator()); mCommaAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { commaPrecent = (float) animation.getAnimatedValue(); invalidate(); } }); mCommaAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); status = 6; mshockAnimation.start(); } }); //震动动画 mshockAnimation = ValueAnimator.ofInt(-1, 0, 1, 0, -1, 0,1,0); mshockAnimation.setDuration(500); mshockAnimation.setInterpolator(new LinearInterpolator()); mshockAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { shockPrecent = (int) animation.getAnimatedValue(); invalidate(); } }); } @Override protected void onDraw(Canvas canvas) { switch (status){ case 0: float precent = 1.0f*progress/maxProgress; canvas.drawArc(mRectF, startAngle-270*precent, -(60 + precent*300), false, circlePaint); break; case 1: drawSmallRectFly(canvas); break; case 2: drawRectDown(canvas); break; case 3: drawFork(canvas); break; case 4: drawTick(canvas); break; case 5: drawComma(canvas); break; case 6: drawShockComma(canvas); break; } } /** * 抛出小方块 * @param canvas */ private void drawSmallRectFly(Canvas canvas){ canvas.save(); canvas.translate(radius / 2 + strokeWidth, 2 * radius + strokeWidth);//将坐标移动到大圆圆心 float bigRadius = 5*radius/2;//大圆半径 float x1 = (float) (bigRadius*Math.cos(curSweepAngle)); float y1 = -(float) (bigRadius*Math.sin(curSweepAngle)); float x2 = (float) (bigRadius*Math.cos(curSweepAngle+0.05*endAngle+0.1*endAngle*(1-curSweepAngle/0.9*endAngle)));// float y2 = -(float) (bigRadius*Math.sin(curSweepAngle+0.05*endAngle+0.1*endAngle*(1-curSweepAngle/0.9*endAngle))); canvas.drawLine(x1, y1, x2, y2, smallRectPaint); canvas.restore(); circlePaint.setColor(Color.argb(255, 48, 63, 159)); canvas.drawArc(mRectF, 0, 360, false, circlePaint); } /** * 绘制下落过程 * @param canvas */ private void drawRectDown(Canvas canvas){ //下落方块的起始端坐标 float pos1[] = new float[2]; float tan1[] = new float[2]; downPathMeasure1.getPosTan(downPrecent * downPathMeasure1.getLength(), pos1, tan1); //下落方块的末端坐标 float pos2[] = new float[2]; float tan2[] = new float[2]; downPathMeasure2.getPosTan(downPrecent * downPathMeasure2.getLength(), pos2, tan2); //椭圆形区域 Rect mRect = new Rect(Math.round(mRectF.left),Math.round(mRectF.top+mRectF.height()*0.1f*downPrecent), Math.round(mRectF.right),Math.round(mRectF.bottom-mRectF.height()*0.1f*downPrecent)); //非交集 Region region1 = new Region(Math.round(pos1[0])-strokeWidth/4,Math.round(pos1[1]),Math.round(pos2[0]+strokeWidth/4),Math.round(pos2[1])); region1.op(mRect, Region.Op.DIFFERENCE); drawRegion(canvas, region1, downRectPaint); //交集 Region region2 = new Region(Math.round(pos1[0])-strokeWidth/2,Math.round(pos1[1]),Math.round(pos2[0]+strokeWidth/2),Math.round(pos2[1])); boolean isINTERSECT = region2.op(mRect, Region.Op.INTERSECT); drawRegion(canvas, region2, downRectPaint); //椭圆形区域 if(isINTERSECT) {//如果有交集 float extrusionPrecent = (pos2[1]-radius)/radius; RectF rectF = new RectF(mRectF.left, mRectF.top + mRectF.height() * 0.1f * extrusionPrecent, mRectF.right, mRectF.bottom - mRectF.height() * 0.1f * extrusionPrecent); canvas.drawArc(rectF, 0, 360, false, circlePaint); }else{ canvas.drawArc(mRectF, 0, 360, false, circlePaint); } } /** * 绘制分叉 * @param canvas */ private void drawFork(Canvas canvas) { float pos1[] = new float[2]; float tan1[] = new float[2]; forkPathMeasure1.getPosTan(forkPrecent * forkPathMeasure1.getLength(), pos1, tan1); float pos2[] = new float[2]; float tan2[] = new float[2]; forkPathMeasure2.getPosTan(forkPrecent * forkPathMeasure2.getLength(), pos2, tan2); float pos3[] = new float[2]; float tan3[] = new float[2]; forkPathMeasure3.getPosTan(forkPrecent * forkPathMeasure3.getLength(), pos3, tan3); canvas.drawLine(2 * radius+strokeWidth, radius+strokeWidth, 2 * radius+strokeWidth, 2 * radius+strokeWidth, downRectPaint); canvas.drawLine(2 * radius+strokeWidth, 2 * radius+strokeWidth, pos1[0], pos1[1], downRectPaint); canvas.drawLine(2 * radius+strokeWidth, 2 * radius+strokeWidth, pos2[0], pos2[1], downRectPaint); canvas.drawLine(2 * radius+strokeWidth, 2 * radius+strokeWidth, pos3[0], pos3[1], downRectPaint); //椭圆形区域 RectF rectF = new RectF(mRectF.left, mRectF.top + mRectF.height() * 0.1f * (1-forkPrecent), mRectF.right, mRectF.bottom - mRectF.height() * 0.1f * (1-forkPrecent)); canvas.drawArc(rectF, 0, 360, false, circlePaint); } /** * 绘制打钩 * @param canvas */ private void drawTick(Canvas canvas) { Path path = new Path(); /* * On KITKAT and earlier releases, the resulting path may not display on a hardware-accelerated Canvas. * A simple workaround is to add a single operation to this path, such as dst.rLineTo(0, 0). */ tickPathMeasure.getSegment(0, tickPrecent * tickPathMeasure.getLength(), path, true); path.rLineTo(0, 0); canvas.drawPath(path, tickPaint); canvas.drawArc(mRectF, 0, 360, false, tickPaint); } /** * 绘制感叹号 */ private void drawComma(Canvas canvas) { Path path1 = new Path(); commaPathMeasure1.getSegment(0, commaPrecent * commaPathMeasure1.getLength(), path1, true); path1.rLineTo(0, 0); Path path2 = new Path(); commaPathMeasure2.getSegment(0, commaPrecent * commaPathMeasure2.getLength(), path2, true); path2.rLineTo(0, 0); canvas.drawPath(path1, commaPaint); canvas.drawPath(path2, commaPaint); canvas.drawArc(mRectF, 0, 360, false, commaPaint); } /** * 绘制震动效果 * @param canvas */ private void drawShockComma(Canvas canvas) { Path path1 = new Path(); commaPathMeasure1.getSegment(0, commaPathMeasure1.getLength(), path1, true); path1.rLineTo(0, 0); Path path2 = new Path(); commaPathMeasure2.getSegment(0, commaPathMeasure2.getLength(), path2, true); path2.rLineTo(0, 0); if (shockPrecent!=0){ canvas.save(); if (shockPrecent==1) canvas.rotate(shockDir, 2 * radius, 2 * radius); else if(shockPrecent==-1) canvas.rotate(-shockDir, 2 * radius, 2 * radius); } canvas.drawPath(path1, commaPaint); canvas.drawPath(path2, commaPaint); canvas.drawArc(mRectF, 0, 360, false, commaPaint); if (shockPrecent!=0) { canvas.restore(); } } /** * 绘制区域 * @param canvas * @param rgn * @param paint */ private void drawRegion(Canvas canvas,Region rgn,Paint paint) { RegionIterator iter = new RegionIterator(rgn); Rect r = new Rect(); while (iter.next(r)) { canvas.drawRect(r, paint); } } /** * 开始完成动画 */ private void start(){ post(new Runnable() { @Override public void run() { mRotateAnimation.start(); } }); } public void setProgress(int progress) { this.progress = Math.min(progress,maxProgress); postInvalidate(); if (progress==0){ status = 0; } } public int getProgress() { return progress; } /** * loading成功后调用 */ public void finishSuccess() { setProgress(maxProgress); this.isSuccess = true; status = 1; start(); } /** * loading失败后调用 */ public void finishFail() { setProgress(maxProgress); this.isSuccess = false; status = 1; start(); } }
相关推荐
SuperLoadingProgress 一款优美的加载器,根据进度设置加载效果 动画效果如下: 希望了解这款加载器的实现方式,可以参考博文http://blog.csdn.net/crazy__chen/article/details/50270281
昨天在简书上看到一篇文章,介绍了一个加载动画的实现过程 [一款Loading动画的实现思路(一)](http://www.jianshu.com/p/1c6a2de68753#) 只可惜原动画是**IOS**上制作的,而看了一下,作者的实现思路比较复杂,于是...
本资源"安卓进度条loadingprogress相关-SuperLoadingProgress.rar"包含了一个名为`SuperLoadingProgress`的项目,可能是一个自定义加载进度条组件的实现。下面我们将深入探讨关于Android中进度条的使用及其自定义...
这个项目很可能是为Android应用设计的一种高级加载或进度指示器,它可能提供了多种动画效果,增强了用户界面的视觉吸引力。 首先,我们来理解一下"SuperLoadingProgress"这个名称。"Super"通常意味着这是一种增强型...
2025职业教育知识竞赛题库(含答案).pptx
基于.NET Core MVC与SQL Server的在线考试管理系统:多角色操作、国际化支持、全套源码与文档附赠,.net core mvc在线考试系统 asp.net在线考试管理系统 主要技术: 基于.net core mvc架构和sql server数据库,数据库访问采用EF core code first,前端采用vue.js和bootstrap。 功能模块: 系统包括前台和后台两个部分,分三种角色登录。 管理员登录后台,拥有科目管理,题库管理,考试管理,成绩管理,用户管理等功能。 教师登录后台,可进行题库管理,考试管理和成绩管理。 用户登录前台,可查看考试列表,参加考试,查看已考试的结果,修改密码等。 系统实现了国际化,支持中英两种语言。 源码打包: 包含全套源码,数据库文件,需求分析和代码说明文档。 运行环境: 运行需vs2019或者以上版本,sql server2012或者以上版本。 ,核心关键词: .net core mvc; asp.net在线考试管理系统; SQL Server数据库; EF core code first; vue.js; boot
C++编写的资产管理系统(带SQLServer数据库文件。)。
递归最小二乘法在线识别轮胎前后侧偏刚度:应用sin工况效果显著,适用多种场景,附simulink模型及代码,1、基于递归最小二乘法在线识别轮胎前后侧偏刚度,图为在正弦曲线工况,估计侧偏刚度的大小,效果较好 2、此模型也可用于其他工况下的刚度估计,有需要的朋友可以自行去尝试 3、包含simulink模型和递归最小二乘侧偏刚度估计代码 ,基于递归最小二乘法; 轮胎侧偏刚度在线识别; 正弦曲线工况估计; Simulink模型; 递归最小二乘侧偏刚度估计代码。,递归最小二乘法在正弦曲线工况下的轮胎刚度在线识别模型
PLL锁相环技术实现:SMIC55工艺下20MHz参考频率三阶二型CPPLL,快速锁定至1GMHz并带环形振荡器与DIV模块功能,pll锁相环 cppll cadence 三阶二型锁相环 工艺smic55 参考频率20MHz 分频比50 锁定频率1GMHz 锁定时间2us 环形振荡器 ring vco PFD模块 DIV模块 45分频,ps counter CP模块 工艺smic55 ,核心关键词:PLL锁相环; CPPLL; 工艺SMIC55; 参考频率20MHz; 分频比50; 锁定频率1GHz; 锁定时间2us; 环形振荡器(Ring VCO); PFD模块; DIV模块(45分频,ps counter); CP模块。,"SMIC55工艺:PLL环及二型锁相环技术解析"
EKF SLAM matlab simulation. EKF SLAM 分析及matlab仿真源码。
CPRI IP License支持Xilinx Vivado全版本,无MAC绑定,永久有效授权,CPRI ip license xilinx vivado 支持Vivado各版本,不绑定mac,永久有效 ,CPRI; IP license; Xilinx; Vivado; 不绑定Mac; 永久有效; 支持各版本。,"Xilinx Vivado支持:永久有效的CPRI IP License,不绑定MAC"
1.内容概要 通过KNN实现鸢尾花分类,即将新的数据点分配给已知类别中的某一类。该算法的核心思想是通过比较距离来确定最近邻的数据点,然后利用这些邻居的类别信息来决定待分类数据点的类别。 2.KNN算法的伪代码 对未知类别属性的数据集中的每个点依次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离; (2)按照距离递增次序排序; (3)选取与当前点距离最小的k个点; (4)确定前k个点所在类别的出现频率; (5)返回前k个点出现频率最高的类别作为当前点的预测分类。 3.数据集说明 代码使用`pandas`库加载了一个名为`iris.arff.csv`的数据集 4.学习到的知识 通过鸢尾花分类学习了KNN算法,选择样本数据集中前k个最相似的数据,就是KNN算法中k的出处。k值过大,会出现分类结果模糊的情况;k值较小,那么预测的标签比较容易受到样本的影响。在实验过程中,不同的k值也会导致分类器的错误率不同。KNN算法精度高、无数据输入的假定,可以免去训练过程。但是对于数据量较多的训练样本,KNN必须保存全部数据集,可能会存在计算的时间复杂度、空间复杂度高的情况,存在维数灾难问
COMSOL三维采空区通风条件下的氧气与瓦斯浓度分布研究,comsol三维采空区通风条件下,氧气,瓦斯浓度分布。 ,核心关键词:comsol; 三维采空区; 通风条件; 氧气浓度分布; 瓦斯浓度分布;,"三维采空区通风模拟:氧气与瓦斯浓度分布研究"
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
DaisyDisk for Mac是一款直观且强大的磁盘清理工具,专为Mac用户设计。它通过交互式图表直观展示磁盘空间使用情况,以彩色区块形式呈现文件和文件夹大小,帮助用户快速定位占用空间的大文件。软件支持快速扫描,可在几秒内完成磁盘分析,并提供文件预览功能,避免误删重要文件。DaisyDisk还支持多磁盘管理、云存储扫描、隐私保护和安全删除功能。其界面简洁易用,适合新手和专业人士,是优化磁盘空间、提升系统性能的必备工具。
三菱FX3U伺服控制框架标准程序详解:定位控制参数设定、回原点操作、JOG手动控制及绝对与相对定位控制,FX3U和三菱伺服控制的框架标准程序,适合新手学习定位用。 用 标签分层,说明了定位控制中的公共参数设定、回原点、JOG手动、绝对定位、相对定位、控制等部分,有伺服驱动器的针脚接线。 ‘包括有: 1、程序一份 2、说明一份 ,核心关键词:FX3U; 三菱伺服控制; 框架标准程序; 新手学习定位; 标签分层; 公共参数设定; 回原点; JOG手动; 绝对定位; 相对定位; 控制; 伺服驱动器针脚接线。,"三菱FX3U伺服控制框架标准程序:新手定位控制指南"
Python自动化办公源码-40 excel处理实例(多工作表合并到单工作表)
2023-04-06-项目笔记-第三百八十六阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.384局变量的作用域_384- 2025-01-22
基于MATLAB的含风光柴储微网多目标优化调度策略与模型实现,含风光柴储微网多目标优化调度 MATLAB代码 关键词:微网调度 风光柴储 粒子群算法 多目标优化 参考文档:《基于多目标粒子群算法的微电网优化调度》 仿真平台:MATLAB 平台采用粒子群实现求解 优势:代码注释详实,适合参考学习,非目前烂大街的版本,程序非常精品,请仔细辨识 主要内容:代码构建了含风机、光伏、柴油发电机以及储能电站在内的微网优化运行模型,并且考虑与上级电网的购电交易,综合考虑了多方经济成本以及风光新能源消纳等多方面的因素,从而实现微网系统的经济运行,求解采用的是MOPSO算法(多目标粒子群算法),求解效果极佳,具体可以看图 ,关键词:微网优化调度; 风光柴储; 粒子群算法; 多目标优化; MATLAB代码; MOPSO算法。,基于MATLAB的微网风光柴储多目标优化调度与MOPSO算法的实践研究
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat