千家信息网

Android如何自定义圆角柱状图

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要为大家展示了"Android如何自定义圆角柱状图",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Android如何自定义圆角柱状图"这篇文章吧。
千家信息网最后更新 2026年11月04日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如何自定义圆角柱状图"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

坐标 数据 文字 刻度 柱状 矩形 最大 代表 动画 点位 圆角 事件 原点 颜色 内容 坐标系 宽度 属性 间距 统计 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 喔噻互联网科技有限公司 广东万易互联网科技有限公司惠州分公司 上海睿民互联网科技有限公司 互联网是第几次科技革命的成果 互联网 科技公司 广州互联网科技公司 奇酷互联网科技公司 北京互联网络科技有限公司 智慧科技互联网 沃里互联网科技 滨湖区互联网智能科技产品供应 互联网科技产品 浙江互联网科技研学营 互联网与医疗科技 新兴科技互联网创新大赛颁奖典礼 中国互联网公司排名锤子科技 国大互联网教育科技有限公司薪资 江苏互联网科技小贷 互联网科技新闻 数字互联网科技有限公司 互联网科技项目计划书材料类 来此购互联网科技有限公司 互联网经济与金融科技 彤创互联网科技有限公司 互联网科技圈年度人物 中国新注册互联网科技 求路客互联网科技电话 北京军民互联网科技公司 承德科技产业互联网平台 安徽九吞吴互联网科技有限公司
0