CustomView 自定义控件继承View
public class CustomView extends View {
int viewWidth, viewHeight;
int gap;
ArrayList<HashMap<String, String>> list;
int maxPrice;
int touchY;
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
touchY=(int) event.getY();
int x=(int) event.getX();
Log.i("坐标", x+",gap="+gap);
int index=x/gap;
Toast.makeText(getContext(), list.get(index).get("time"), Toast.LENGTH_SHORT).show();
return super.onTouchEvent(event);
}
// textView.setText()
public void setData(ArrayList<HashMap<String, String>> list) {
this.list = list;
for (int i = 0; i < list.size(); i++) {
int price = Integer.parseInt(list.get(i).get("price"));
if (price > maxPrice) {
maxPrice = price;
}
}
}
// 画
@Override
protected void onDraw(Canvas canvas) {
try {
Log.i("测试", "onDraw()");
Paint paint = new Paint();
paint.setColor(Color.BLACK);
// 画背景
Rect backgroundRect = new Rect(0, 0, viewWidth, viewHeight);
canvas.drawRect(backgroundRect, paint);
// 画时间
paint.setColor(Color.WHITE);
paint.setTextSize(24);
String lastTime = list.get(list.size() - 1).get("time");
Rect rect = new Rect();
paint.getTextBounds(lastTime, 0, lastTime.length(), rect);
int lastTimeWidth = rect.width();
gap = (viewWidth - lastTimeWidth * 2) / (list.size() - 1);
int priceHeight = viewHeight - rect.height();
for (int i = 0; i < list.size(); i++) {
String time = list.get(i).get("time");
canvas.drawText(time, i * gap, viewHeight, paint);
// 画price
String strPrice = list.get(i).get("price");
int intPrice = Integer.parseInt(strPrice);
int priceY = intPrice * priceHeight / maxPrice;
// 最大的值显示在下面,应该显示在上面
priceY = priceHeight - priceY;
// 最大的值显示在控件的外面
priceY = priceY + rect.height();
canvas.drawText(strPrice, i * gap, priceY, paint);
// 画线
if (i < list.size() - 1) {
int startX = i * gap;
int startY = priceY;
int stopX = (i + 1) * gap;
int stopY = 0;
String strNextPrice = list.get(i + 1).get("price");
int nextPriceY = Integer.parseInt(strNextPrice)
* priceHeight / maxPrice;
nextPriceY = priceHeight - nextPriceY;
nextPriceY = nextPriceY + rect.height();
stopY = nextPriceY;
canvas.drawLine(startX, startY, stopX, stopY, paint);
}
}
//画线
paint.setColor(Color.RED);
if (touchY>=1)
{
canvas.drawLine(0, touchY, viewWidth, touchY, paint);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
viewHeight = h;
viewWidth = w;
}
}
在activity中
public class MainActivity extends Activity {
CustomView customView;
Random random=new Random();
Handler handler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
customView=(CustomView) findViewById(R.id.customView);
customView.setData(getData());
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.i("测试", "run");
customView.setData(getData());
//直接调用
//customView.onDraw(canvas)
//屏幕无效--》重新画 调ondraw
//间接调用handler.sendMessage, handleMessage()
//sendBroadcast onReceiver()
//如保让界面更新
//1,textView.setText()
//2,adapter.notifyDataSetChanged()
//3,invalidate()
customView.invalidate();
//延迟1秒 再从新执行这个run
handler.postDelayed(this, 1000);
}
}, 1000);
}
public ArrayList<HashMap<String, String>> getData()
{
//9 3000
//10 4000
//11 5000
//13 6000
ArrayList<HashMap<String, String>> list=new ArrayList<HashMap<String,String>>();
HashMap<String, String> map=new HashMap<String, String>();
map.put("time", "9");
map.put("price", String.valueOf(random.nextInt(5000)));
list.add(map);
map=new HashMap<String, String>();
map.put("time", "10");
map.put("price", String.valueOf(random.nextInt(5000)));
list.add(map);
map=new HashMap<String, String>();
map.put("time", "11");
map.put("price", String.valueOf(random.nextInt(5000)));
list.add(map);
map=new HashMap<String, String>();
map.put("time", "13");
map.put("price", String.valueOf(random.nextInt(5000)));
list.add(map);
return list;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
layout 布局文件