安卓的自定义progress,受用

Android自定义控件:进度条的四种实现方式(Progress Wheel的解析)(源码 + Demo) 阅读详情

很多的时候,系统自带的View满足不了我们功能的需求,那么我们就需要自己来自定义一个能满足我们需求的View,自定义View我们需要先继承View,添加类的构造方法,重写父类View的一些方法,例如onDraw,为了我们自定义的View在一个项目中能够重用,有时候我们需要自定义其属性,举个很简单的例子,我在项目中的多个界面使用我自定义的View,每个界面该自定义View的颜色都不相同,这时候如果没有自定义属性,那我们是不是需要构建不同颜色的View出来呢,这样子我们的代码就会显得很沉厄,所以这时候我们就需要自定义其属性来满足我们不同的需求,自定义属性呢,我们需要在values下建立attrs.xml文件,在其中定义我们需要定义的属性,然后在自定义View中也要做相对应的修改,我们还是用一个小例子来看看自定义View和自定义属性的使用


今天带大家来自己定义一个带进度的圆形进度条,我们还是先看一下效果吧


从上面可以看出,我们可以自定义圆环的颜色,圆环进度的颜色,是否显示进度的百分比,进度百分比的颜色,以及进度是实心还是空心等等,这样子是不是很多元化很方便呢?接下来我们就来教大家怎么来定义


1.在values下面新建一个attrs.xml,现在里面定义我们的属性,不同的属性对应不同的format,属性对应的format可以参考http://blog.youkuaiyun.com/pgalxx/article/details/6766677,介绍的还是比较详细,接下来我贴上我在自定义这个进度条所用到的属性

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <resources>  
  3.     <declare-styleable name="RoundProgressBar">    
  4.         <attr name="roundColor" format="color"/>  
  5.         <attr name="roundProgressColor" format="color"/>  
  6.         <attr name="roundWidth" format="dimension"></attr>  
  7.         <attr name="textColor" format="color" />    
  8.         <attr name="textSize" format="dimension" />   
  9.         <attr name="max" format="integer"></attr>   
  10.         <attr name="textIsDisplayable" format="boolean"></attr>  
  11.         <attr name="style">  
  12.             <enum name="STROKE" value="0"></enum>  
  13.             <enum name="FILL" value="1"></enum>  
  14.         </attr>  
  15.     </declare-styleable>   
  16. </resources>  

2.自定义View的属性我们算是定义好了,接下来就是怎么获取属性和代码的编写了,我们需要在构造方法中获取我们自己定义的相关属性,我们先调用context.obtainStyledAttributes(attrs,R.styleable.RoundProgressBar)来获取TypedArray,然后从TypedArray获取我们定义的属性,例如

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. roundColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED);  
  2.         roundProgressColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN);  
  3.         textColor = mTypedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.GREEN);  
  4.         textSize = mTypedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);  
  5.         roundWidth = mTypedArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 5);  
  6.         max = mTypedArray.getInteger(R.styleable.RoundProgressBar_max, 100);  
  7.         textIsDisplayable = mTypedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true);  
  8.         style = mTypedArray.getInt(R.styleable.RoundProgressBar_style, 0);  
上面的代码中,如roundColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED); getColor方法的第一个参数是我们在XML文件中定义的颜色,如果我们没有给我们自定义的View定义颜色,他就会使用第二个参数中的默认值,即Color.RED


3.为了方便大家理解,我将自定义View的全部代码贴出来,里面的代码我也有详细的注释

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.roundprogressbar;  
  2.   
  3. import android.content.Context;  
  4. import android.content.res.TypedArray;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Paint;  
  8. import android.graphics.RectF;  
  9. import android.graphics.Typeface;  
  10. import android.util.AttributeSet;  
  11. import android.util.Log;  
  12. import android.view.View;  
  13.   
  14. import com.example.circlepregress.R;  
  15.   
  16. /** 
  17.  * 仿iphone带进度的进度条,线程安全的View,可直接在线程中更新进度 
  18.  * @author xiaanming 
  19.  * 
  20.  */  
  21. public class RoundProgressBar extends View {  
  22.     /** 
  23.      * 画笔对象的引用 
  24.      */  
  25.     private Paint paint;  
  26.       
  27.     /** 
  28.      * 圆环的颜色 
  29.      */  
  30.     private int roundColor;  
  31.       
  32.     /** 
  33.      * 圆环进度的颜色 
  34.      */  
  35.     private int roundProgressColor;  
  36.       
  37.     /** 
  38.      * 中间进度百分比的字符串的颜色 
  39.      */  
  40.     private int textColor;  
  41.       
  42.     /** 
  43.      * 中间进度百分比的字符串的字体 
  44.      */  
  45.     private float textSize;  
  46.       
  47.     /** 
  48.      * 圆环的宽度 
  49.      */  
  50.     private float roundWidth;  
  51.       
  52.     /** 
  53.      * 最大进度 
  54.      */  
  55.     private int max;  
  56.       
  57.     /** 
  58.      * 当前进度 
  59.      */  
  60.     private int progress;  
  61.     /** 
  62.      * 是否显示中间的进度 
  63.      */  
  64.     private boolean textIsDisplayable;  
  65.       
  66.     /** 
  67.      * 进度的风格,实心或者空心 
  68.      */  
  69.     private int style;  
  70.       
  71.     public static final int STROKE = 0;  
  72.     public static final int FILL = 1;  
  73.       
  74.     public RoundProgressBar(Context context) {  
  75.         this(context, null);  
  76.     }  
  77.   
  78.     public RoundProgressBar(Context context, AttributeSet attrs) {  
  79.         this(context, attrs, 0);  
  80.     }  
  81.       
  82.     public RoundProgressBar(Context context, AttributeSet attrs, int defStyle) {  
  83.         super(context, attrs, defStyle);  
  84.           
  85.         paint = new Paint();  
  86.   
  87.           
  88.         TypedArray mTypedArray = context.obtainStyledAttributes(attrs,  
  89.                 R.styleable.RoundProgressBar);  
  90.           
  91.         //获取自定义属性和默认值  
  92.         roundColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED);  
  93.         roundProgressColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN);  
  94.         textColor = mTypedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.GREEN);  
  95.         textSize = mTypedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);  
  96.         roundWidth = mTypedArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 5);  
  97.         max = mTypedArray.getInteger(R.styleable.RoundProgressBar_max, 100);  
  98.         textIsDisplayable = mTypedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true);  
  99.         style = mTypedArray.getInt(R.styleable.RoundProgressBar_style, 0);  
  100.           
  101.         mTypedArray.recycle();  
  102.     }  
  103.       
  104.   
  105.     @Override  
  106.     protected void onDraw(Canvas canvas) {  
  107.         super.onDraw(canvas);  
  108.           
  109.         /** 
  110.          * 画最外层的大圆环 
  111.          */  
  112.         int centre = getWidth()/2; //获取圆心的x坐标  
  113.         int radius = (int) (centre - roundWidth/2); //圆环的半径  
  114.         paint.setColor(roundColor); //设置圆环的颜色  
  115.         paint.setStyle(Paint.Style.STROKE); //设置空心  
  116.         paint.setStrokeWidth(roundWidth); //设置圆环的宽度  
  117.         paint.setAntiAlias(true);  //消除锯齿   
  118.         canvas.drawCircle(centre, centre, radius, paint); //画出圆环  
  119.           
  120.         Log.e("log", centre + "");  
  121.           
  122.         /** 
  123.          * 画进度百分比 
  124.          */  
  125.         paint.setStrokeWidth(0);   
  126.         paint.setColor(textColor);  
  127.         paint.setTextSize(textSize);  
  128.         paint.setTypeface(Typeface.DEFAULT_BOLD); //设置字体  
  129.         int percent = (int)(((float)progress / (float)max) * 100);  //中间的进度百分比,先转换成float在进行除法运算,不然都为0  
  130.         float textWidth = paint.measureText(percent + "%");   //测量字体宽度,我们需要根据字体的宽度设置在圆环中间  
  131.           
  132.         if(textIsDisplayable && percent != 0 && style == STROKE){  
  133.             canvas.drawText(percent + "%", centre - textWidth / 2, centre + textSize/2, paint); //画出进度百分比  
  134.         }  
  135.           
  136.           
  137.         /** 
  138.          * 画圆弧 ,画圆环的进度 
  139.          */  
  140.           
  141.         //设置进度是实心还是空心  
  142.         paint.setStrokeWidth(roundWidth); //设置圆环的宽度  
  143.         paint.setColor(roundProgressColor);  //设置进度的颜色  
  144.         RectF oval = new RectF(centre - radius, centre - radius, centre  
  145.                 + radius, centre + radius);  //用于定义的圆弧的形状和大小的界限  
  146.           
  147.         switch (style) {  
  148.         case STROKE:{  
  149.             paint.setStyle(Paint.Style.STROKE);  
  150.             canvas.drawArc(oval, 0, 360 * progress / max, false, paint);  //根据进度画圆弧  
  151.             break;  
  152.         }  
  153.         case FILL:{  
  154.             paint.setStyle(Paint.Style.FILL_AND_STROKE);  
  155.             if(progress !=0)  
  156.                 canvas.drawArc(oval, 0, 360 * progress / max, true, paint);  //根据进度画圆弧  
  157.             break;  
  158.         }  
  159.         }  
  160.           
  161.     }  
  162.       
  163.       
  164.     public synchronized int getMax() {  
  165.         return max;  
  166.     }  
  167.   
  168.     /** 
  169.      * 设置进度的最大值 
  170.      * @param max 
  171.      */  
  172.     public synchronized void setMax(int max) {  
  173.         if(max < 0){  
  174.             throw new IllegalArgumentException("max not less than 0");  
  175.         }  
  176.         this.max = max;  
  177.     }  
  178.   
  179.     /** 
  180.      * 获取进度.需要同步 
  181.      * @return 
  182.      */  
  183.     public synchronized int getProgress() {  
  184.         return progress;  
  185.     }  
  186.   
  187.     /** 
  188.      * 设置进度,此为线程安全控件,由于考虑多线的问题,需要同步 
  189.      * 刷新界面调用postInvalidate()能在非UI线程刷新 
  190.      * @param progress 
  191.      */  
  192.     public synchronized void setProgress(int progress) {  
  193.         if(progress < 0){  
  194.             throw new IllegalArgumentException("progress not less than 0");  
  195.         }  
  196.         if(progress > max){  
  197.             progress = max;  
  198.         }  
  199.         if(progress <= max){  
  200.             this.progress = progress;  
  201.             postInvalidate();  
  202.         }  
  203.           
  204.     }  
  205.       
  206.       
  207.     public int getCricleColor() {  
  208.         return roundColor;  
  209.     }  
  210.   
  211.     public void setCricleColor(int cricleColor) {  
  212.         this.roundColor = cricleColor;  
  213.     }  
  214.   
  215.     public int getCricleProgressColor() {  
  216.         return roundProgressColor;  
  217.     }  
  218.   
  219.     public void setCricleProgressColor(int cricleProgressColor) {  
  220.         this.roundProgressColor = cricleProgressColor;  
  221.     }  
  222.   
  223.     public int getTextColor() {  
  224.         return textColor;  
  225.     }  
  226.   
  227.     public void setTextColor(int textColor) {  
  228.         this.textColor = textColor;  
  229.     }  
  230.   
  231.     public float getTextSize() {  
  232.         return textSize;  
  233.     }  
  234.   
  235.     public void setTextSize(float textSize) {  
  236.         this.textSize = textSize;  
  237.     }  
  238.   
  239.     public float getRoundWidth() {  
  240.         return roundWidth;  
  241.     }  
  242.   
  243.     public void setRoundWidth(float roundWidth) {  
  244.         this.roundWidth = roundWidth;  
  245.     }  
  246.   
  247.   
  248.   
  249. }  

4.通过上面几步我们就实现了自定义View,和自定义View的属性,当然使用过程中还是有一点变化,我们必须在界面布局的最顶层加上

 xmlns:android_custom="http://schemas.android.com/apk/res/com.example.circlepregress"这个即命名空间,

  • 红色部分是自定义属性的前缀,什么意思呢?对于android系统控件我们定义其控件属性是用android:XXX="XXXXXXX",而我们自己定义的就用android_custom:XXX = "XXXXXX"
  • 绿色部分则是我们的包的名字

通过上面这两步我们就能自己定义属性了,我贴出自定义View在XML中使用情况

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  2.     xmlns:android_custom="http://schemas.android.com/apk/res/com.example.circlepregress"  
  3.     xmlns:tools="http://schemas.android.com/tools"    
  4.     android:layout_width="match_parent"    
  5.     android:layout_height="match_parent" >    
  6.     
  7.     
  8.     <com.example.roundprogressbar.RoundProgressBar    
  9.         android:id="@+id/roundProgressBar2"    
  10.         android:layout_width="80dip"    
  11.         android:layout_height="80dip"    
  12.         android:layout_alignLeft="@+id/roundProgressBar1"    
  13.         android:layout_alignParentBottom="true"    
  14.         android:layout_marginBottom="78dp"    
  15.             
  16.             
  17.         android_custom:roundColor="#D1D1D1"    
  18.         android_custom:roundProgressColor="@android:color/black"    
  19.         android_custom:textColor="#9A32CD"    
  20.         android_custom:textIsDisplayable="false"    
  21.         android_custom:roundWidth="10dip"    
  22.         android_custom:textSize="18sp"/>    
  23. </RelativeLayout>   


今天就到此结束,如果大家有什么疑问,请留言,我会及时回复大家的


项目源码,点击下载

Android自定义圆弧进度条(半圆进度条) 圆弧渐变色进度条带指示 圆弧宽高可自由修改 Android 自定义圆弧进度条,支持设置为圆形进度条,弧度圆形渐变色,进度指示条,进度文字。 阅读详情

相关推荐

Android自定义控件篇 圆形倒计时

一、效果图 二、自定义样式 attrs.xml <declare-styleable name="AdCountDownView"> <!--控制广告时间--> <attr name="AD_Time" format="integer"/> <!--是否需要显示文字 eg:是3秒 还是3--> <attr name="If_Need_Text" format="boolean"/>

圈池 647

Android 自定义View之圆形进度条

需求是不停的,会有这些需求:可指定画笔(宽度、颜色等)、可指定动画时长等。这些可以通过创建 Java 接口来设置,但我要学自定义View,就要用attr。未完待续~~Android Canvas的drawText()和文字居中方案。

weixin_44021334的博客 6223

自定义SeekBar中progress无法覆盖background区域 解决方案

项目需求,自定义SeekBar实现拖动选择所需数值: 展示效果如图: 由于项目要求seekbar的背景backgroud和进度条progress都是自定义的图片,图片在适配和拉伸的过程中会存在变形,更重要的是在适配的时候会出现问题,项目需求在不同的设备上7寸  10寸 Pad 和5寸手机上进行适配,所以选择使用了.9.png的图片,这样就可以很好的解决了图片拉伸变形的问题。

军军同学的专栏 4111

【Android】自定义一个圆形的进度条(圆形不是环形)

使用clip标签创建一个圆形的进度条

boulete的博客 1197

安卓Android多阶段进度条progress bar附带动画效果

还在为美工设计出的进度条而发愁吗?大家先看效果吧 欢迎加安卓开发交流群:308372687(博主尽可能帮助大家) 转载请注明来源 代码连接 GitHub:https://github.com/AndroidMsky/Myprogress笔者也是想给大家传递一个思想,面对效果不要怕大胆去做。大胆去想,想自己能实现什么,还差什么,如何去让自己的设想变成现实。 今天就用属性动画实现一个动态多

AndroidMsky的博客 1万+

Android Progress效果多样化实现与自定义

在Android开发中,自定义动画效果可以极大地提升用户体验,尤其是在显示进度条时。设计自定义动画的目标是使其看起来更加自然流畅,同时符合应用的整体风格和用户预期。为了达到这样的效果,我们首先需要理解动画的原理,并且明确动画应该传达的信息。首先,自定义动画的设计应该遵循以下几个原则:简洁性:避免过度复杂的设计,使用户易于理解动画的含义。相关性:动画应与应用的主题和功能紧密相关,增强用户的认知一致性。流畅性:动画应平滑过渡,避免引起用户的不适或分心。反馈性。

weixin_42372837的博客 1249

Android自定义progress

自定义属性 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:progress="http://schemas.android.com/apk/res/com.exa

u013598111的专栏 849

Android开发中常用Progress效果实战汇总

圆环形进度条是 Android 应用中最常见的等待提示形式之一,广泛应用于登录验证、数据加载、图片上传等场景。其核心优势在于占用空间小、视觉聚焦性强,并能有效传递“系统正在处理”的信息。该组件本质上是一个特殊样式的,默认以逆时针方向旋转动画表示持续进行的操作,尤其适合用于异步任务尚未完成前的过渡阶段。在现代 Android 应用开发中,标准的已难以满足日益增长的视觉设计需求与交互复杂度。

weixin_29050829的博客 1034

自定义Android progress bars

首先 各版本默认的进度条样式  现在我们开始自定义样式 ProgressBar     android:id="@+id/progressBar2"     style="?android:attr/progressBarStyleHorizontal"     android:layout_width="fill_parent"     android:l

高低调的博客 483

打造独特美观的Android Dotted Progress Bar

Dotted Progress Bar是一种通过点阵模式展示进度的组件,它的视觉效果可以引导用户关注进度的更新,并且在视觉上呈现出一种动态的流动感。这种组件常见于加载页面、文件传输和系统更新等场景中。从视觉设计上,通过点阵的疏密程度,可以直观地表达进度的快慢,点阵越密集,表示进度越快,反之则越慢。自定义View的生命周期是其运行的基础,与Activity生命周期不同,View的生命周期与布局的变化密切相关,主要的生命周期方法包括onLayout()和onDraw()。

weixin_33363025的博客 708

Android自定义SeekBar源码完整指南

本文还有配套的精品资源,点击获取 简介:Android SeekBar是用户通过滑动选择数值的常用控件,开发者常需自定义以满足设计需求。本压缩包提供自定义SeekBar的Java源代码和资源文件。自定义SeekBar涉及绘制Thumb、自定义触摸反馈、设置尺寸和间距、添加动画效果、处理触摸事件等多个关键点。理解这些自定义实现,能提升Android UI定制技能。 1....

weixin_32047493的博客 1577

android实现自定义seekbar,重新绘制background、secondaryProgress、progress进度条、滑块thumb

原生的seekbar,设置progressDrawable可以改变seekbar进度条的样式,例如如下样式。 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:i...

huidawoxiaozi的博客 7000

【Android】自定义圆形进度条效果(有进度标识点)

总共分为三层:一层为圆形边线,一层为进度边线,一层用来显示标识进度节点。 public class CircleProgressBar extends View { private int maxProgress = 100; private int progress = 15; private int progressStrokeWidth = 2; private int marxArcStorkeWidth = 16; // 画圆所在的距形区域 RectF oval; Paint paint; public CircleProgressBar(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub oval = new RectF(); paint = new Paint(); } @Override protected void onDraw(Canvas canvas) { // TODO 自动生成的方法存根 super.onDraw(canvas); int width = this.getWidth(); int height = this.getHeight(); width = (width > height) ? height : width; height = (width > height) ? height : width; paint.setAntiAlias(true); // 设置画笔为抗锯齿 paint.setColor(Color.WHITE); // 设置画笔颜色 canvas.drawColor(Color.TRANSPARENT); // 白色背景 paint.setStrokeWidth(progressStrokeWidth); // 线宽 paint.setStyle(Style.STROKE); oval.left = marxArcStorkeWidth / 2; // 左上角x oval.top = marxArcStorkeWidth / 2; // 左上角y oval.right = width - marxArcStorkeWidth / 2; // 左下角x oval.bottom = height - marxArcStorkeWidth / 2; // 右下角y canvas.drawArc(oval, -90, 360, false, paint); // 绘制白色圆圈,即进度条背景 paint.setColor(Color.rgb(0x57, 0x87, 0xb6)); paint.setStrokeWidth(marxArcStorkeWidth); canvas.drawArc(oval, -90, ((float) progress / maxProgress) * 360, false, paint); // 绘制进度圆弧,这里是蓝色 paint.setStrokeWidth(1); String text = progress + "%"; int textHeight = height / 4; paint.setTextSize(textHeight); int textWidth = (int) paint.measureText(text, 0, text.length()); paint.setStyle(Style.FILL); canvas.drawText(text, width / 2 - textWidth / 2, height / 2 + textHeight / 2, paint); } public int getMaxProgress() { return maxProgress; } public void setMaxProgress(int maxProgress) { this.maxProgress = maxProgress; } /** * 设置进度 * * @param progress * 进度百分比 * @param view * 标识进度的节点视图 */ public void setProgress(int progress, View view) { this.progress = progress; view.setAnimation(pointRotationAnima(0, (int) (((float) 360 / maxProgress) * progress))); this.invalidate(); } /** * 非UI线程调用 */ public void setProgressNotInUiThread(int progress, View view) { this.progress = progress; view.setAnimation(pointRotationAnima(0, (int) (((float) 360 / maxProgress) * progress))); this.postInvalidate(); } /** * 进度标注点的动画 * * @param fromDegrees * @param toDegrees * @return */ private Animation pointRotationAnima(float fromDegrees, float toDegrees) { int initDegress = 306;// 进度点起始位置(图片偏移约54度) RotateAnimation animation = new RotateAnimation(fromDegrees, initDegress + toDegrees, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animation.setDuration(1);// 设置动画执行时间 animation.setRepeatCount(1);// 设置重复执行次数 animation.setFillAfter(true);// 设置动画结束后是否停留在结束位置 return animation; } }

自定义Progress样式(原生progress方式实现)

使用原生progress实现自定义风格的progress今天无意间看到progress还可以使用layer-list实现多重样式,特在此记录下来: 效果图 layer-list 代码中使用 效果图代码块在drawable文件夹下创建myprogress.xml,例如:<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="h

Allen技术家园 3484

轻量级替代方案:用AIFlowy + Ollama在本地快速搭建一个可用的AI智能体平台

本文介绍了如何使用AIFlowy和Ollama在本地快速搭建轻量级AI智能体平台,涵盖从环境准备到智能体集成的全流程。通过简化部署步骤和优化性能,15分钟内即可完成搭建,适用于原型验证和小团队协作,显著提升开发效率。

weixin_29207533的博客 219

【效率手册】Kylin-Desktop-V10-SP1 麒麟系统核心组件实战——从入门到精通的6个关键场景

本文针对Kylin-Desktop-V10-SP1麒麟系统用户,通过文件管理、系统监视、设置优化等6个核心场景实战,深度解析如何高效运用系统内置工具解决文件混乱、性能卡顿、外设驱动等实际问题,帮助用户从功能认知跃升至场景化应用,真正释放国产操作系统的生产力潜能。

weixin_29208327的博客 119

【Material-UI】Progress 组件中的 Customization 自定义详解

和。用于圆形的进度显示,通常用于加载动画,而则用于线性进度条展示。默认情况下,这些组件的样式已经足够简洁美观,但 Material-UI 的灵活性使得开发者可以根据需求进行深度自定义。虽然 Material-UI 提供了默认样式,但在实际项目中,你可能会希望 Progress 组件的样式能够与项目整体设计风格保持一致。例如,调整进度条的颜色、宽度、动画效果等。通过自定义,你可以让 Progress 组件更好地融入到你的应用程序中。在自定义组件时,我们可以通过styled。

lph159的博客 957

无线通信入门:3种键控法(ASK/FSK/PSK)原理图解与实战对比

本文深入解析无线通信中ASK、FSK、PSK三种基础键控法的原理与应用。通过图解对比,阐明幅移键控(ASK)简单低成本但抗干扰差,频移键控(FSK)稳健且应用广泛,相移键控(PSK)高效但复杂。文章结合实战场景,为物联网和嵌入式开发者在选型时提供关键指导,帮助平衡数据速率、成本、功耗与抗干扰需求。

weixin_29274969的博客 188

Macro connection_gateway_client 深度解析:服务间向在线用户推送实时消息的 HTTP 客户端

在 Macro 的后端架构中,各业务服务需要把"日历变更"、"邮件刷新"、"缓存失效(invalidation)"等实时事件推送到用户当前打开的客户端页面,这条链路的入口正是 `connection_gateway_client` 这个 Rust crate。本文基于该 crate 的开发者指南 [AGENTS.md](https://link.gitcode.com/i/a399943e3935

gitblog_00796的博客 674

VINS-Fusion实战:从零搭建无人机视觉惯性导航系统(附ROS配置指南)

本文提供了一份详尽的VINS-Fusion实战指南,涵盖从硬件选型、传感器标定到ROS节点配置与参数调优的全过程。重点解析了如何将VINS-Fusion视觉惯性里程计系统与PX4飞控深度集成,并实现室外GPS融合,旨在帮助开发者从零搭建稳定、高精度的无人机视觉惯性导航系统。

lll78的博客 865

UE4/5项目GPU崩溃?可能是Windows的TDR机制在搞鬼!深入浅出聊聊TdrDelay与显卡超时

本文深入探讨了UE4/5项目中GPU崩溃的常见原因,揭示了Windows TDR机制的工作原理及其对渲染进程的影响。通过调整TdrDelay参数和优化GPU负载,提供了解决显卡超时问题的实用方案,帮助开发者提升项目稳定性。

weixin_30691649的博客 410

Android之自定义ProgressBar

本文简单介绍下Android之自定义ProgressBar。

冰点蓝欣的专栏 2244

【QT开发教程】使用Qt进行蓝牙低功耗(BLE)编程

蓝牙低功耗(BLE,Bluetooth Low Energy)技术广泛应用于现代设备中,例如智能手表、健身追踪器和物联网设备。Qt提供了一套完整的Bluetooth模块,使开发者可以轻松地在应用程序中实现BLE通信功能。本文将介绍如何在Qt中进行BLE编程,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 2869

android程序设计例子,Android中Progress的简单实例

Android中Progress的简单实例Android中Progress网上的demo都是瞎扯淡,当然,你们也可以认为我的demo是瞎扯淡,因为,毕竟要理解别人的思路,很头疼,主要还是知道思路,然后一步一步慢慢来。今天我讲的是Progress的实现,如果看了我之前的博客,应该多少有些了解。话不多说,来看实例:xml东西不多,自己定义把,因为Progress包括了一级读取和二级读取,所以主要是根据...

weixin_28870939的博客 256

深度学习论文: Towards Total Recall in Industrial Anomaly Detection

在大规模工业制造中,能够准确检测出有缺陷的零件至关重要。我们在这项工作中面临的一个特殊挑战是冷启动问题:仅使用正常的示例图像来训练模型。虽然可以针对每个类别手动设计解决方案,但我们的目标是构建能够自动适用于多个任务的系统。最佳的方法是将ImageNet模型的嵌入特征与异常检测模型结合起来。在本文中,我们在这一研究基础上进行了扩展,并提出了PatchCore,它利用了一个具有最大代表性的正常补丁特征内存库。通过这种方法,我们能够更好地解决冷启动问题,并提高系统在多任务上的性能。

mingo_敏 1875

打破RK3588 GPIO中断响应延迟的枷锁,开启高效编程

本文针对RK3588芯片在智能安防和工业自动化应用中出现的GPIO中断响应延迟问题展开深入分析。通过硬件原理剖析,发现延迟主要源于中断控制器优先级设置、线路干扰等硬件因素,以及中断处理函数复杂、内核调度延迟等软件问题。提出硬件优化方案包括合理布局布线、电源稳定设计,软件层面则通过精准配置设备树、精简中断处理函数、利用工作队列等内核机制进行优化。测试结果显示,优化后中断响应延迟从50-80ms降至10-20ms,高负载下也能稳定在50ms以内。文章最后展望了AI技术在中断调度中的潜在应用价值。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 362
上一篇: android自动升级
下一篇: 属性formart描述
小人物2014
博客等级 码龄19年 66粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值