代码如下:
package com.example.customview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import android.R.color;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class CustomView extends View {
ArrayList<HashMap<String, String>> list1;
ArrayList<HashMap<String, String>> list2;
int viewWidth,viewHeight;
int xGap;//时间间距
int maxPrice;//最大价格
Random random=new Random();
boolean isRunning=true;
private int y;
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
//每秒获取一个数据
new Thread(new Runnable() {
@Override
public void run() {
while(isRunning){
try {
list1=getData1();
list2=getData2();
y=0;
postInvalidate();
Thread.currentThread().sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
private ArrayList<HashMap<String, String>> getData1() {
ArrayList<HashMap<String, String>> list=
new ArrayList<HashMap<String,String>>();
HashMap<String, String> map1=new HashMap<String, String>();
map1.put("time","9");
map1.put("price",String.valueOf(random.nextInt(6000)));
list.add(map1);
HashMap<String, String> map2=new HashMap<String, String>();
map2.put("time","10");
map2.put("price",String.valueOf(random.nextInt(6000)));
list.add(map2);
HashMap<String, String> map3=new HashMap<String, String>();
map3.put("time","11");
map3.put("price",String.valueOf(random.nextInt(6000)));
list.add(map3);
HashMap<String, String> map4=new HashMap<String, String>();
map4.put("time","13");
map4.put("price",String.valueOf(random.nextInt(6000)));
list.add(map4);
//求最大价格
for(int i=0;i<list.size();i++){
HashMap<String,String> map=list.get(i);
int currentPrice=Integer.parseInt(map.get("price"));
if(currentPrice>maxPrice){
maxPrice=currentPrice;
}
}
Log.i("TAG", "最大价格="+maxPrice);
return list;
}
private ArrayList<HashMap<String, String>> getData2() {
ArrayList<HashMap<String, String>> list=
new ArrayList<HashMap<String,String>>();
HashMap<String, String> map1=new HashMap<String, String>();
map1.put("time","9");
map1.put("price",String.valueOf(random.nextInt(6000)));
list.add(map1);
HashMap<String, String> map2=new HashMap<String, String>();
map2.put("time","10");
map2.put("price",String.valueOf(random.nextInt(6000)));
list.add(map2);
HashMap<String, String> map3=new HashMap<String, String>();
map3.put("time","11");
map3.put("price",String.valueOf(random.nextInt(6000)));
list.add(map3);
HashMap<String, String> map4=new HashMap<String, String>();
map4.put("time","13");
map4.put("price",String.valueOf(random.nextInt(6000)));
list.add(map4);
//求最大价格
for(int i=0;i<list.size();i++){
HashMap<String,String> map=list.get(i);
int currentPrice=Integer.parseInt(map.get("price"));
if(currentPrice>maxPrice){
maxPrice=currentPrice;
}
}
Log.i("TAG", "最大价格="+maxPrice);
return list;
}
@Override
protected void onDraw(Canvas canvas) {
// 画背景,最好画矩形
Paint paint=new Paint();
paint.setColor(Color.BLACK);
paint.setTextSize(18);
Rect rectbackground=new Rect(0 , 0, viewWidth, viewHeight);
canvas.drawRect(rectbackground, paint);
onDrawList(canvas,list1,paint);
onDrawList(canvas,list2,paint);
//点击屏幕画一条线
canvas.drawLine(0, y, viewWidth, y, paint);
}
private void onDrawList(Canvas canvas,ArrayList<HashMap<String, String>> list,Paint paint) {
int timeHeight=40;
int lastPriceWidth = 48;
//画时间
//计算最后一个时间字符串的宽度
//int lastWidth = getLastPriceWidth(paint);
paint.setColor(0xFFFFFFFF);
xGap=viewWidth/(list.size()-1);//求间距
xGap = (viewWidth - lastPriceWidth) / (list.size() - 1);
for(int i=0;i<list.size();i++){
HashMap<String, String> map=list.get(i);
String time=map.get("time");
int timeLeft=xGap*i;
int timeTop=viewHeight;
canvas.drawText(time, timeLeft, timeTop, paint);
//画价格
//显示价格区域的宽度
int priceHeight=viewHeight-timeHeight;
int currentPrice=Integer.parseInt(map.get("price"));
int priceTop=currentPrice*priceHeight/maxPrice;
//问题:越大的显示在最下面;解决:
priceTop=priceHeight-priceTop;
//问题:最大价格不显示;解决:
priceTop=priceTop+24;
canvas.drawText(map.get("price"), timeLeft, priceTop, paint);
//画线
if(i<list.size()-1){
int startX=timeLeft;
int startY=priceTop;
int stopX=xGap*(i+1);
int stopPrice=Integer.parseInt(list.get(i+1).get("price"));
int stopTop=stopPrice*priceHeight/maxPrice;
int stopY=priceHeight-stopTop+24;
canvas.drawLine(startX, startY, stopX, stopY, paint);
}
}
}
//求字符串宽度
public int getLastPriceWidth(Paint paint,ArrayList<HashMap<String, String>> list){
Rect rect=new Rect();
HashMap<String, String> map=list.get(list.size()-1);
String lastTime=map.get("time");
Log.i("TAG","要画的时间是:"+lastTime);
paint.getTextBounds(lastTime, 0,lastTime.length() , rect);
int strwid = rect.width();
return strwid;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
y=(int) event.getY();
invalidate();
return super.onTouchEvent(event);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// TODO Auto-generated method stub
super.onSizeChanged(w, h, oldw, oldh);
viewWidth=w;
viewHeight=h;
}
}
main文件没有写任何代码和layout文件添加了自定义布局: