运行效果图。

一、前言

最近公司要求做一个支付报表,里面就涉及到一个支付方式的统计。很多人第一时间想到的可能就是Echarts,其实也是可以实现。但是一个简单的条形统计图,思想向后没必要搞得那么复杂吧。不就一个textview带个渐变的背景色吗?行吧,就用textview做吧。

二、正文

1、先把每一个统计方式的布局撸出来xml代码如下

<?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:background="@color/white"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:paddingVertical="5dp">

<ImageView
        android:id="@+id/imgType"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:src="@mipmap/hb" />

<LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginHorizontal="10dp"
        android:layout_weight="1"
        android:orientation="vertical">

<LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:orientation="horizontal">

<com.example.myapp.PriceTextView
                android:id="@+id/tv_money"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="¥0.00"
                android:textColor="@color/textColor"
                android:textSize="10sp" />

<TextView
                android:id="@+id/tv_num"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="40dp"
                android:gravity="center"
                android:text="0笔"
                android:textColor="@color/textColor"
                android:textSize="12sp" />
        </LinearLayout>

<LinearLayout
            android:id="@+id/bar_container"
            android:layout_width="match_parent"
            android:layout_height="15dp"
            android:background="@drawable/gray_10_bg"
            android:orientation="vertical">

<TextView
                android:id="@+id/bar"
                android:layout_width="wrap_content"
                android:layout_height="15dp"
                android:background="@drawable/columnar_yellow_bg" />

</LinearLayout>

</LinearLayout>

</LinearLayout>

2、列表数据填充

package com.example.myapp;

import android.animation.ObjectAnimator;
import android.app.Activity;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

/**
 * 横向柱状图
 * Created by Kwon on 2019/12/5 9:54.
 */
public class ColumnarView {

private final LinearLayout mLinearLayout;
    private final Activity mActivity;

public ColumnarView(Activity activity, LinearLayout linearLayout) {
        this.mActivity = activity;
        this.mLinearLayout = linearLayout;
    }

/**
     * 显示支付方式柱状图(横图)
     */
    public void showPayColumnar() {
        mLinearLayout.removeAllViews();
        /*筛选进度条的最大值*/
        double finalMaxScale = 100;

for (int i = 0; i < 6; i++) {
            View item = LayoutInflater.from(mActivity).inflate(R.layout.columnar_pay_item, mLinearLayout, false);
            PriceTextView tvMoney = item.findViewById(R.id.tv_money);
            TextView tvNum = item.findViewById(R.id.tv_num);
            ImageView imgType = item.findViewById(R.id.imgType);
            View bar = item.findViewById(R.id.bar);
            LinearLayout barContainer = item.findViewById(R.id.bar_container);
            /*添加item到添加隔断到linearlayout*/
            mLinearLayout.addView(item);

/*金额*/
            double payAmount = i * 6;

/*支付方式*/
            String payTypeName = "支付方式";
            /*支付进度条背景色*/
            bar.setBackgroundResource(getPayColor(payTypeName));
            /*支付金额*/
            tvMoney.parsePrice(payAmount).showSymbol(payTypeName + "¥");
            /*支付笔数*/
            String payNum = i + "笔";
            tvNum.setText(payNum);

item.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                    item.getViewTreeObserver().removeOnPreDrawListener(this);
                    /*计算出进度条可用宽度(进度条到最后屏幕的宽度-后面显示%的宽度)*/
                    int initWidth = barContainer.getWidth();
                    /*计算出进度条应该显示的宽度*/
                    LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) bar.getLayoutParams();
                    if (finalMaxScale != 0) {
                        lp.width = (int) (initWidth * payAmount / finalMaxScale);
                    }
                    bar.setLayoutParams(lp);
                    /*定时器*/
                    item.postDelayed(() -> {
                        /*获取bar应该显示宽度*/
                        int barWidth = bar.getWidth();
                        /*设置动画,1.5秒内从0.0宽度变成1.0宽度(1.0代表100%)*/
                        ObjectAnimator anim = ObjectAnimator.ofFloat(bar, "alpha", 0.0F, 1.0F).setDuration(2000);
                        /*动画监听*/
                        anim.addUpdateListener(valueAnimator -> {
                            /*事实计算宽度,应该显示的宽度乘以当前进度,再事实设置给bar*/
                            float cVal = (Float) anim.getAnimatedValue();
                            lp.width = (int) (barWidth * cVal);
                            bar.setLayoutParams(lp);
                        });
                        /*动画开始*/
                        anim.start();
                    }, 0);
                    return false;
                }
            });
        }
    }

/**
     * 根据支付方式返回对于颜色
     *
     * @param payName
     */
    public static int getPayColor(String payName) {
        switch (payName) {
            case "微信支付":
                return R.drawable.columnar_green_bg;
            case "支付宝":
                return R.drawable.columnar_blue_bg;
            case "刷卡":
                return R.drawable.columnar_red500_bg;
            case "花呗":
                return R.drawable.columnar_blue500_bg;
            case "云闪付":
                return R.drawable.columnar_red_bg;
            default:
                return R.drawable.columnar_yellow_bg;
        }
    }
}

3、在需要的地方调用下就可以了,直接上代码

package com.example.myapp;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity {

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

LinearLayout llyPay = findViewById(R.id.llyPay);

ColumnarView columnarView = new ColumnarView(MainActivity.this, llyPay);
        columnarView.showPayColumnar();
    }
}

怎么样?是不是超级简单。

三、总结

相对于使用Echarts来说,我觉得使用textview+动画来的更加简单。有不足之处,望各位大神赐教!谢谢。

使用TextView实现带动画的统计图相关推荐

  1. 我的Android进阶之旅------Android利用温度传感器实现带动画效果的电子温度计

    要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...

  2. Android利用温度传感器实现带动画效果的电子温度计

    概述 Android利用温度传感器实现带动画效果的电子温度计. 详细 一.准备工作 需要准备一部带有温度传感器的安卓手机,或者使用有温度传感器的模拟器. 二.程序实现 1.需要截图程序结构 2.实现思 ...

  3. Android高效率实现弹出带动画效果的对话框,仿照微信对话框效果

    转载请注明出处: http://blog.csdn.net/jakeyangchina/article/details/53423453 看到很多app页面里都有弹出对话框效果,今天使用PopupWi ...

  4. Android实现GridView的item长按拖动删除完美实现(带动画效果)

    领导这几天让做一个项目,就是可以实现像支付宝首页一样的可以长按拖动,删除的界面,以前没做过,领导让我做的时候觉得简直是老虎吃天,无从下手啊,可是领导的任务还是要实现的,没办法,就自己网上找咯,但是网上 ...

  5. 仿支付宝输入支付密码2(带动画)

    由于用对话框做输入支付密码会出现宽度无法充满,这次我用popwindow来做,功能效果更加容易扩展:这次提供源码噢,有兴趣的可以下载去参考下,带动画噢: 先看看效果图把: 主界面只有这么简单,就不多在 ...

  6. Android 自定义view画带指针带动画的上半圆弧刻度盘

    之前工作中有用到环形进度条等的,为了赶进度都是在网上找到相似的效果的然后再进行修改.一直都想自己画一个,今天就和大家一起来学习刻度盘的绘制. 先看一下截图: 效果演示请看 刻度盘演示 代码下载:Cal ...

  7. iOS提示气泡,带动画

    1.效果如图: 从项目中抠出来的,做了简单的封装. 2.用法: //顶部提示HYNoticeView *noticeTop = [[HYNoticeView alloc] initWithFrame: ...

  8. HTML5动态圆形导航,jQuery带动画特效的圆形导航菜单特效

    这是一款jQuery带动画特效的圆形导航菜单特效.该导航菜单在被点击时,会以动画的方式移动到屏幕中间,并展开为一个圆形菜单,效果非常炫酷. 使用方法 在页面中引入jquery和TweenMax.js的 ...

  9. animate用法 js原生_用 原生Javascript 创建带动画的固顶导航菜单

    当我们在网页中加入一个导航菜单的时候,需要考虑很多因素.如何确定它的位置?如何定义样式?还需要保证它具有良好的响应性.又或者你想为它添加一些炫酷的动画.这时你可能会对 jQuery 感兴趣,因为它会帮 ...

最新文章

  1. cxgrid 行合并单元格_【Excel VBA】如何批量撤销合并单元格?
  2. linux openssh升级8.1,Centos7利用rpm升级OpenSSH到openssh-8.1p1版本
  3. ssl2661-廉价最短路径【SPFA】
  4. 如何在不到1ms的延迟内完成100K TPS
  5. [vue] 说说你对vue的表单修饰符.lazy的理解
  6. RHEL 4 安装单实例oracle 10g
  7. POJ 2396 有上下界的可行流
  8. pageoffice提示网络连接意外错误
  9. 替换Android中VM 加载动态库方式
  10. awr报告 解读_关于AWR报告的解析
  11. qs计算机圣安排名,圣安德鲁斯大学世界排名及专业排名汇总(QS世界大学排名版)...
  12. 图像生成论文阅读:GLIDE算法笔记
  13. 7-114 用if-else语句编程百分制成绩转换为五分制成绩
  14. k8s各组件的端口说明
  15. 【Quectel移远展锐平台5G模组RX500U/RG200U使用指南(三)-PCIE】
  16. android system.err 是什么意思,android – java.lang.IllegalStateException是什么意思?
  17. 2018这一年读过的那些书
  18. C#中HP-Socket通信组件详解
  19. 基于filebeat + logstash的日志收集方案
  20. cfa一级需要计算机吗,CFA一级考试计算机怎么使用?

热门文章

  1. 表白html特效在线,html5 canvas酷炫表白爱心动画特效
  2. 【爱江山越野跑】ITRA积分认证流程
  3. 壮美大山包-2017中国大山包国际超百公里ITRA积分赛赛记
  4. 【图普科技】边界框的数据增强(二) ——缩放和平移
  5. 移动通讯技术区别于计算机,移动通信技术与计算机通信技术融合发展探析
  6. 我是线程,这是我的自传(趣文)
  7. 计算机毕业设计Java高考填报信息系统(源码+系统+mysql数据库+Lw文档)
  8. Ubuntu上使用GitHub的步骤
  9. OGG 的最新版本Version 11.2.1.0.25 BLR 19358139– 1 September 2014
  10. 小程序按月份查询账单