这个主要介绍自定义view添加滑动事件,就用上篇文章中的条形图了,主要是看添加滑动,这个图就不贴了,我不会弄gif,需要的自己复制代码看效果吧
public class BarChartView extends View {
private int mWindowWidth; //屏幕宽
private int mViewWidth; //view宽
private int mViewHeight; //view高
private List<DataEnty> datas = new ArrayList<>(); //图表数据
private Paint barChartPaint; //条形图画笔
private Paint coordinatePaint; //坐标系画笔
private Paint bgPaint; //坐标系画笔
private Paint textPaint; //文字画笔
private int distance = 100; //边距的大小,用于留地方写文字
private int mMarginLeft; //左边距
private int cell = 50; //柱子之间的间隙
private int barWidth = 50; //柱子的宽度
private float startX = 0;//按下的坐标
private float xInit = 0f;//第一个点X的坐标
private float maxXInit = 0f;//第一个点对应的最大x坐标
private float minXInit = 0f;//第一个点对应的最小X坐标
public BarChartView(Context context) {
super(context);
}
public BarChartView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public BarChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mViewHeight = h;
mViewWidth = w;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int layerId = canvas.saveLayer(0F, 0F, mViewWidth, mViewHeight, null, Canvas.ALL_SAVE_FLAG);
mWindowWidth = DimenUtils.getScreenWidth();
//初始化画笔
barChartPaint = new Paint();
barChartPaint.setColor(Color.RED);
barChartPaint.setAntiAlias(true);
coordinatePaint = new Paint();
coordinatePaint.setColor(Color.BLUE);
coordinatePaint.setTextSize(30);
coordinatePaint.setAntiAlias(true);
coordinatePaint.setStrokeWidth(5);
textPaint = new Paint();
textPaint.setTextSize(40);
textPaint.setAntiAlias(true);
textPaint.setColor(Color.CYAN);
mMarginLeft = getSize(100);
bgPaint = new Paint();
bgPaint.setColor(Color.parseColor("#00000000"));
//画X轴
canvas.drawLine(getSize(distance),mViewHeight-getSize(distance),mViewWidth+getSize(distance),mViewHeight-getSize(distance),coordinatePaint);
//画Y轴
canvas.drawLine(getSize(distance),mViewHeight-getSize(distance),getSize(distance),0,coordinatePaint);
List<Integer> number = new ArrayList<>();
for (int i = 0; i < datas.size(); i++) {
number.add(datas.get(i).getNumber());
}
//取出数组中的最大值计算图的比例,防止因为数字过大或者过小显示不出或者显示不全
int max = Collections.max(number);
//绘制柱子
for (int i = 0; i < datas.size(); i++) {
float scale = (float) (datas.get(i).getNumber() / (float)(max+200));
//循环画圆柱
canvas.drawRect(mMarginLeft+mMarginLeft+i*getSize(cell) + (getSize(barWidth)) * i+xInit, (mViewHeight-scale * (mViewHeight-getSize(getSize(distance))))-getSize(distance), mMarginLeft +i*getSize(cell)+ getSize(barWidth) * i + getSize(barWidth)+xInit, mViewHeight-getSize(distance), barChartPaint);
float v3 = textPaint.measureText(String.valueOf(datas.get(i).getNumber()));
float x3 = (mMarginLeft +i*getSize(cell)+ getSize(barWidth) * i + getSize(barWidth)+getSize(barWidth/2))-getSize(v3/2)+xInit;
canvas.drawText(String.valueOf(datas.get(i).getNumber()), x3, (mViewHeight-scale * (mViewHeight-getSize(distance)))-getSize(distance+20), textPaint);
//绘制X轴文字
canvas.drawText(datas.get(i).getDate(),x3,mViewHeight-getSize(50),coordinatePaint);
}
// 将折线超出x轴坐标的部分截取掉
bgPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawRect(0F, 0F, distance, mViewHeight, bgPaint);
bgPaint.setXfermode(null);
canvas.restoreToCount(layerId);
for (int i = 0; i < 7; i++) {
//绘制Y轴的文字
float textWidth = coordinatePaint.measureText(String.valueOf(datas.get(i).getNumber()));
canvas.drawText(String.valueOf(i*100),textWidth/2,mViewHeight-getSize(distance)-(((mViewHeight-getSize(distance))/7)*i),coordinatePaint);
}
}
private int getSize(int size){
//因为用的1080手机做的适配 所以这里除以1080
float a = Float.parseFloat(mWindowWidth+"")/(1080f/ Float.parseFloat(size+""));
return (int) a;
}
private float getSize(float size){
//因为用的1080手机做的适配 所以这里除以1080
float a = Float.parseFloat(mWindowWidth+"")/(1080f/ Float.parseFloat(size+""));
return a;
}
public void setData(List<DataEnty> enty) {
datas.clear();
datas.addAll(enty);
invalidate();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startX = event.getX();
minXInit = getWidth() - (getWidth() - getSize(distance)) * 0.1f - getSize(distance) * (datas.size() - 1) - distance / 2 ;//减去0.
break;
case MotionEvent.ACTION_MOVE:
if (distance * datas.size() - distance > getWidth() - getSize(distance) - distance) { //当期的宽度不足以呈现全部数据
float dis = event.getX() - startX;
if (Math.abs(dis) > 3) {
getParent().requestDisallowInterceptTouchEvent(true);
}
startX = event.getX();
if (xInit + dis < minXInit) {
xInit = minXInit;
} else if (xInit + dis > maxXInit) {
xInit = maxXInit;
} else {
xInit += dis;
}
invalidate();
}
break;
}
return true;
}
}
实体类
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;
}
}