Android 自定義折線圖實現(xiàn)教程

前言:

各位同學大家好,有段時間沒有給大家更新文章了择浊,具體多久我也記不清楚了伤靠。最近重新復習了一下原生安卓的知識點婿着,寫了一個安卓原生自定義折線圖的效果,就想著分享給大家。希望幫助到各位學習和工作竟宋,那份廢話不多說我們正式開始。

效果圖:

image.png

具體實現(xiàn)

  • 自定義 :BrokenView

   private Context mContext;
   private int bWidth,bHeight; // 左邊距 除去下邊距的距離
   private int totalValue, pJValue; // Y的刻度 Y的總值
   private String xStr="x",yStr="y";
   private HashMap<Double, Double>map=new HashMap<>();
   private boolean isShow;
   private int marginB;
   private List<Double> dlk=new ArrayList<>();
   private List<Integer>xList=new ArrayList<>();
   private Point []mPoints;

    public BrokenView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mContext=context;
    }

對外方法

    public  void  setView(HashMap<Double,Double>map,int totalValue,int pJValue,
                          boolean isShow,int marginB){
     this.map=map;
     this.totalValue=totalValue;
     this.pJValue=pJValue;
     this.isShow=isShow;
     this.marginB=marginB;
    }
  • 重寫ondraw 方法
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 把x 坐標從小到大進行排列  保存在一個集合里面
        dlk=Tools.getintformap(map);
        int height=getHeight();
        int width=getWidth();
        bWidth=50;
        bHeight=height-marginB;
        int jSzie=totalValue/pJValue;
        Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.GRAY); //設置畫筆顏色
        paint.setStrokeWidth(1);
        paint.setStyle(Paint.Style.STROKE);
        // 畫橫軸
        for (int i = 0; i < jSzie+1; i++) {
            canvas.drawLine(bWidth,bHeight-(bHeight/jSzie)*i+20,width,bHeight-(bHeight/jSzie)*i+20,paint);
            // 畫Y的刻度
            drawText(pJValue*i+yStr,bWidth/2,bHeight-(bHeight/jSzie)*i+20,canvas);
        }
        // 畫豎軸
        for (int i = 0; i <dlk.size(); i++) {
             // 把相對于view的x的坐標值找到
            xList.add(bWidth+(int)((width-bWidth)/dlk.size()*dlk.get(i)));
           if(isShow){
               canvas.drawLine(bWidth+(width-bWidth)/dlk.size()*i,20,
                       bWidth+(width-bWidth)/dlk.size()*i,bHeight,paint);
           }
           drawText(1+xStr,bWidth+(width-bWidth)/dlk.size()*i,bHeight-20,canvas);
        }

        // 把所有的點相對于View的集合找到
        mPoints=getPotins(dlk,map,totalValue,canvas,xList);
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        drawPoints(mPoints,canvas ,paint);
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL);
        for (int i = 0; i <mPoints.length ; i++) {
            canvas.drawRect(paintRect(mPoints[i]),paint);
           
        }
    }
  • 畫橫軸

 // 畫橫軸
  for (int i = 0; i < jSzie+1; i++) {
            canvas.drawLine(bWidth,bHeight-(bHeight/jSzie)*i+20,width,bHeight-(bHeight/jSzie)*i+20,paint);
            // 畫Y的刻度
            drawText(pJValue*i+yStr,bWidth/2,bHeight-(bHeight/jSzie)*i+20,canvas);
        }
  • 畫數(shù)軸

  // 畫豎軸
        for (int i = 0; i <dlk.size(); i++) {
             // 把相對于view的x的坐標值找到
            xList.add(bWidth+(int)((width-bWidth)/dlk.size()*dlk.get(i)));
           if(isShow){
               canvas.drawLine(bWidth+(width-bWidth)/dlk.size()*i,20,
                       bWidth+(width-bWidth)/dlk.size()*i,bHeight,paint);
           }
           drawText(1+xStr,bWidth+(width-bWidth)/dlk.size()*i,bHeight-20,canvas);
        }
  • 獲得相對于View 所有的點的集合

    // 獲得相對于View 所有的點的集合

    private Point []getPotins(List<Double> dlk2, HashMap<Double, Double> map2, int totalValue2,
                            Canvas canvas, List<Integer> xList2) {
        Point [] points=new Point[dlk2.size()];
        for (int i = 0; i <points.length ; i++) {
            int ph=bHeight-(int) (bHeight*(map.get(dlk.get(i))/totalValue2));
            points[i]=new Point(xList2.get(i),ph+20);
        }
       return  points;
    }
  • 繪制刻度方法

    private void drawText(String str,int i , int j, Canvas canvas){
      Paint paint=new Paint();
      paint.setAlpha(0X0000FF);
      paint.setTextSize(20);
      paint.setColor(Color.GRAY);
      Typeface typeface=Typeface.create("宋體",Typeface.ITALIC);
      paint.setTypeface(typeface);
      paint.setTextAlign(Paint.Align.CENTER);
      canvas.drawText(str,i ,j,paint);
    }
  • Tools 工具類

將 HashMap 排序然后添加在list里面并返回

package com.app.broken_demo;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Tools {
    public  static ArrayList<Double>getintformap(HashMap<Double,Double>map){
        ArrayList<Double>dlk=new ArrayList<>();
        @SuppressWarnings("rawtypes")
        Set set=map.entrySet();
        @SuppressWarnings("rawtypes")
        Iterator iterator=set.iterator();
        while (iterator.hasNext()){
         @SuppressWarnings("rawtypes")
         Map.Entry mapentry= (Map.Entry) iterator.next();
         dlk.add((Double) mapentry.getKey());
        }
        Collections.sort(dlk);
        return dlk;
    }
   
}

mainactivity測試

package com.app.broken_demo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import java.util.HashMap;


public class MainActivity extends AppCompatActivity {
    private HashMap<Double,Double>map=new HashMap<>();
    private BrokenView brokenView;
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        brokenView=findViewById(R.id.menulist);
        button=findViewById(R.id.btn_add);
        map.put(0.0,0.0);
        map.put(1.5,(double) 0);
        map.put(2.0,25.0);
        map.put(3.0,20.0);
        map.put(4.0,32.0);
        map.put(5.0,41.0);
        map.put(6.0,16.0);
        map.put(7.0,36.0);
        map.put(8.0,26.0);
        brokenView.setView(map,50,10,false,50);

    }
}

最后總結(jié)

自定義折線圖主要是對于要繪制的 點的坐標的處理 然后依次畫出橫軸刻度 以及數(shù)軸刻度形纺。最后將獲取到的現(xiàn)在畫出線即可 丘侠。最后希望我的文章能幫助到各位解決問題 ,以后我還會貢獻更多有用的代碼分享給大家逐样。各位同學如果覺得文章還不錯 蜗字,麻煩給關(guān)注和star,小弟在這里謝過啦!

項目地址:

碼云 :https://gitee.com/qiuyu123/brokendemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脂新,一起剝皮案震驚了整個濱河市挪捕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌争便,老刑警劉巖级零,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滞乙,居然都是意外死亡奏纪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門斩启,熙熙樓的掌柜王于貴愁眉苦臉地迎上來序调,“玉大人,你說我怎么就攤上這事兔簇》⒕睿” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵垄琐,是天一觀的道長边酒。 經(jīng)常有香客問我,道長此虑,這世上最難降的妖魔是什么甚纲? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮朦前,結(jié)果婚禮上介杆,老公的妹妹穿的比我還像新娘。我一直安慰自己韭寸,他們只是感情好春哨,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恩伺,像睡著了一般赴背。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天凰荚,我揣著相機與錄音燃观,去河邊找鬼。 笑死便瑟,一個胖子當著我的面吹牛缆毁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播到涂,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼脊框,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了践啄?” 一聲冷哼從身側(cè)響起浇雹,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屿讽,沒想到半個月后昭灵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡聂儒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年虎锚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衩婚。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡窜护,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出非春,到底是詐尸還是另有隱情柱徙,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布奇昙,位于F島的核電站护侮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏储耐。R本人自食惡果不足惜羊初,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望什湘。 院中可真熱鬧长赞,春花似錦、人聲如沸闽撤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哟旗。三九已至贩据,卻和暖如春栋操,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饱亮。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工矾芙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人近上。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓蠕啄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親戈锻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 自定義一個簡單的折線圖和媳,足夠展示萬條數(shù)據(jù)格遭,(千條以上數(shù)據(jù)在1070的屏幕寬度上 只會是一片茫茫,顏色會擠到一塊兒留瞳。...
    Ability_f8a7閱讀 1,243評論 0 0
  • 自定義折線圖的需求在 APP 開發(fā)中好像很常見了拒迅,事實上用一些第三方庫來繪制折線圖很容易實現(xiàn),但感覺一個類能搞定的...
    Lisiony閱讀 766評論 0 4
  • 本練習參考 自定義View練習(二)簡易折線圖控件她倘,折線圖支持設置x軸與y軸的取值范圍與遞增值璧微,效果如下: 首先自...
    msisuzney閱讀 516評論 0 0
  • 如果你對自定義View還不是很了解,那么這篇文章將從實戰(zhàn)的角度帶你一步一步的編寫出一個符合規(guī)范的自定義View硬梁。 ...
    Jesse_zhao閱讀 7,438評論 4 56
  • 最近學習了一波自定義View前硫,順便做了一個demo,是按照另一篇文章來實現(xiàn)的荧止。我這里主要分析一下思路屹电,最后會附上全...
    嘮嗑008閱讀 10,234評論 13 4