android 自定义柱状图,Android自定义View模拟并实现3D柱状图

先看效果图

f512804442721998ee6c72d7f25a6a6a.png

呈上代码:

自定义View类public class MyBarView extends View {

private Paint barPaint; //柱状图画笔

private Paint shadowPaint; //阴影画笔

private int xOffset=1,yOffset=1; //x和y方向的偏移量

private int startX=100,startY=400,endX=200,endY=1000;

private int layerNum=25; //画布的层数

private int barMargin=50; //每个柱状体之前的间隔

private List percents=new ArrayList<>(); //每种数据的数值,用于计算比例,画出柱状体高度

private int perSum; //每种数据数值的总和

public MyBarView(Context context,int... pers){

super(context);

for(int i=0;i

perSum+=pers[i];

percents.add(pers[i]);

}

init();

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

int rectangleLen=endY-startY; //矩形的长度

for(int i=0;i

int nowStartY=endY-(percents.get(i)*rectangleLen)/perSum; //重新计算矩阵左上角y点的值

for(int j=layerNum;j>=1;j--){ //从后往前画

canvas.drawRect(startX+xOffset*j,nowStartY-yOffset*j,endX+xOffset*j,endY-yOffset*j,barPaint);

if(j==1||j==layerNum) //画阴影

canvas.drawRect(startX+xOffset*j,nowStartY-yOffset*j,endX+xOffset*j,endY-yOffset*j,shadowPaint);

}

int length=endX-startX; //矩形边长

startX+=length+barMargin; //计算下一个柱状体的左上角x点的值

endX+=length+barMargin; //计算下一个柱状体的右下角x点的值

}

}

private void init(){ //初始化控件

barPaint=new Paint();

barPaint.setStyle(Paint.Style.FILL);

barPaint.setColor(Color.RED);

shadowPaint=new Paint();

shadowPaint.setStyle(Paint.Style.STROKE);

shadowPaint.setStrokeWidth(1);

shadowPaint.setColor(Color.parseColor("#515151"));

}

}

MainActivity中创建该Viewpublic class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

}

private void initView(){

MyBarView myBarView=new MyBarView(this,10,20,30,50,60,80);

((FrameLayout)(findViewById(R.id.frame))).addView(myBarView);

}

}

最后是布局文件<?xml version="1.0" encoding="utf-8"?>

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/frame"

android:layout_width="wrap_content"

android:layout_height="wrap_content">

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值