千家信息网

Android如何自定义圆角柱状图

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章主要为大家展示了"Android如何自定义圆角柱状图",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Android如何自定义圆角柱状图"这篇文章吧。
千家信息网最后更新 2025年02月23日Android如何自定义圆角柱状图

这篇文章主要为大家展示了"Android如何自定义圆角柱状图",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Android如何自定义圆角柱状图"这篇文章吧。

具体内容如下

需求:

画一个圆角柱状图,显示12个月的数据,Y轴数据动态分割,如果是当前月,就画出当前月图片;点击柱状图变色,并显示虚线弹出当前月信息,滑动时弹框和虚线消失,柱状图刷新到最初。

1.HistogramRound

package com.broker.liming.widget; import android.annotation.TargetApi;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.DashPathEffect;import android.graphics.Paint;import android.graphics.Path;import android.graphics.Rect;import android.os.Build;import android.support.annotation.Nullable;import android.support.v4.content.ContextCompat;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewConfiguration; import com.broker.liming.R;import com.broker.liming.bean.ChartData;import com.broker.liming.utils.ArithUtil;import com.broker.liming.utils.LogUtil2; import java.text.DecimalFormat;import java.util.ArrayList;import java.util.List; /** * @author chenhuirong * @Date 2018/12/10 * @Description zhu */ public class HistogramRound extends ChartYdate {    private int[] rect_color;    private int rect_text_color;//矩形文字颜色    private int rect_big_text_color;//矩形最大文字颜色     private int rect_text_size;//矩形文字尺寸     private getNumberListener listener;    private int selectIndex = -1;    private int yHeightSelect=0;    private int leftSelector=0;    private boolean isScrollow;//true 滑动 false点击     private List selectIndexRoles = new ArrayList<>();    private List objects=new ArrayList<>();     public HistogramRound(Context context) {        super(context);    }     public HistogramRound(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initStyle(context,attrs);    }     public HistogramRound(Context context, AttributeSet attrs) {        super(context, attrs);        initStyle(context,attrs);    }    /*     * 初始化样式属性     */    private void initStyle(Context context,AttributeSet attrs) {        TypedArray types = context.obtainStyledAttributes(attrs, R.styleable.zqxchart_histogram);        coordinates_color = types.getColor(R.styleable.zqxchart_histogram_hCoordinatesColor, Color.RED);        rect_text_color = types.getColor(R.styleable.zqxchart_histogram_rectTextColor,Color.BLACK);        rect_big_text_color=getResources().getColor(R.color.text_yellow);        rect_text_size = types.getInteger(R.styleable.zqxchart_histogram_rectTextSize,28);         x_text_color = types.getColor(R.styleable.zqxchart_histogram_hxTextColor,Color.BLACK);        y_text_color = types.getColor(R.styleable.zqxchart_histogram_hyTextColor,Color.BLACK);        x_text_size = types.getInteger(R.styleable.zqxchart_histogram_hxTextSize,30);        y_text_size = types.getInteger(R.styleable.zqxchart_histogram_hyTextSize,28);        xpCount = types.getInteger(R.styleable.zqxchart_histogram_hxPointCount,12);        ypCount = types.getInteger(R.styleable.zqxchart_histogram_hyPointCount,12);        rect_color = getResources().getIntArray(R.array.histogram_color);        animType = types.getInteger(R.styleable.zqxchart_histogram_hanimType, Anim.ANIM_NONE);        types.recycle();    }     @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        if (xData!=null&&yData!=null){            drawHistogramRound(canvas);        }     }     /*     * 画柱状图     */    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    private void drawHistogramRound(Canvas canvas) {        //如果没有设置x轴数据        if (xData == null){            throw new NullPointerException("x轴数据源不能为空!");        }        //如果没有设置y轴数据        if (yData == null){            throw new NullPointerException("y轴数据源不能为空!");        }        Paint histogramPaint = new Paint();//        histogramPaint.setAntiAlias(true);        histogramPaint.setStyle(Paint.Style.FILL);        histogramPaint.setStrokeWidth((float) 4.0);        histogramPaint.setStrokeCap(Paint.Cap.ROUND);        //矩形上具体数据画笔        Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);//        tv_mudi.setTextSize(TypedValue.COMPLEX_UNIT_PX,getResources().getDimension(R.dimen.font_13));//        textPaint.setTextSize(rect_text_size);         Paint mPaintCircle = new Paint(Paint.ANTI_ALIAS_FLAG);//        mPaintCircle.setStyle(Paint.Style.ANTI_ALIAS_FLAG);//        mPaintCircle.setStrokeWidth(2);        mPaintCircle.setColor(Color.parseColor("#ff5932"));        mPaintCircle.setPathEffect(new DashPathEffect(new float[]{4, 4}, 0));        mPaintCircle.setAntiAlias(true);        textPaint.setTextSize(getResources().getDimension(R.dimen.font_9));        DecimalFormat formater = new DecimalFormat("0.000");        for (int i=0; i=yMax){                textPaint.setColor(rect_big_text_color);            }else {                textPaint.setColor(rect_text_color);            }            LogUtil2.log("yData--------------->ydataY轴上的数据"+ydata);            //画矩形上文字//            canvas.drawText(ydata,left+20,textY,textPaint);            //计算每条柱状图的宽度//            double tempBarWidth = (((int) mXinterval) >> 1) / mCategoryList.size();//            mBarPaint.setStrokeWidth((float) tempBarWidth);            if (selectIndex==i){                histogramPaint.setColor(ContextCompat.getColor(getContext(), R.color.name_ffa646));                //draw x 坐标                yHeightSelect= (int) top/*-getPaddingTop() */- getPaddingBottom()-xTextSurplus-x_text_size;                yHeightSelect= (int) (/*(oY+75)-(*/top/*+getPaddingTop()/)*/);                leftSelector= (int) (left+(right-left)/2);//                canvas.drawLine(oX,top, oX,top-yHeight,mPaintCircle);                Path path = new Path();                path.moveTo(oX, oX+xWidth+40);                path.lineTo(oX, oX+xWidth+40);//                canvas.drawPath(path, mPaintCircle);//                canvas.drawLine(oX,top,oX+xWidth+40,top,mPaintCircle);                if (!isScrollow){                 listener.getNumber(i, (int) oY, leftSelector,yHeightSelect, (int) oX);                }                LogUtil2.log("setSelect--画:--getHeight"+getHeight()+"--left--"+left+"--height--"+yHeightSelect+"--top--"+top+"--oy--"+oY);             }else {                histogramPaint.setColor(ContextCompat.getColor(getContext(), R.color.color_1FA6FB));             }            //画每一个矩形            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){                //画圆角柱只在5.0以上版本适用,以下版本会闪退                canvas.drawRoundRect(left,top,right,oY,30,30,histogramPaint);            }else {                canvas.drawRect(left,top,right,oY,histogramPaint);            }             objects.add(histogramPaint);        }     }     public void setPublicRefresh(){        selectIndex=-1;        invalidate();        for (int i=0;i

2.ChartYdate

package com.broker.liming.widget; import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.support.v4.content.ContextCompat;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View; import com.broker.liming.R;import com.broker.liming.bean.ChartData;import com.broker.liming.utils.DensityUtil;import com.broker.liming.utils.DoubleUtils;import com.broker.liming.utils.LogUtil2; import java.math.BigDecimal;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List; /** * @author chenhuirong * @Date 2018/12/10 * @Description  统计图 * * */public class ChartYdate extends View {     protected final int xSurplus = 0;//x轴留余    protected final int ySurplus = 20;//y轴留余    protected final int xTextSurplus = 150;//x轴文字留余    protected final int yTextSurplus = 100;//y轴文字留余    protected float oX;//原点x    protected float oY;//原点y    protected int xWidth;//x轴宽度    protected int yHeight;//y轴高度    protected int xSpacing;//x轴坐标间距    protected int ySpacing;//y轴坐标间距    protected int xpCount = 7;//x轴坐标点数    protected int ypCount = 7;//y轴坐标点数    protected int[] xCoordinates;//x轴坐标点    protected int[] yCoordinates;//y轴坐标点    protected float yMax = 0f;//y轴最大刻度值    protected String[] xData;//x轴数据    protected float[] yData;//y轴数据    protected int coordinates_color;//坐标系颜色    protected int x_text_size;//x轴文字尺寸    protected int y_text_size;//y轴文字尺寸    protected int x_text_color;//x轴文字颜色    protected int y_text_color;//y轴文字颜色     protected boolean isAnim = true;    protected Anim[] anims;//动画数组    protected long interval = 100;//动画执行间隔    protected int animType = -2;//动画    private Paint mTableValuePaint;//    private getNumberListener listener;//    private int selectIndex = -1;//    private List selectIndexRoles = new ArrayList<>();     public ChartYdate(Context context) {        super(context);    }     public ChartYdate(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }     public ChartYdate(Context context, AttributeSet attrs) {        super(context, attrs);    }     @Override    protected void onDraw(Canvas canvas) {        LogUtil2.log("yData--------------->onDraw画布"+ypCount);        initChartYdateProp();        initCoordinateSystem(canvas);        //开始动画        if (isAnim){            initAnims();            post(animator);            isAnim = false;        }    }    /*     * 初始化统计图属性     */    private void initChartYdateProp() {        //x轴宽度        xWidth = getWidth() - getPaddingLeft() - getPaddingRight() - yTextSurplus;        //y轴宽度        yHeight = getHeight() - getPaddingTop() - getPaddingBottom() - xTextSurplus;        //x轴每个刻度的间距        xSpacing = (xWidth-xSurplus-xWidth%xpCount)/xpCount;        //y轴每个刻度的间距        ySpacing = (yHeight-ySurplus-yHeight%ypCount)/ypCount;        //坐标系原点x        oX = getPaddingLeft()+yTextSurplus;        //坐标系原点y  减70为了画出当月图片        oY = getPaddingTop()+yHeight+xTextSurplus/2-70;        //x轴各刻度点位置        xCoordinates = new int[xpCount];        //y轴各刻度点位置        yCoordinates = new int[ypCount];        //记录x轴刻度点位置  修改柱形图离坐标原点的距离        for (int i=0; iypCount记录y轴刻度点位置"+ypCount);        //记录y轴刻度点位置        for (int j=0; jhenghe"+yCoordinates[j]);        }        LogUtil2.log("yData--------------->yCoordinates记录y轴刻度点位置"+yCoordinates.length);    }    /*     * 初始化坐标系     */    private void initCoordinateSystem(Canvas canvas){        Paint mainPaint = new Paint();        mainPaint.setColor(coordinates_color);        mainPaint.setAntiAlias(true);        //draw x 坐标//        canvas.drawLine(oX,oY, oX,oY-yHeight,mainPaint);        //draw y 坐标//        canvas.drawLine(oX,oY,oX+xWidth+40,oY,mainPaint);        //刻度值画笔        Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        textPaint.setColor(getResources().getColor(R.color.transparent));        mTableValuePaint = new Paint();        mTableValuePaint.setStrokeWidth(DensityUtil.dip2px(getContext(), 0.04f));        mTableValuePaint.setStyle(Paint.Style.FILL);        mTableValuePaint.setColor(ContextCompat.getColor(getContext(), R.color.text_666666));        mTableValuePaint.setAntiAlias(true);        mTableValuePaint.setTextSize(DensityUtil.dip2px(getContext(), 13));        //draw x 刻度        for (int i=0; i0){                int[] textSize = getTextSize(xData[i],textPaint);                //计算x轴文字x,y坐标偏移量                int textX = textSize[0]/2;                int textY = xTextSurplus/2 - textSize[1]/2;                //画x轴文字                canvas.drawText(xData[i],oX+xCoordinates[i]-textX,oY+textY,textPaint);                String[] strNow = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString().split("-");                Integer year = Integer.parseInt(strNow[0]);                Integer month = Integer.parseInt(strNow[1]);                //画当前月图片 + DensityUtil.dip2px(mContext, 6)                if (month == Integer.parseInt(xData[i])) {                    Bitmap arrow = BitmapFactory.decodeResource(getResources(), R.mipmap.current_month);                    RectF rectF = new RectF((float) (oX+xCoordinates[i]-textX - DensityUtil.dip2px(getContext(), 10)),                            (float) (oY+textY+60 - DensityUtil.dip2px(getContext(), 15)),                            (float) (oX+xCoordinates[i]-textX + DensityUtil.dip2px(getContext(), 20)),                            (float) (oY+textY+70 - DensityUtil.dip2px(getContext(), 3)));                    canvas.drawBitmap(arrow, null, rectF, textPaint);                }            }        }        if(yMax == 0f){            yMax = getYMax();        }        if(getYMax()==0){            yMax=1.0f;        }         //draw y 刻度        for (int j=0; j=2){                baseMax= Integer.valueOf(mBigst.substring(0, 2))+1;            }            boolean isBreak=false;            int margCount=0;             String  ii="";//画y轴最大值            String aa="";//间隔            for (int i=baseMax;i0;a--){                    if (i%a==0&&i/a<=6&&i/a>=4){                        margCount=i/a;                        ii= String.valueOf(i);                        aa=String .valueOf(a);                        isBreak=true;                        break;                    }                }                if (isBreak)                    break;            }            for (int y=0;y=2){                baseMax= Integer.valueOf(mBigst.substring(0, 2))+1;            }            boolean isBreak=false;            String aa="";//间隔值            String ii="";//y轴最大            int margCount=0;//分多少份,动态设置            for (int j=baseMax;j0;a--){                    if (j%a==0&&j/a<=6&&j/a>=4){                        margCount=j/a;                        aa=String.valueOf(a);                        ii=String.valueOf(j);                        isBreak=true;                        break;                    }                }                if (isBreak)                    break;            }             for (int y=0;y

3.布局 activity_family_status嵌套在Scrollowview中

                                               

4.运用FamilyStatusActivity

package com.broker.liming.activity; import android.content.Context;import android.content.Intent; import android.support.annotation.RequiresApi;import android.support.v4.widget.NestedScrollView;import android.support.v7.widget.LinearLayoutManager;import com.broker.liming.utils.ArithUtil;import com.broker.liming.utils.BarUtils;import com.broker.liming.utils.GsonUtils;import com.broker.liming.utils.LogUtil2;import com.broker.liming.utils.UIHelper;import com.broker.liming.widget.HistogramData;import com.broker.liming.widget.HistogramRound;import com.broker.liming.widget.TitleBar; import org.json.JSONException; import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;import java.util.List; import butterknife.BindView; import static com.sobot.chat.utils.ScreenUtils.dip2px;import static com.sobot.chat.utils.ScreenUtils.px2dip; /** * @Descpription:家庭现状 * @Date: 2019/7/17. * @author:chenhuirong */ public class FamilyStatusActivity extends BaseActivity{       @BindView(R.id.histogramchart)    HistogramRound histogramChart;     @BindView(R.id.scrollowview)    NestedScrollView scrollowview;    private FamilyStatusAdapter adapter;    private FamilyStatusRateAdapter rateAdapter;    private  HistogramData histogramData;    //柱状图//    @BindView(R.id.my_single_chart_view)//    SingleView mMySingleChartView;    @BindView(R.id.rl_single)    RelativeLayout rlSingle;    private List singlelist;    private LinearLayout llSingle;    private double mMax = 44;    private List listData = new ArrayList<>();    private String monthBack;      float[] ydata = new float[12];    private String[] xdata= new String[12] ;    private String[] xdataShow= new String[12] ;//仅为显示    private boolean isScrollow=true;    private boolean isFresh=false;    int margCount=0;//共分多少份    private LinearLayout line;    private String name;    public static void actionStart(Context context, String familyUuid,String names) {        Intent intent = new Intent(context, FamilyStatusActivity.class);        intent.putExtra("familyUuid", familyUuid);        intent.putExtra("name",names);        context.startActivity(intent);    }    @Override    protected void initTitleBar() {        TitleBar titleBar = (TitleBar) findViewById(R.id.title_bar);        assert titleBar != null;        /*titleBar.setLeftBackground(R.mipmap.back);*/        titleBar.setLeftBackground(R.mipmap.order_back);         titleBar.setTitle(name+"的家庭数据分析");        titleBar.setTitleColor(R.color.text_000000);         titleBar.setTitleBarBg(getResources().getColor(R.color.white));        titleBar.setLeftClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                finish();            }        });    }     @Override    protected int getContentView() {        return R.layout.activity_family_status;    }    @Override    protected boolean initBundle(Bundle bundle) {           }      @Override    public void initData() {        super.initData();     }     @Override    protected void onResume() {        super.onResume();             getPieDate(familyUuid);    }     public void getHomeData() {        try {            UserBean query = UserBeanDao.query();            requestServerPostForm(false, 100, HttpParams.getFamilyStatus(query, familyUuid));         } catch (JSONException e) {            e.printStackTrace();        }    }     @Override    public void initView() {        xdata=new String[]{"1","2","3","4","5","6","7","8","9","10","11","12"};        xdataShow=new String[]{"01","02","03","04","05","06","07","08","09","10","11","12"};         initSingle();         scrollowview.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                LogUtil2.log("onDraw--getX---isScrollow" +isScrollow);                float x=0;                float y=0;                switch (event.getAction()) {                    case MotionEvent.ACTION_DOWN:                        x = event.getX();                        y = event.getY();                         LogUtil2.log("onDraw--getX---down" + event.getX() + "---" + y);                        break;                    case MotionEvent.ACTION_MOVE:                        LogUtil2.log("onDraw--getX---move:" + event.getX() + "---");//                        isFresh=true;                        //在此刷新柱状图,防止多次刷新,多次重绘                        if (isScrollow){                            rlSingle.removeView(llSingle);                            rlSingle.removeView(line);                            histogramChart.setPublicRefresh();//                            histogramChart.isScrollow(isFresh);                            isScrollow=false;                        }                        break;                    case MotionEvent.ACTION_CANCEL:                    case MotionEvent.ACTION_UP://                        //允许ScrollView截断点击事件,ScrollView可滑动                        LogUtil2.log("onDraw--getX---up" + event.getX() + "mLastWownY:" + event.getY()+"x差值:"+Math.abs(ArithUtil.sub(event.getX(), x))+"--y差值:"+ Math.abs(ArithUtil.sub(event.getY(), y))  );                         //抬起坐标减去放下坐标绝对值小于20代表点击,否则代表滑动                       /* if (Math.abs(ArithUtil.sub(event.getX(), x)) <= 20 && Math.abs(ArithUtil.sub(event.getY(), y)) <= 20) {//                            isScrollow=false;                            isCheck=true;                        }else {//                            isScrollow=true;                            isCheck=false;                            histogramChart.isScrollow(false);                            rlSingle.removeView(llSingle);                            rlSingle.removeView(line);                            if (isScrollow){                                histogramChart.setPublicRefresh();                                isScrollow=false;                            }                        }*/                        break;                }                 return false;            }        });        changeStatusBarTextColor(true);        BarUtils.setColorNoTranslucent(this, getResources().getColor(R.color.white));    }     /**     * 弹出弹框     */     private void initSingle(){        rlSingle = (RelativeLayout) findViewById(R.id.rl_single);        singlelist = new ArrayList<>();        rlSingle.removeView(llSingle);        rlSingle.removeView(line);         histogramChart.setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                LogUtil2.log("onDraw--getX---弹框的长按事件:" + isScrollow);                return false;            }        });          histogramChart.setListener(new HistogramRound.getNumberListener() {            @Override            public void getNumber(int index, int height, int left,int selectorHeight,int ox) {//                rlSingle.removeAllViews();                LogUtil2.log("onDraw--getX---弹框:" + isScrollow);                isScrollow=true;//                if(!isFresh){                     rlSingle.removeView(llSingle);                    rlSingle.removeView(line);                    line= (LinearLayout) LayoutInflater.from(FamilyStatusActivity.this).inflate(R.layout.layout_dash_line, null); //                TextView view=new TextView(mContext);//              view.setBackground(mContext.getResources().getDrawable(R.drawable.shape_dash_line));                    RelativeLayout.LayoutParams viewParam=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);viewParam. topMargin=height-selectorHeight;                    viewParam.topMargin=selectorHeight-5;                    viewParam.leftMargin=dip2px(mContext,40);                    viewParam.rightMargin=dip2px(mContext,30);                    line.setLayoutParams(viewParam);                    rlSingle.addView(line);                     llSingle = (LinearLayout) LayoutInflater.from(FamilyStatusActivity.this).inflate(R.layout.layout_pro_expense, null);                    LinearLayout ll_back=(LinearLayout)llSingle.findViewById(R.id.ll_back);                    TextView tvMoney = (TextView) llSingle.findViewById(R.id.tv_month);                    TextView tv_money=(TextView) llSingle.findViewById(R.id.tv_money);                    if (singlelist!=null&&singlelist.size()>0){                        tv_money.setText(formatTosepara2(singlelist.get(index))+"");                    }else {                        tv_money.setText("0");                    }                    String[] strNow = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString().split("-");                    String year = strNow[0];                    tvMoney.setText(year+"-"+xdataShow[index]);                    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,                            RelativeLayout.LayoutParams.WRAP_CONTENT);                     LogUtil2.log("setSelect--callback--"+height+"--left---"+left+"---"+selectorHeight+"弹框高--"+dip2px(mContext,60)+"--差值--"+(height-(height-selectorHeight/*+px2dip(mContext,70)*/)-dip2px(mContext,60)));                    LogUtil2.log("----宽-----+++"+params.width);                    LogUtil2.log("setSelect--转换"+px2dip(mContext,height)+"--left---"+px2dip(mContext,left)+"---"+dip2px(mContext,selectorHeight));                    int topmargin=0;                    int leftmargin=0;                    LogUtil2.log("setSelect--差距"+px2dip(mContext,height-selectorHeight));                    if (index+1>6){                        if (height-(height-selectorHeight)-dip2px(mContext,60)-dip2px(mContext,5)>0){                            ll_back.setBackground(mContext.getResources().getDrawable(R.mipmap.right_bottom));                            topmargin=height-(height-selectorHeight)-dip2px(mContext,60)-dip2px(mContext,5)/*+dip2px(mContext,70)*/;                        }else {                            topmargin= height-(height-selectorHeight)+dip2px(mContext,5)/*+dip2px(mContext,70)*/;                            ll_back.setBackground(mContext.getResources().getDrawable(R.mipmap.right_top));                        }//                        leftmargin=left-dip2px(mContext,150)+dip2px(mContext,40);                    }else {                        if (height-(height-selectorHeight)-dip2px(mContext,60)-dip2px(mContext,5)>0){                            ll_back.setBackground(mContext.getResources().getDrawable(R.mipmap.left_bottom));                            topmargin=height-(height-selectorHeight)-dip2px(mContext,60)-dip2px(mContext,5);                        }else {                            ll_back.setBackground(mContext.getResources().getDrawable(R.mipmap.left_top));                            topmargin=height-(height-selectorHeight)+dip2px(mContext,5);                        }                        leftmargin=left;                    }                    params.leftMargin = leftmargin;                    //相当于总布局的上方,需要减去家庭保费和保费距离                    params.topMargin=topmargin/* selectorHeight+px2dip(mContext,64)*/;//                LogUtil2.log("setSelect--callback--"+histogramChart.getHeight()+"---"+selectorHeight+"---left"+ params.topMargin);//                if (x - 100 < 0) {//                    params.leftMargin = 0;//                } else if (x - 100 > relativeLayout.getWidth() - llSingle.getMeasuredWidth()) {//                    params.leftMargin = relativeLayout.getWidth() - llSingle.getMeasuredWidth();//                }                     llSingle.setLayoutParams(params);                    rlSingle.addView(llSingle);//                }            }        });    }     private void changeStatusBarTextColor(boolean isBlack) {        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {            if (isBlack) {                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);//设置状态栏黑色字体            }else {                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);//恢复状态栏白色字体            }        }    }      private void setDate(FamilyYearCheakBean yearCheakBean) {         if (yearCheakBean != null) {            if (yearCheakBean.familyPremiumTotal != null && !yearCheakBean.familyPremiumTotal.equals("")) {                tv_total_money.setText("合计年缴"+formatTosepara(Double.valueOf(String.valueOf(yearCheakBean.familyPremiumTotal))) + "元");            }else {                tv_total_money.setText("合计年缴0.00元");             }             String[] strNow = new SimpleDateFormat("yyyy-MM-dd").format(new Date()).toString().split("-");            Integer year = Integer.parseInt(strNow[0]);            Integer month = Integer.parseInt(strNow[1]);            listData = yearCheakBean.familyPremiumArray;            List list = new ArrayList<>();            ArrayList temp = new ArrayList();             for (int i = 0; i < listData.size(); i++) {                FamilyPremiumArrayBean bean = listData.get(i);                String yearback = bean.MONTH.substring(0, bean.MONTH.indexOf("-"));                monthBack = bean.MONTH.substring(bean.MONTH.lastIndexOf("-") + 1);//                mXdots[i] = yearback + "年\n" + monthBack + "月";                list.add(Double.valueOf(bean.premium));                double premium = 0;                if (bean.premium != null && !bean.premium.equals("")) {                    premium = Double.valueOf(bean.premium);                    list.add(Double.valueOf(bean.premium));                    singlelist.add(Float.valueOf(bean.premium));                    ydata[i]=Float.valueOf(bean.premium);                 }                DotVo tempDotVo = new DotVo(monthBack, premium);                temp.add(tempDotVo);             }             Double[] toBeStored = list.toArray(new Double[list.size()]);            mMax = checkMax(toBeStored);         }        //向下取整        int att=(int) Math.floor(mMax);        String mBigst=String.valueOf(att);        int maxLength=mBigst.length();        int baseMax= att+1;        if (maxLength>=2){            baseMax= Integer.valueOf(mBigst.substring(0, 2))+1;        }        boolean isBreak=false;         for (int i=baseMax;i0;a--){                if (i%a==0&&i/a<=6&&i/a>=4){                    margCount=i/a;                    isBreak=true;                    break;                }            }            if (isBreak)                break;        }        for (int i=0;i max) {                max = args[i];            }        }        return max;    }    @Override    protected void onSuccess(String response, int id) {        super.onSuccess(response, id);         switch (id){                      case 200:                yearCheakBean= GsonUtils.toObject(response,FamilyYearCheakBean.class);                             setDate(yearCheakBean);                              break;         }     }      /**     * 将float类型的数据转换成以4位逗号隔开的字符串,并且保留两位有效数字     */    public String formatTosepara(double data) {        int length = String.valueOf(data).split("\\.")[0].length();        if (length < 4) {            return String.format("%.2f", data);        }        DecimalFormat df = new DecimalFormat("#,####.00");        return df.format(data);    }    public String formatTosepara2(double data) {        int length = String.valueOf(data).split("\\.")[0].length();        if (length < 4) {            return String.format("%.2f", data);        }        DecimalFormat df = new DecimalFormat("##,###");        return df.format(data);    } }

5.HistogramData

package com.broker.liming.widget; import com.broker.liming.bean.ChartData; /** * @author chenhuirong * @Date 2018/12/10 * @Description 柱状图s */ public class HistogramData extends ChartData {    private int[] rectColor;    private int rectTextColor;    private int rectTextSize;     private HistogramData(Builder builder) {        setXdata(builder.xdata);        setYdata(builder.ydata);        setXpCount(builder.xpCount);        setYpCount(builder.ypCount);        setCoordinatesColor(builder.coordinatesColor);        setxTextSize(builder.xTextSize);        setyTextSize(builder.yTextSize);        setxTextColor(builder.xTextColor);        setyTextColor(builder.yTextColor);        setyMax(builder.yMax);        setInterval(builder.interval);        setAnimType(builder.animType);        setRectColor(builder.rectColor);        setRectTextColor(builder.rectTextColor);        setRectTextSize(builder.rectTextSize);    }     public static Builder builder() {        return new Builder();    }     public int[] getRectColor() {        return rectColor;    }     public void setRectColor(int[] rectColor) {        this.rectColor = rectColor;    }     public int getRectTextColor() {        return rectTextColor;    }     public void setRectTextColor(int rectTextColor) {        this.rectTextColor = rectTextColor;    }     public int getRectTextSize() {        return rectTextSize;    }     public void setRectTextSize(int rectTextSize) {        this.rectTextSize = rectTextSize;    }     public static final class Builder{        private int rectTextSize;        private int rectTextColor;        private int[] rectColor;        private int animType;        private int interval;        private int yMax;        private int yTextColor;        private int xTextColor;        private int yTextSize;        private int xTextSize;        private int coordinatesColor;        private int ypCount;        private int xpCount;        private float[] ydata;        private String[] xdata;         private Builder(){}         public Builder setRectTextSize(int val) {            rectTextSize = val;            return this;        }         public Builder setRectTextColor(int val) {            rectTextColor = val;            return this;        }         public Builder setRectColor(int[] val) {            rectColor = val;            return this;        }         public Builder setAnimType(int val) {            animType = val;            return this;        }         public Builder setInterval(int val) {            interval = val;            return this;        }         public Builder setYMax(int val) {            yMax = val;            return this;        }         public Builder setYTextColor(int val) {            yTextColor = val;            return this;        }         public Builder setXTextColor(int val) {            xTextColor = val;            return this;        }         public Builder setYTextSize(int val) {            yTextSize = val;            return this;        }         public Builder setXTextSize(int val) {            xTextSize = val;            return this;        }         public Builder setCoordinatesColor(int val) {            coordinatesColor = val;            return this;        }         public Builder setYpCount(int val) {            ypCount = val;            return this;        }         public Builder setXpCount(int val) {            xpCount = val;            return this;        }         public Builder setYdata(float[] val) {            ydata = val;            return this;        }         public Builder setXdata(String[] val) {            xdata = val;            return this;        }         public HistogramData build() {            return new HistogramData(this);        }    }}

6.ChartData

package com.broker.liming.bean; /** * 统计图父类数据类 * Created by zqx on 16/6/27. */public class ChartData {    protected String[] xdata;    protected float[] ydata;    protected int xpCount;    protected int ypCount;    protected int coordinatesColor;    protected int xTextSize;    protected int yTextSize;    protected int xTextColor;    protected int yTextColor;    protected int yMax;    protected int interval;    protected int animType = -2;     protected ChartData(){}     public String[] getXdata() {        return xdata;    }     public void setXdata(String[] xdata) {        this.xdata = xdata;    }     public float[] getYdata() {        return ydata;    }     public void setYdata(float[] ydata) {        this.ydata = ydata;    }     public int getXpCount() {        return xpCount;    }     public void setXpCount(int xpCount) {        this.xpCount = xpCount;    }     public int getYpCount() {        return ypCount;    }     public void setYpCount(int ypCount) {        this.ypCount = ypCount;    }     public int getCoordinatesColor() {        return coordinatesColor;    }     public void setCoordinatesColor(int coordinatesColor) {        this.coordinatesColor = coordinatesColor;    }     public int getxTextSize() {        return xTextSize;    }     public void setxTextSize(int xTextSize) {        this.xTextSize = xTextSize;    }     public int getyTextSize() {        return yTextSize;    }     public void setyTextSize(int yTextSize) {        this.yTextSize = yTextSize;    }     public int getxTextColor() {        return xTextColor;    }     public void setxTextColor(int xTextColor) {        this.xTextColor = xTextColor;    }     public int getyTextColor() {        return yTextColor;    }     public void setyTextColor(int yTextColor) {        this.yTextColor = yTextColor;    }     public int getyMax() {        return yMax;    }     public void setyMax(int yMax) {        this.yMax = yMax;    }     public int getInterval() {        return interval;    }     public void setInterval(int interval) {        this.interval = interval;    }     public int getAnimType() {        return animType;    }     public void setAnimType(int animType) {        this.animType = animType;    }}

以上是"Android如何自定义圆角柱状图"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0