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);
没怎么写过博客,写的都是项目中用到的,可能有点乱,大家勉强看吧