progress各种各样的都有,自定义大多数也是简单的,根据业务需求来自己定义,记录一下,先上效果图
本来想找个第三方改改就上的,不过自己的业务需求有点不搭,一下子没找到合适的,也没这么多时间去找了,想想还是自己写个吧,因为也简单。
主要就是需求就是椭圆进度,百分比跟随渐变背景,这样一想其实就是一个布局,然后控制里面的进度长度,或者移动,我这是控制长度,这样毕竟简单,而且扩展好,以后进度条有什么奇葩需求也好改。
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.support.annotation.AttrRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
/**
* Created by LiuZhen on 2017/7/8.
*/
public class UpdateProgressBar extends FrameLayout {
private TextView tv_progress;
private int width;
private ViewGroup.LayoutParams params;
/**
* The progress text offset.
*/
private int mOffset;
/**
* The progress text size.
*/
private float mTextSize;
/**
* The progress text color.
*/
private int mTextColor;
private float default_text_size;
/**
* The progress area bar color.
*/
private int mReachedBarColor;
/**
* The bar unreached area color.
*/
private int mUnreachedBarColor;
private final int default_reached_color = Color.rgb(66, 145, 241);
private final int default_unreached_color = Color.rgb(204, 204, 204);
private final int default_text_color = Color.rgb(66, 145, 241);
public UpdateProgressBar(@NonNull Context context) {
this(context,null);
}
public UpdateProgressBar(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public UpdateProgressBar(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = 100;
int desiredHeight = 100;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int height;
//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
//Must be this size
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
width = Math.min(desiredWidth, widthSize);
} else {
//Be whatever you want
width = desiredWidth;
}
//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
//Must be this size
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
height = Math.min(desiredHeight, heightSize);
} else {
//Be whatever you want
height = desiredHeight;
}
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
ViewGroup.LayoutParams lp = child.getLayoutParams();
int childWidthSpec = getChildMeasureSpec(widthMeasureSpec, 0, lp.width);
int childHeightSpec = getChildMeasureSpec(heightMeasureSpec, 0, lp.height);
child.measure(childWidthSpec, childHeightSpec);
}
params = tv_progress.getLayoutParams();
params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
tv_progress.setLayoutParams(params);
height = tv_progress.getMeasuredHeight();
//MUST CALL THIS
setMeasuredDimension(width, height);
}
private void init(AttributeSet attrs, int defStyleAttr){
default_text_size = 8;
//load styled attributes.
final TypedArray attributes = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.UpdateProgressBar,
defStyleAttr, 0);
mTextSize = attributes.getDimension(R.styleable.UpdateProgressBar_update_text_size, default_text_size);
mReachedBarColor = attributes.getResourceId(R.styleable.UpdateProgressBar_update_reached_color, default_reached_color);
mUnreachedBarColor = attributes.getResourceId(R.styleable.UpdateProgressBar_update_unreached_color, default_unreached_color);
mTextColor = attributes.getColor(R.styleable.UpdateProgressBar_update_text_color, default_text_color);
setDefaultProgressBar();
mOffset = px2dip(3);
attributes.recycle();
}
private void setDefaultProgressBar(){
setBackgroundResource(mUnreachedBarColor);
tv_progress = new TextView(getContext());
tv_progress.setTextSize(mTextSize);
tv_progress.setGravity(Gravity.RIGHT | Gravity.CENTER_VERTICAL);
tv_progress.setTextColor(mTextColor);
tv_progress.setLines(1);
tv_progress.setBackgroundResource(mReachedBarColor);
tv_progress.setPadding(0,0,5,1);
tv_progress.setText("0%");
addView(tv_progress);
}
public void setProgress(int progress){
tv_progress.setText(progress+"%");
int proWidth = width*progress/100;
if (tv_progress.getWidth() < proWidth)
params.width = proWidth;//这里不能填充mOffset,因为是椭圆进度条,填充会导致椭圆宽度被进度条覆盖,导致不美观
tv_progress.setLayoutParams(params);
}
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public int px2dip(float pxValue) {
final float scale = getContext().getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 将px值转换为sp值,保证文字大小不变
*/
public int px2sp(float pxValue) {
final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* 将sp值转换为px值,保证文字大小不变
*/
public int sp2px(float spValue) {
final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}
用法布局文件
<com.progressbar.example.UpdateProgressBar
xmlns:pro="http://schemas.android.com/apk/res-auto"
android:id="@+id/progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
pro:update_text_size="6sp"
pro:update_text_color="#FFFFFF"
pro:update_unreached_color="@drawable/shape_corner_progressbg"
pro:update_reached_color="@drawable/shape_corner_progressbar"/>
MainActivity
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.progressbar.NumberProgressBar;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private Timer timer;
private UpdateProgressBar progressBar;
private int progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (UpdateProgressBar)findViewById(R.id.progress);
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
progress++;
progressBar.setProgress(progress);
if(progress == 100) {
Toast.makeText(getApplicationContext(), getString(R.string.finish), Toast.LENGTH_SHORT).show();
// progress = 0;
// progressBar.setProgress(0);
timer.cancel();
}
}
});
}
}, 1000, 100);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onDestroy() {
super.onDestroy();
timer.cancel();
}
}
渐变背景
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#4984f2"/>
<gradient
android:startColor="#4984f2"
android:endColor="#000" />
<corners
android:topLeftRadius="15dp"
android:topRightRadius="15dp"
android:bottomLeftRadius="15dp"
android:bottomRightRadius="15dp"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#dadada"/>
<gradient
android:startColor="#FFF"
android:endColor="#000" />
<corners
android:topLeftRadius="15dp"
android:topRightRadius="15dp"
android:bottomLeftRadius="15dp"
android:bottomRightRadius="15dp"/>
</shape>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# Progress
# 解析android中ProgressBar的用法
# android中ProgressDialog与ProgressBar的使用详解
# android ListView和ProgressBar(进度条控件)的使用方法
# Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
# 实例详解Android自定义ProgressDialog进度条对话框的实现
# Android自定义ProgressDialog进度等待框
# Android ProgressBar进度条使用详解
# Android三种方式实现ProgressBar自定义圆形进度条
# Android 自定义ProgressDialog进度条对话框用法详解
# Android ProgressDialog进度条使用详解
# 进度条
# 转换为
# 转成
# 自己的
# 这是
# 有什么
# 都有
# 也没
# 这么多
# 找了
# 自定义
# 第三方
# 大家多多
# 就上
# 想找个
# 各种各样
# getMode
# MeasureSpec
# widthSize
# desiredHeight
相关文章:
建站之星CMS建站配置指南:模板选择与SEO优化技巧
淘宝制作网站有哪些,淘宝网官网主页?
单页制作网站有哪些,朋友给我发了一个单页网站,我应该怎么修改才能把他变成自己的呢,请求高手指点迷津?
制作网站怎么制作,*游戏网站怎么搭建?
如何用西部建站助手快速创建专业网站?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
建站之星3.0如何解决常见操作问题?
C#如何序列化对象为XML XmlSerializer用法
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
建站OpenVZ教程与优化策略:配置指南与性能提升
建站之星展会模版如何一键下载生成?
建站之星伪静态规则如何设置?
如何快速生成ASP一键建站模板并优化安全性?
北京的网站制作公司有哪些,哪个视频网站最好?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
如何选择PHP开源工具快速搭建网站?
建站之星如何实现网站加密操作?
建站主机与虚拟主机有何区别?如何选择最优方案?
建站之星免费版是否永久可用?
如何在服务器上三步完成建站并提升流量?
如何通过VPS建站无需域名直接访问?
如何在服务器上配置二级域名建站?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
北京企业网站设计制作公司,北京铁路集团官方网站?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
如何在新浪SAE免费搭建个人博客?
网站制作壁纸教程视频,电脑壁纸网站?
如何通过FTP服务器快速搭建网站?
网站制作的步骤包括,正确网址格式怎么写?
深圳网站制作平台,深圳市做网站好的公司有哪些?
如何快速搭建安全的FTP站点?
如何在阿里云高效完成企业建站全流程?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
定制建站方案优化指南:企业官网开发与建站费用解析
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
教学论文网站制作软件有哪些,写论文用什么软件
?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
如何在IIS服务器上快速部署高效网站?
如何在搬瓦工VPS快速搭建网站?
如何在阿里云完成域名注册与建站?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
建站之星免费模板:自助建站系统与智能响应式一键生成
利用JavaScript实现拖拽改变元素大小
*请认真填写需求信息,我们会在24小时内与您取得联系。