自定义控件CustomView(炒股界面 显示 时间与价格 还有折线)

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 布局文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值