全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android自定义Progress控件的方法

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 


相关文章: 建站VPS配置与SEO优化指南:关键词排名提升策略  ,网页ppt怎么弄成自己的ppt?  制作公司内部网站有哪些,内网如何建网站?  高防服务器如何保障网站安全无虞?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  如何确认建站备案号应放置的具体位置?  历史网站制作软件,华为如何找回被删除的网站?  ,制作一个手机app网站要多少钱?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何破解联通资金短缺导致的基站建设难题?  七夕网站制作视频,七夕大促活动怎么报名?  如何在Windows环境下新建FTP站点并设置权限?  建站主机数据库如何配置才能提升网站性能?  在线制作视频网站免费,都有哪些好的动漫网站?  jQuery 常见小例汇总  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何彻底卸载建站之星软件?  太原网站制作公司有哪些,网约车营运证查询官网?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  建站之星安装路径如何正确选择及配置?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在企业微信快速生成手机电脑官网?  淘宝制作网站有哪些,淘宝网官网主页?  测试制作网站有哪些,测试性取向的权威测试或者网站?  广州美橙建站如何快速搭建多端合一网站?  制作网站的软件免费下载,免费制作app哪个平台好?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  开心动漫网站制作软件下载,十分开心动画为何停播?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何通过老薛主机一键快速建站?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  设计网站制作公司有哪些,制作网页教程?  python的本地网站制作,如何创建本地站点?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  独立制作一个网站多少钱,建立网站需要花多少钱?  建站之星后台密码遗忘或太弱?如何重置与强化?  如何用好域名打造高点击率的自主建站?  网站制作的步骤包括,正确网址格式怎么写?  建站之星免费模板:自助建站系统与智能响应式一键生成  江苏网站制作公司有哪些,江苏书法考级官方网站?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何通过虚拟机搭建网站?详细步骤解析  宝塔面板创建网站无法访问?如何快速排查修复?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  C++如何使用std::optional?(处理可选值)  如何快速选择适合个人网站的云服务器配置?  在线教育网站制作平台,山西立德教育官网?  黑客如何利用漏洞与弱口令入侵网站服务器? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。