android自定义曲线控件,Android自定义折线图

这是一个关于如何使用自定义View在Android中绘制折线图和柱状图的示例。代码中创建了ArrayList来存储数据点,并在onDraw()方法中利用Paint对象绘制图形,包括坐标轴、折线和柱状图。同时,实现了触摸事件监听,当用户点击图表区域时,可以高亮显示相应数据点。
摘要由CSDN通过智能技术生成

list = new ArrayList<>();

private Listlist2 = new ArrayList<>();

private Canvas canvas;

public yuanxing(Context context) {

super(context);

initPaint();

}

public yuanxing(Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

initPaint();

}

public yuanxing(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

initPaint();

}

void initPaint() {

mPaint = new Paint();

mPaint2 = new Paint();

list.add(new mappp(100, 100));

list.add(new mappp(100, 200));

list.add(new mappp(100, 300));

list.add(new mappp(100, 400));

list.add(new mappp(100, 500));

list.add(new mappp(100, 600));

list.add(new mappp(200, 600));

list.add(new mappp(300, 600));

list.add(new mappp(400, 600));

list.add(new mappp(500, 600));

list.add(new mappp(600, 600));

list.add(new mappp(700, 600));

list.add(new mappp(800, 600));

list.add(new mappp(900, 600));

list2.add(new mappp(0, 0));

list2.add(new mappp(10, 30));

list2.add(new mappp(100, 100));

list2.add(new mappp(200, 200));

list2.add(new mappp(300, 200));

list2.add(new mappp(400, 400));

list2.add(new mappp(500, 300));

list2.add(new mappp(600, 500));

list2.add(new mappp(700, 100));

list2.add(new mappp(800, 500));

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

this.canvas = canvas;

mPaint.reset();

mPaint.setAntiAlias(true);

mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);

mPaint.setColor(Color.parseColor("#000000"));

mPaint.setTextSize(30);

mPaint.setStrokeWidth(5);

mPaint2.reset();

mPaint2.setAntiAlias(true);

mPaint2.setFlags(Paint.ANTI_ALIAS_FLAG);

mPaint2.setColor(Color.parseColor("#926DFF40"));

mPaint2.setTextSize(30);

mPaint2.setStrokeWidth(50);

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

canvas.drawCircle(list.get(i).with, list.get(i).height, 10, mPaint);

}

/**

* 纵坐标

* */

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

canvas.drawText(5 - i + "k", list.get(i).with - 60, list.get(i).height + 10, mPaint);

}

/**

* 横坐标

* */

for (int i = 5; i < list.size(); i++) {

canvas.drawText(i - 5 + "k", list.get(i).with - 15, list.get(i).height + 60, mPaint);

}

/**

* 折线图

* */

for (int i = 0; i < list2.size() - 1; i++) {

canvas.drawLine(list2.get(i).with + 100, 600 - (list2.get(i).height), list2.get(i + 1).with + 100, 600 - (list2.get(i + 1).height), mPaint);

}

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

canvas.drawCircle(list2.get(i).with + 100, 600 - list2.get(i).height, 10, mPaint);

}

/**

*柱状图

* */

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

canvas.drawLine(list2.get(i).with + 100, 600, list2.get(i).with + 100, 600 - (list2.get(i).height), mPaint2);

}

canvas.drawLine(100, 100, 100, 600, mPaint);

canvas.drawLine(100, 600, 950, 600, mPaint);

//        canvas.drawLines(foo, mPaint);

}

Listmapp;

public void setMapp(Listmapp) {

this.mapp = mapp;

invalidate();

}

class mappp {

int with;

int height;

private mappp mapp;

public mappp(int with, int height) {

this.with = with;

this.height = height;

}

}

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_MOVE:

case MotionEvent.ACTION_DOWN:

//获取屏幕上点击的坐标

float x = event.getX();

float y = event.getY();

//如果坐标在我们的文字区域内,则将点击的文字改颜色

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

if ((x > list2.get(i).with - 50 + 100 && list2.get(i).with + 50 + 100 > x) && (y > 600 - list2.get(i).height - 50 && 600 - list2.get(i).height + 50 > y)) {

//                       canvas.drawText("asdasd",1200,1200,mPaint2);

linsenter.Touch(i, list2.get(i));

return true;

}

}

break;

case MotionEvent.ACTION_UP:

//点击抬起后,回复初始位置。

return true;

}

//这句话不要修改

return super.onTouchEvent(event);

}

public interface TouchLinsenter {

void Touch(int position, mappp mappp);

}

private TouchLinsenter linsenter;

public void setLinsenter(TouchLinsenter linsenter) {

this.linsenter = linsenter;

}

}

下载地址:http://download.csdn.net/download/u012941592/9928892

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值