安卓的自定义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

c++实现异步线程池并详细分析线程池析构流程

多线程编程是提高程序性能和响应能力的关键技术之一,异步线程池作为多线程编程的一种有效实现方式,能够管理和复用线程资源,避免频繁创建和销毁线程带来的开销。在本文中,我们将深入探讨如何实现一个异步线程池。

2301_76564925的博客 1599

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何利用Python爬虫技术,快速抓取东方财富网的实时股票数据。通过逆向分析其JSONP数据接口,构建了包含请求处理、数据清洗、分页调度及多格式存储的完整自动化采集系统,并提供了应对反爬策略与生产部署的进阶优化思路,附有可直接运行的完整代码。

weixin_29084231的博客 875

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

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

lph159的博客 957

SAP成本中心费用分割(KSS2)实战:从原理到月末调整全解析

本文详细解析了SAP成本中心费用分割(KSS2)的核心逻辑与实战操作,从成本要素分组配置到月末调整全流程。通过KSS2将初级成本要素按作业类型重新分类为次级成本要素,确保成本结算准确。文章还提供了常见错误处理方法和典型业务场景实战,帮助用户高效完成SAP成本结算。

weixin_29279101的博客 1258

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

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

gitblog_00796的博客 674

开源TMS系统cortex-tms私有化部署与二次开发实战指南

运输管理系统(TMS)是现代物流数字化的核心组件,它通过将线下零散的物流操作转化为线上标准化、可追溯的数据流,实现订单、调度、跟踪与结算的全流程管理。其技术原理通常基于微服务架构,采用Spring Boot、Vue.js等成熟技术栈构建,确保系统的稳定性和可扩展性。TMS的技术价值在于显著提升物流企业的运营效率、降低成本并增强过程可控性,尤其适用于中小型物流企业实现从手工管理到系统化管理的跨越。在应用场景上,TMS广泛应用于车队管理、订单跟踪和财务结算等环节。本文聚焦于开源TMS项目cortex-tms,深

weixin_42523907的博客 746

人工智能渗透测试:自动化安全评估

渗透测试认证的价值包括提高可信度和技能水平,并帮助客户确保由经过认证的个人对其系统进行全面的手动调查。B2B 交互变得越来越复杂,特别是功能丰富的超级应用程序,需要采取强有力的安全预防措施,而自动化渗透测试应用程序则是一种未被发现的武器。渗透测试中的人工智能通过提高效率、自动收集信息、发现隐藏的漏洞、开发个性化攻击和减少误报来提高 B2B 集成的安全性。这包括风险简报、补救建议和战略建议。渗透测试由五个阶段组成,是网络安全中的关键防御措施,它模拟现实世界的攻击,以识别系统缺陷并在漏洞被利用之前解决它们。

weixin_48967543的博客 2362

Android之自定义ProgressBar

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

冰点蓝欣的专栏 2244

STGCN+YOLOV8行为分类

使用关节点追踪网络获取关节点数据,以yolo-v8网络为例,获取2D关节点数据。此次实验采用KTH动作识别数据集,包含人步行、慢跑、跑步、拳击、挥手和拍手等动作。

SDADASDAF的博客 3892

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

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

weixin_28870939的博客 256

【算能】TPU-MLIR 工具链之model_deploy

model_deploy.py 是算能 TPU-MLIR 工具链中实现模型高效部署的核心组件,通过灵活的量化配置与硬件优化,可在 ​精度损失 ≤1% 的前提下实现 ​3-5 倍加速。开发者需重点关注校准数据质量、混合精度策略及硬件兼容性

浩瀚之水的专栏 288

05、CAN 总线拓扑结构详解,线型拓扑搭建要点

CAN总线拓扑与信号完整性优化 本文通过工程实践经验,深入剖析了CAN总线系统中信号完整性的关键要素。主要内容包括: 终端电阻的核心作用:必须严格在总线两端配置120Ω电阻,形成60Ω等效阻抗以匹配双绞线特性阻抗,避免信号反射导致的波形畸变。 阻抗匹配原理:解释了信号能量管理机制,指出阻抗不连续会导致信号反射,并通过示波器波形特征(如振铃现象)判断阻抗失配问题。 信号完整性多维要求:强调信号质量不仅涉及波形存在与否,还包括边沿斜率、共模电压范围等关键参数,这些直接影响通信可靠性。 工程实践建议:提供了终端电

2401_88858637的博客 178
上一篇: android自动升级
下一篇: 属性formart描述
小人物2014
博客等级 码龄19年 66粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值