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
相关文章:
如何快速搭建FTP站点实现文件共享?
,交易猫的商品怎么发布到网站上去?
网站代码制作软件有哪些,如何生成自己网站的代码?
平台云上自主建站:模板化设计与智能工具打造高效网站
制作门户网站的参考文献在哪,小说网站怎么建立?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
,如何利用word制作宣传手册?
建站主机无法访问?如何排查域名与服务器问题
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
在线制作视频网站免费,都有哪些好的动漫网站?
如何挑选优质建站一级代理提升网站排名?
潮流网站制作头像软件下载,适合母子的网名有哪些?
网站制作的步骤包括,正确网址格式怎么写?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
网站制作难吗安全吗,做一个网站需要多久时间?
如何选择高效便捷的WAP商城建站系统?
如何确保FTP站点访问权限与数据传输安全?
如何选择域名并搭建高效网站?
如何快速搭建自助建站会员专属系统?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
建站之星代理如何获取技术支持?
如何在IIS中新建站点并解决端口绑定冲突?
如何通过FTP服务器快速搭建网站?
linux top下的 minerd 木马清除方法
建站之星24小时客服电话如何获取?
网站图片在线制作软件,怎么在图片上做链接?
临沂网站制作公司有哪些,临沂第四中学官网?
如何快速生成凡客建站的专业级图册?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
郑州企业网站制作公司,郑州招聘网站有哪些?
建站之星后台密码遗忘如何找回?
常州企业网站制作公司,全国继续教育网怎么登录?
ui设计制作网站有哪些,手机UI设计网址吗?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何在Windows虚拟主机上快速搭建网站?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
如何在腾讯云免费申请建站?
如何续费美橙建站之星域名及服务?
建站主机数据库如何配置才能提升网站性能?
建站之星安装路径如何正确选择及配置?
如何通过云梦建站系统实现SEO快速优化?
如何用美橙互联一键搭建多站合一网站?
如何选择最佳自助建站系统?快速指南解析优劣
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
建站主机选虚拟主机还是云服务器更好?
建站之星3.0如何解决常见操作问题?
重庆市网站制作公司,重庆招聘网站哪个好?
*请认真填写需求信息,我们会在24小时内与您取得联系。