Android自定义圆柱图

public class YunaZhuView extends View {
    private int textSize;        //底部字体的大小
    private int mWindowWidth;  //屏幕宽
    private int mWindowHeight;//屏幕高
    //view宽
    private int mViewWidth;
    //view高
    private int mViewHeight;
    //左边距
    private int mMarginLeft;
    //画笔
    private Paint mShouSuoYaPaint; //画圆柱的画笔
    //画笔
    private Paint mShuZhangYaPaint; //上面椭圆的画笔
    //线和下方字体画笔
    private Paint mLinePaint;
    //上方画笔
    private Paint mTopPaint;
    private float mDiBuHeight;
    private float mShouSuoYatop;
    private List<DataEnty> datas = new ArrayList<>();  //图表数据
    private int cell = 50;  //柱子之间的间隙

    /**
     * 类中动态创建
     *
     * @param context
     */
    public YunaZhuView(Context context) {
        this(context, null);
    }

    /**
     * 在布局中创建
     *
     * @param context
     * @param attrs
     */
    public YunaZhuView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    /**
     * 在布局和类中创建
     *
     * @param context
     * @param attrs
     * @param defStyleAttr
     */
    public YunaZhuView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mDiBuHeight = 50;
        textSize = 30;
        mWindowHeight = getScreenHeight(context);

        mWindowWidth = getScreenWidth(context);

       // mViewHeight = getSize(270);

       // mViewWidth = mWindowWidth / 14;

        mMarginLeft = getSize(100);
        mShouSuoYatop = mViewHeight;

        mShouSuoYaPaint = new Paint();
        mShouSuoYaPaint.setColor(Color.BLUE);


        mShuZhangYaPaint = new Paint();
        mShuZhangYaPaint.setColor(Color.parseColor("#2f78ff"));


        mLinePaint = new Paint();
        mLinePaint.setColor(Color.parseColor("#000000"));
        mLinePaint.setTextSize(textSize);


        mTopPaint = new Paint();
        mTopPaint.setTextSize(30);
        mTopPaint.setColor(Color.parseColor("#969696"));


    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        mViewHeight = h-getSize(20);

        mViewWidth = w / 14;
    }

    /**
     * 用来画view的方法
     *
     * @param canvas 画布
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        List<Integer> number = new ArrayList<>();

        for (int i = 0;  i < datas.size(); i++) {

            number.add(datas.get(i).getNumber());
        }

        if(number.size()>0){
        //取出数组中的最大值计算图的比例,防止因为数字过大或者过小显示不出或者显示不全
        int max = Collections.max(number);

        for (int i = 0; i < datas.size(); i++) {
            float bili1 = (float) (datas.get(i).getNumber() / (float)(max+40));
            mShouSuoYatop = mViewHeight-bili1 * mViewHeight;
            LinearGradient linearGradient;
            //改变倒数第三根柱子的渐变色
            if(i==datas.size()-3){
                mShuZhangYaPaint.setColor(Color.parseColor("#fcc357"));
                mShouSuoYaPaint.setColor(Color.parseColor("#feaf3b"));
                //设置渐变色
                linearGradient  = new LinearGradient(mMarginLeft + mViewWidth * i + i*getSize(cell),mShouSuoYatop+((mViewHeight*bili1)-getSize(10))+getSize(20),mMarginLeft + mViewWidth * i + mViewWidth+i*getSize(cell),mShouSuoYatop+getSize(10), Color.parseColor("#feaf3b"), Color.parseColor("#ffe37e"), Shader.TileMode.REPEAT);
            }else{

                mShuZhangYaPaint.setColor(Color.parseColor("#2f78ff"));
                mShouSuoYaPaint.setColor(Color.BLUE);
                linearGradient  = new LinearGradient(mMarginLeft + mViewWidth * i + i*getSize(cell),mShouSuoYatop+((mViewHeight*bili1)-getSize(10))+getSize(20),mMarginLeft + mViewWidth * i + mViewWidth+i*getSize(cell),mShouSuoYatop+getSize(10), Color.parseColor("#2f78ff"), Color.parseColor("#72aefe"), Shader.TileMode.REPEAT);
            }

            mShouSuoYaPaint.setShader(linearGradient);

            //循环画圆柱
            canvas.drawRect(mMarginLeft+i*getSize(cell) + mViewWidth * i, mShouSuoYatop+getSize(10), mMarginLeft +i*getSize(cell)+ mViewWidth * i + mViewWidth, mViewHeight-getSize(10), mShouSuoYaPaint);

            if(datas.get(i).getNumber()!=0){
            //画上面部分的椭圆
            RectF rectF = new RectF(mMarginLeft + mViewWidth * i+i*getSize(cell),mShouSuoYatop,mMarginLeft + mViewWidth * i + mViewWidth+i*getSize(cell),mShouSuoYatop+getSize(20));
            canvas.drawOval(rectF,mShuZhangYaPaint);

            //画下面部分的椭圆
            RectF rectF2 = new RectF(mMarginLeft + mViewWidth * i+i*getSize(cell),mShouSuoYatop+((mViewHeight*bili1)-getSize(10))-getSize(20),mMarginLeft + mViewWidth * i + mViewWidth+i*getSize(cell),mShouSuoYatop+((mViewHeight*bili1)-getSize(10))+getSize(20));

            canvas.drawOval(rectF2,mShouSuoYaPaint);

            }


            Paint.FontMetrics fontMetrics = mLinePaint.getFontMetrics();

            float v1 = mLinePaint.measureText(String.valueOf(datas.get(i).getDate()));

            float x2 = (mViewWidth - v1) / 2 + mMarginLeft + mViewWidth * (i) +i*getSize(cell);

            float y1 = ((mDiBuHeight - (Math.abs(fontMetrics.ascent) - Math.abs(fontMetrics.descent))) / 2) + mViewHeight;

            canvas.drawText(String.valueOf(datas.get(i).getDate()), x2, y1+getSize(40), mLinePaint);


            float v3 = mLinePaint.measureText(String.valueOf(datas.get(i).getNumber()));

            float x3 = (mViewWidth - v3) / 2 + mMarginLeft + mViewWidth * i +i*getSize(cell);

            canvas.drawText(String.valueOf(datas.get(i).getNumber()), x3, mShouSuoYatop - getSize(10), mTopPaint);

        }

        }

    }

    public void setEnty(List<DataEnty> enty) {
        datas.clear();
        datas.addAll(enty);
        invalidate();
    }


    private int getSize(int size){

        //因为用的1080手机做的适配  所以这里除以1080

        float  a = Float.parseFloat(mWindowWidth+"")/(1080f/ Float.parseFloat(size+""));

        return (int) a;
    }


    /**
     * 获取屏幕宽度
     *
     * @return
     */
    public  int getScreenWidth(Context context) {
        return context.getResources().getDisplayMetrics().widthPixels;
    }

    /**
     * 获取屏幕高度
     *
     * @return
     */
    public  int getScreenHeight(Context context) {
        return context.getResources().getDisplayMetrics().heightPixels;
    }
}

 


实体类代码
public class DataEnty {

    private int number;

    private String date;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

使用方式

for (int j = 0; j < 5; j++) {

    DataEnty dataEnty = new DataEnty();

    dataEnty.setDate("2022-03-"+(j+6));

    dataEnty.setNumber(100+(j*21));

    dataEntyList.add(dataEnty);
}

my_yuanzhu.setEnty(dataEntyList);

 

没怎么写过博客,写的都是项目中用到的,可能有点乱,大家勉强看吧

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值