日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > 綜合技術(shù) > 一步步搞定Android行情K線蠟燭圖(帶十字光標(biāo))

一步步搞定Android行情K線蠟燭圖(帶十字光標(biāo))

來源:程序員人生   發(fā)布時間:2017-02-18 08:53:37 閱讀次數(shù):6539次

行情K線圖也就是我們常說的燭炬圖,是金融類軟件里可以說必不可少的,不管日K, 周K,月K,還是分鐘K,準(zhǔn)確的來表達個股在1定時間內(nèi)漲跌走勢,K線圖有著不可疏忽的作用,其繪制進程也是彰顯1個程序員對自定義控件的熟練程度,特別是對Canvas的靈活應(yīng)用,繪線,繪邊框,及位置的選取,比例的分配,今天這個Demo,則1步步為你詮釋。


按慣例,先看下今天要實現(xiàn)的效果,全部Demo地址為:http://download.csdn.net/detail/ming_147/9732963,也能夠關(guān)注公眾號后(評論區(qū)第1條評論掃描便可)回復(fù)“行情k線圖”,源碼就會發(fā)送給您,公眾號有很多android及其它技術(shù)文章,還請大家承蒙關(guān)注。




相對來講比較簡單的1個小Demo,為何來講簡單呢,1數(shù)據(jù)是固定的,2,時間是固定的,相比較實際項目中來講,這已相當(dāng)?shù)暮唵瘟耍覀兛梢院唵蔚姆?下步驟模塊,然后再依照順次來進行實現(xiàn),通過上面的圖片,我們可以大致分為,邊框,橫線,縱線,底部時間,左側(cè)刻度,柱狀圖(燭炬圖),10字光標(biāo)這幾個部份,好,分好以后,我們就來1步步實現(xiàn)吧。


由于代碼稍多,為顯得代碼結(jié)構(gòu)清晰,我們可以先寫1個父類,用于實現(xiàn)邊框,橫縱線,及底部時間,左部刻度的繪制,柱狀圖(燭炬圖)及10字光標(biāo)我們放在子類中實現(xiàn)。


自定義1個父類繼承于View,實現(xiàn)其構(gòu)造方法,在onMeasure方法里設(shè)置View的大小:


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpecheightMeasureSpec);
    
setMeasuredDimension(measureWidth(widthMeasureSpec),
            
measureHeight(heightMeasureSpec));
}


private int measureWidth(int measureSpec) {
    int result = 0;
    int 
specMode = MeasureSpec.getMode(measureSpec);//得到模式
    
int specSize = MeasureSpec.getSize(measureSpec);//得到尺寸

    
if (specMode == MeasureSpec.EXACTLY) {
        result = specSize;
    
else if (specMode == MeasureSpec.AT_MOST) {
        result = Math.min(resultspecSize);
    
}
    return result;
}

private int measureHeight(int measureSpec) {
    int result = 0;
    int 
specMode = MeasureSpec.getMode(measureSpec);
    int 
specSize = MeasureSpec.getSize(measureSpec);

    if 
(specMode == MeasureSpec.EXACTLY) {
        result = specSize;
    
else if (specMode == MeasureSpec.AT_MOST) {
        result = Math.min(resultspecSize);
    
}
    return result;
}




這里簡單對兩個類型做下解釋:


MeasureSpec.EXACTLY是精確尺寸,當(dāng)我們將控件的layout_widthlayout_height指定為具體數(shù)值時如:andorid:layout_width="50dip",或為FILL_PARENT是,都是控件大小已肯定的情況,都是精確尺寸。


MeasureSpec.AT_MOST
是最大尺寸,當(dāng)控件的layout_widthlayout_height指定為WRAP_CONTENT時,控件大小1般隨著控件的子空間或內(nèi)容進行變化,此時控件尺寸只要不超過父控件允許的最大尺寸便可。因此,此時的modeAT_MOSTsize給出了父控件允許的最大尺寸。


設(shè)置完大小以后,我們先在構(gòu)造方法里初始化1些信息,比如背風(fēng)景,畫筆:


/**
 * 
設(shè)置背風(fēng)景及初始化畫筆
 */
private void init() {
    setBackgroundColor(Color.parseColor("#222222"));
    
mPaint new Paint();
    
mPaint.setStrokeWidth(1);
    
mPaint.setStyle(Paint.Style.STROKE);
}


重寫onDraw方法,并在方法內(nèi)繪制相干信息。繪制邊框,距離左上各位10,距離右側(cè)為View寬度-10,距離底部為View高度-50:


private void drawBorder(Canvas canvas) {
    mPaint.setColor(Color.WHITE);
    
Rect r = new Rect();
    
r.left 10;
    
r.top 10;
    
r.right this.getRight() - 10;
    
r.bottom this.getHeight() - 50;
    
canvas.drawRect(rmPaint);
}


繪制橫線,由于要留出1段區(qū)域做刻度繪制,所以,距離左側(cè)要有1段距離,這里我設(shè)置的100,所以每條橫線的起始位置1定,都是100,由于邊框的最右側(cè)為View寬度-10,所以橫線的終止位置也是1致,起始y的位置和終止y的位置應(yīng)當(dāng)1致,依照1定的距離等分開來,這里的lineSize是要分成幾份,我定義的是4份,則每份的長度就為:(當(dāng)前View的高度-距離底部的距離-距離上部的距離)/lineXSize:


private int lineXSize 4;

private void drawXLine(Canvas canvas) {
    mPaint.setColor(Color.WHITE);
    float 
height = (this.getHeight() - 10f 50f) / lineXSize;//平均分為幾分
    
for (int a = 0a < lineXSizea++) {
        float h = height * a + 10f;
        
Log.i("BaseLine"h + "===");
        
canvas.drawLine(100fh, this.getRight() - 10fhmPaint);
    
}
}


繪制縱線,其原理和繪制橫線差不多,起始x的位置為距離左側(cè)的距離既100,則每份的寬度就是,(當(dāng)前View的寬度-距離左側(cè)的距離-距離右側(cè)的距離)/要分為幾份,這里我定義的是lineYSize=3:


private int lineYSize 3;

private void drawYLine(Canvas canvas) {
    mPaint.setColor(Color.WHITE);
    float 
width = (this.getRight() - 10f 100f) / lineYSize;
    for 
(int a = 0a < lineYSizea++) {
        float w = width * a + 100f;
        
canvas.drawLine(w10fw, this.getHeight() - 50fmPaint);
    
}
}


繪制底部時間,times是自己定義的1個時間數(shù)組,其坐標(biāo)位置和縱線類似,y值是固定不變的,x軸增加的距離和縱線1致:


private int[] times = {5678};

private void drawTimes(Canvas canvas) {
    mPaint.setColor(Color.parseColor("#FF00FF"));
    
mPaint.setTextSize(24);
    float 
width = (this.getRight() - 10f 100f) / lineYSize;
    for 
(int a = 0a < lineYSize 1a++) {
        float w = width * a + 100f;
        if 
(a == lineYSize) {
            canvas.drawText(times[a] + ""w - 30f, this.getHeight() - 25fmPaint);
        
else {
            canvas.drawText(times[a] + ""w - 15f, this.getHeight() - 25fmPaint);
        
}
    }
}


繪制Y軸價格刻度,價格刻度的繪制,就和繪制橫線有點類似了,price是自己定義的1個刻度數(shù)組:


private float[] price = {260f240f220f};

private void drawYPrice(Canvas canvas) {
    mPaint.setColor(Color.WHITE);
    float 
height = (this.getHeight() - 10f 50f) / lineXSize;//平均分為幾分
    
for (int a = 1a < lineXSizea++) {
        float h = height * a + 10f;
        
canvas.drawText(price[a - 1] + ""40fhmPaint);
    
}
}


經(jīng)過以上父 類中的繪制,基本的邊框,橫線,縱線,底部時間,左部價格刻度,就完成了,接下來就是柱狀圖和10字光標(biāo):

自定義1個view集成于父類,實現(xiàn)其構(gòu)造方法,初始化1些信息,設(shè)置畫筆為實心的:


private void init() {
    mPaint new Paint();
    
mPaint.setStrokeWidth(1);
    
mPaint.setStyle(Paint.Style.FILL);
}


繪制燭炬圖之前,我們需要初始化1些我們需要的數(shù)據(jù),這里我定義了1個javaBean,里面我定義了1些數(shù)據(jù),開盤,收盤,最高,最低,日期,實現(xiàn)其構(gòu)造方法和get,set方法。


/**
 * 
開盤價
 */
private float open;

/**
 * 
最高價
 */
private float high;

/**
 * 
最低價
 */
private float low;

/**
 * 
收盤價
 */
private float close;

/**
 * 
日期
 */
private int date;


javaBean實現(xiàn)以后,我們就能夠添加摹擬數(shù)據(jù)了,畢竟不是真實的項目中,所以數(shù)據(jù),只能自己去創(chuàng)造了,listData是自己定義存儲數(shù)據(jù)的:


protected List<StockLineBean> listData new ArrayList<>();

/**
 * 
添加數(shù)據(jù)
 */
private void setLineData() {
    List<StockLineBean> list = new ArrayList<StockLineBean>();
    
list.add(new StockLineBean(25025124825020170731));
    
list.add(new StockLineBean(24925224825220170730));
    
list.add(new StockLineBean(25025124825020170729));
    
list.add(new StockLineBean(24925224825220170728));
    
list.add(new StockLineBean(24825024725020170727));
    
list.add(new StockLineBean(25625624824820170726));
    
list.add(new StockLineBean(25725825625720170725));
    
list.add(new StockLineBean(25926025625620170724));
    
list.add(new StockLineBean(26126125725920170723));
    
list.add(new StockLineBean(25926025625620170722));
    
list.add(new StockLineBean(26126125725920170721));
    
list.add(new StockLineBean(26026025925920170720));
    
list.add(new StockLineBean(26226226026120170719));
    
list.add(new StockLineBean(26026225926220170718));
    
list.add(new StockLineBean( 生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生

------分隔線----------------------------
分享到:
------分隔線----------------------------
咑尐僦狠壞
積分:3403
6粉絲
10關(guān)注
欄目熱點
關(guān)閉
程序員人生
主站蜘蛛池模板: 午夜香蕉 | 国产中文区4幕区2021 | 97久久久久久久久 | 欧美一区二区三区视频 | 欧美日韩精品一区二区在线播放 | 亚洲成人精品一区二区三区 | 亚洲一区成人 | 欧美福利一区二区 | 99热.com| 91视频一区二区 | 欧美日韩一二三 | 午夜三区 | 在线观看国产视频 | 污视频免费在线观看 | 午夜久久久久久久久 | 日本欧美www | 国产剧情一区 | 91精品国产乱码久久久久久 | 亚洲午夜久久久 | 久久久久久久免费 | 欧美一a一片一级一片 | 亚洲在线视频 | 日韩国产欧美一区二区 | 亚洲经典在线观看 | 日韩av片在线 | jizzjizzjizz亚洲女 | 成人免费观看视频 | 黄色在线观看视频网站 | 日本在线不卡视频 | 国产高潮在线观看 | 久久天堂网 | 高清二区| 国产伦精品一区二区三 | 国产玖玖 | 国产日韩av在线播放 | 精品日韩一区二区 | 99精品国产高清一区二区麻豆 | 久久五月婷 | 精品久久久一区二区 | 懂色av影视一区二区三区 | 美日韩成人 |