Android 自定义横向进度条(可动态设置最大值)

本文详细介绍了一种自定义横向进度条的实现方法,通过在Android应用中动态生成进度条,实现了进度展示的灵活变化。文章包括了XML布局设计、进度条数据处理及动画效果实现等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义横向进度条

      主布局文件中包 含         

<LinearLayout
    android:id="@+id/linearlayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/color_white_real"
    android:orientation="vertical"
    android:paddingBottom="@dimen/x5"
    android:paddingLeft="@dimen/x15"
    android:paddingTop="@dimen/y15"></LinearLayout>

进度条布局:

        

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="@dimen/x10"
    android:gravity="center_vertical"
    android:orientation="horizontal">

    <LinearLayout
        android:id="@+id/lin_coma"
        android:layout_width="@dimen/x75"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:maxEms="5"
            android:singleLine="true"
            android:ellipsize="end"
            android:text="哈/哈/哈啊啊啊啊啊"
            android:textColor="#ff969696"
            android:textSize="12sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/bar_container"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_marginRight="@dimen/x10"
        android:gravity="left|center_vertical"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/bar"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/y12"
            android:background="#0CD3F4" />

        <TextView
            android:id="@+id/percent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="0.00%"
            android:layout_marginLeft="@dimen/x10"
            android:layout_marginRight="@dimen/x10"
            android:textColor="@color/color_light_bule"
            android:textSize="12sp" />
    </LinearLayout>

</LinearLayout>

通过往linnarlayout中循环添加布局实现进度条

//获取data集合中包含的进图条数据,循环添加到一个新的double集合中,
  private void showColumnar(List<SuccessCaseMyMainlistBean.DataBean> data) {
        doubles = new ArrayList<>();
        for (int i = 0; i < data.size(); i++) {
            int progress = data.get(i).getArticleNumber();
            doubles.add(progress);
        }
//切记在每次开始加载时清空linearlayout的UI
        linearlayout.removeAllViews();
        //赋值
        for (int i = 0; i < data.size(); i++) {
            //随机产生一个进度
//            final double ranNum = Math.random() * 100;
            int ranNum = data.get(i).getArticleNumber();
            if (ranNum <= 0) {
                ranNum = 0;
            }
            //设置最大值
            final int finalMaxScale = Collections.max(doubles);

            item = LayoutInflater.from(context).inflate(R.layout.success_columnar_item, linearlayout, false);
            LinearLayout lincoma = item.findViewById(R.id.lin_coma);
            TextView name = item.findViewById(R.id.name);
            TextView percent = item.findViewById(R.id.percent);
            final View bar = item.findViewById(R.id.bar);
            LinearLayout container = item.findViewById(R.id.bar_container);
            name.setText(data.get(i).getJobTitle());
            bar.setBackgroundResource(R.mipmap.line_porgess);
            percent.setText(NumberUtil.formatString(new BigDecimal(ranNum)));
            final double finalRanNum = ranNum;
            //计算出进度条应该显示的宽度
            final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) bar.getLayoutParams();
//            lp.width = (int) ((width - width / 3) * finalRanNum / finalMaxScale);
//用你的屏幕宽度-你的布局中除进度条外其他布局的宽度*进度/最大值
//其中PxUtils是把dp转换为px,确保在不同屏幕下的适配
            lp.width = (int) ((this.width - PxUtils.dpToPx(170, context)) * finalRanNum / finalMaxScale);
            //设置动画,1.5秒内从0.0宽度变成1.0宽度(1.0代表100%)
            final ObjectAnimator anim = ObjectAnimator.ofFloat(bar, "alpha", 0.0F, 1.0F).setDuration(500);
            //动画监听
            anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator valueAnimator) {
                    //事实计算宽度,应该显示的宽度乘以当前进度,再事实设置给bar
                    bar.setLayoutParams(lp);
                }
            });
            //动画开始
            anim.start();
            //设置/隔断并添加隔断到linearlayout
            TextView textView = new TextView(context);
            textView.setHeight(PxUtils.dpToPx(10, context));
            linearlayout.addView(textView);
            //添加item到添加隔断到linearlayout
            linearlayout.addView(item);
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值