XCL-Charts強大的儀錶盤,xcl-charts儀錶盤

來源:互聯網
上載者:User

XCL-Charts強大的儀錶盤,xcl-charts儀錶盤

XCL-Charts中的儀錶盤是我封裝的最麻煩的圖之一。原因嘛,用過的人都知道,這類圖太有特色了,要弄出一個適用於大部份情況的封裝出來實在不容易。

還好,經過一翻折騰,總算搞出來一套自已感覺還行的方法。

   先展示下效果:

   還可以吧。

     這類圖封裝分開看,從總布局角度看分為180,270,90,360等不同角度的儀錶盤。從內容看則主要有兩個部份的痛點,豐富多彩的各類環與各類指標。

    大家注意觀察下demo中的環與指標就明白有多少類吧。

     我在封裝時,把不同風格的環分為8大類. 來繪製處理大部份各類環形風格,然後使用者可通過屬性的細調來畫出適合自已需求的圖。

因為類別太多,我就不在這一一對每個環形軸顯示成什麼樣舉例了。

    

   至於指標,如demo所見,我在這展示了幾種不同風格的指標,及其多指標疊加顯示的方法。 這當然不包含全部,通過屬性的組合設定及與環形軸的配合。

   使用者可以定製各種類型的指標。因為基本的計算和繪製要素圖表庫已經搭建好並開放出來了。所以不用擔心沒合適的指標可繪製。

        

    指標是一方面,回到我們的主要問題點。demo中有各種各類的圖,是不是我在圖表庫中每一個都獨立封裝一個呢?

  答案當然是不,我的解決方案如下:

前面提過,我封裝了8大類的軸風格。在實現繪製時,使用者可以自己決定add哪些軸,並顯示在圖中的哪個位置。

    我的方法很明顯了,把所有的決定權交給使用者,通過使用者自己的add,再通過相關的軸的屬性設定來畫出他們自己滿意的效果。

    他們有多少創意,都可以通過自由組合方式繪製出來。

         

    噢,忘記了,還有一個儀錶盤中文字的顯示。常要定製各種不同的文字,對於這個,我的解決方案同樣是,把決定權交給使用者。

    讓使用者定好文字及設定好paint畫筆屬性後,傳入使用者指定的顯示位置即可。 想怎麼弄就怎麼弄吧,我的demo已經證明了。


      說這麼多沒用,我拿上面demo其中混合圖(包含了270,180,90三種儀錶盤及不同軸的add方法)的例子的代碼在這展示下吧。

      

/** * Copyright 2014  XCL-Charts *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *     http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *  * @Project XCL-Charts  * @Description Android圖表基底類別庫示範 * @author XiongChuanLiang<br/>(xcl_168@aliyun.com) * @license http://www.apache.org/licenses/  Apache v2 License * @version 1.3 */package com.demo.xclcharts.view;import java.util.ArrayList;import java.util.List;import org.xclcharts.chart.DialChart;import org.xclcharts.common.DensityUtil;import org.xclcharts.common.MathHelper;import org.xclcharts.renderer.XEnum;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Align;import android.graphics.Paint.Style;import android.util.AttributeSet;import android.util.Log;public class DialChart07View extends GraphicalView {private String TAG = "DialChart07View";private DialChart chart = new DialChart();private DialChart chart180 = new DialChart();private DialChart chart90 = new DialChart();private float mPercentage = 0.9f;public DialChart07View(Context context) {super(context);// TODO Auto-generated constructor stubinitView();}public DialChart07View(Context context, AttributeSet attrs){           super(context, attrs);           initView(); }  public DialChart07View(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initView(); }   private void initView() {chartRender();chartRender90();chartRender180(); }  @Override      protected void onSizeChanged(int w, int h, int oldw, int oldh) {          super.onSizeChanged(w, h, oldw, oldh);          chart.setChartRange(w ,h );         chart180.setChartRange(w/2 ,h/3 );         chart90.setChartRange(w ,h/3 );     }  public void chartRender(){try {chart.setPadding(0, DensityUtil.dip2px(getContext(), 100), 0, 0);//設定標題背景chart.setApplyBackgroundColor(true);chart.setBackgroundColor( (int)Color.rgb(28, 129, 243) );//繪製邊框chart.showRoundBorder();chart.setTotalAngle(270f);//設定當前百分比chart.getPointer().setPercentage(mPercentage);//設定指標長度chart.getPointer().setLength(0.65f,0.2f);//增加軸承addAxis();///////////////////////////////////////////////////////////////增加指標addPointer();//設定附加資訊addAttrInfo();/////////////////////////////////////////////////////////////} catch (Exception e) {// TODO Auto-generated catch blockLog.e(TAG, e.toString());}}public void chartRender180(){try {chart180.setTotalAngle(180f);chart180.setStartAngle(180f);//設定當前百分比chart180.getPointer().setPercentage(mPercentage);//設定指標長度chart180.getPointer().setPointerStyle(XEnum.PointerStyle.TRIANGLE);chart180.getPointer().setLength(0.65f,0.2f);List<Float> ringPercentage = new ArrayList<Float>();float rper = MathHelper.getInstance().div(1, 4); //相當於40%//270, 4ringPercentage.add(rper);ringPercentage.add(rper);ringPercentage.add(rper);ringPercentage.add(rper);List<Integer> rcolor  = new ArrayList<Integer>();rcolor.add((int)Color.rgb(242, 110, 131));rcolor.add((int)Color.rgb(238, 204, 71));rcolor.add((int)Color.rgb(42, 231, 250));rcolor.add((int)Color.rgb(140, 196, 27));chart180.addStrokeRingAxis(0.75f,0.6f, ringPercentage, rcolor);chart180.getPlotAxis().get(0).getFillAxisPaint().setColor((int)Color.rgb(28, 129, 243) );Paint paintTB = new Paint();paintTB.setColor(Color.WHITE);paintTB.setTextAlign(Align.CENTER);paintTB.setTextSize(22);paintTB.setAntiAlias(true);chart180.addAttributeInfo(XEnum.Location.BOTTOM, "180度儀錶盤", 0.5f, paintTB);} catch (Exception e) {// TODO Auto-generated catch blockLog.e(TAG, e.toString());}}public void chartRender90(){try {chart90.setPadding(DensityUtil.dip2px(getContext(), 150),0, 0, 0);chart90.setTotalAngle(90f);chart90.setStartAngle(270f);List<Float> ringPercentage = new ArrayList<Float>();float rper = MathHelper.getInstance().div(1, 2); //相當於40%//270, 4ringPercentage.add(rper);ringPercentage.add(rper);List<Integer> rcolor  = new ArrayList<Integer>();rcolor.add((int)Color.rgb(242, 110, 131));rcolor.add((int)Color.rgb(238, 204, 71));chart90.addStrokeRingAxis(0.75f,0.6f, ringPercentage, rcolor);chart90.getPlotAxis().get(0).getFillAxisPaint().setColor((int)Color.rgb(28, 129, 243) );chart90.getPointer().setLength(0.65f);Paint paintTB = new Paint();paintTB.setColor(Color.WHITE);paintTB.setTextAlign(Align.CENTER);paintTB.setTextSize(22);paintTB.setAntiAlias(true);chart90.addAttributeInfo(XEnum.Location.BOTTOM, "90度儀錶盤", 0.5f, paintTB);} catch (Exception e) {// TODO Auto-generated catch blockLog.e(TAG, e.toString());}}public void addAxis(){List<String> rlabels2  = new ArrayList<String>();for(int i=0;i<7;i++){rlabels2.add(Integer.toString(i * 10));}chart.addInnerTicksAxis(0.7f, rlabels2);chart.getPlotAxis().get(0).getAxisPaint().setColor(Color.WHITE);chart.getPlotAxis().get(0).getAxisPaint().setStrokeWidth(8);chart.getPlotAxis().get(0).getTickMarksPaint().setColor(Color.WHITE);chart.getPlotAxis().get(0).getTickLabelPaint().setColor(Color.WHITE);List<String> rlabels3  = new ArrayList<String>();for(int i=0;i<5;i++){if(0 == i){rlabels3.add("");}elserlabels3.add(Integer.toString(i * 10));}chart.addOuterTicksAxis(0.8f, rlabels3);chart.getPlotAxis().get(1).getAxisPaint().setColor(Color.RED);chart.getPlotAxis().get(1).getAxisPaint().setStrokeWidth(5);chart.getPointer().setPointerStyle(XEnum.PointerStyle.TRIANGLE);chart.getPointer().getPointerPaint().setStrokeWidth(3);chart.getPointer().getPointerPaint().setStyle(Style.FILL);chart.getPointer().getPointerPaint().setColor((int)Color.rgb(242, 110, 131));chart.getPointer().getBaseCirclePaint().setColor((int)Color.rgb(238, 204, 71));chart.getPointer().setBaseRadius(10f);}//增加指標public void addPointer(){}private void addAttrInfo(){Paint paintTB = new Paint();paintTB.setColor(Color.WHITE);paintTB.setTextAlign(Align.CENTER);paintTB.setTextSize(22);paintTB.setAntiAlias(true);chart.addAttributeInfo(XEnum.Location.BOTTOM, "270度儀錶盤", 0.5f, paintTB);}public void setCurrentStatus(float percentage){mPercentage =  percentage;//清理chart.clearAll();chart90.clearAll();chart180.clearAll();//設定當前百分比chart.getPointer().setPercentage(mPercentage);addAxis();//增加指標addPointer();addAttrInfo();chartRender180();chartRender90();chart90.getPointer().setPercentage(mPercentage);chart180.getPointer().setPercentage(mPercentage);}@Overridepublic void render(Canvas canvas) {// TODO Auto-generated method stub try{ chart.render(canvas);            chart90.render(canvas);            chart180.render(canvas);                               } catch (Exception e){        Log.e(TAG, e.toString());        }}}

        代碼有點亂,但用於展示功能足夠了。

好了,不多說了,想要了具體瞭解的,自己上github或開源中國下代碼看吧。

         相信我,我弄的這個圖表庫,總有一點功能會是你所需要的。 嘿嘿。

       


    BLOG:http://blog.csdn.net/xcl168

    Mail: xcl_168@aliyun.com


  


  





HighCharts 超出指標怎顯示 儀錶盤

api.highcharts.com/highcharts#Chart.xAxis
根據api可以查的到的
 
世嘉車為何沒有儀錶盤??

這個是設計上面的問題,不過中間那個顯示儀錶確實功能滿強大的,基本上所有行車資訊都能顯示在那上面,只能說以往的儀錶都是在方向盤上面,往往會造成審美疲勞,所以這次一改以往的設計理念做了突破性的設計
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.