安卓自定义view模拟每隔一定时间更新股市


代码如下:

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文件添加了自定义布局:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值