Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 通過創建一個位圖的XY Chart來學習Android繪圖類Rect,Paint,Bitmap,Canvas(附源碼)

通過創建一個位圖的XY Chart來學習Android繪圖類Rect,Paint,Bitmap,Canvas(附源碼)

編輯:Android開發實例

  繪制一個XY集是一種很常見的任務,基於Android平台的繪制很簡單,它讓所有的GUI在XML中定義的(雖然它也可以通過代碼創建)模型是相當不錯的。大部分的圖形處理一個樣本查看,但在大多數情況下,圖應該是一個部分的實施走上屏幕布局XML定義為一所以在這裡展示我們ImageView布局對象。

  在Android環境中,有一整套程序的圖形通常是位圖實現像素,Canvas是用來繪制位圖的畫布,通過這一點我們可以得出元(文字,線條等)它描述了的顏色,款式等。

 下面是效果圖

  圖形界面我們通過Xml定義。

  1.XML的GUI布局 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  
  3. <TableLayout   
  4.  
  5.     xmlns:android="http://schemas.android.com/apk/res/android" 
  6.     android:layout_height="fill_parent"   
  7.     android:layout_width="fill_parent" 
  8.     android:background="#4B088A"> 
  9.     
  10.     <TableRow android:layout_width="fill_parent"   
  11.     android:layout_height="wrap_content" 
  12.      android:padding="20px">   
  13.      
  14.      <TextView    
  15. android:id="@+id/some"   
  16.     android:layout_width="fill_parent"   
  17.     android:layout_height="wrap_content"   
  18.     android:text="Some layout  items here" 
  19.     android:layout_marginLeft="10px" 
  20.     android:layout_marginRight="10px" 
  21.     android:textColor="#ff8000" 
  22.     android:textStyle="bold" 
  23.     /> 
  24.  
  25.     </TableRow> 
  26.  
  27. <View       
  28.   android:layout_width="fill_parent" 
  29. android:layout_height="1dip" 
  30. android:background="#FFE6E6E6" 
  31. /> 
  32.       
  33.     <TableRow> 
  34.  
  35.     <ImageView    
  36. android:id="@+id/testy_img"   
  37. android:layout_marginLeft="20px" 
  38. android:padding="20px" 
  39.     /> 
  40.  
  41.    </TableRow> 
  42.  
  43. <View       
  44.   android:layout_width="fill_parent" 
  45. android:layout_height="1dip" 
  46. android:background="#FFE6E6E6" /> 
  47.  
  48.     <TableRow android:layout_width="fill_parent"   
  49.  
  50.     android:layout_height="wrap_content" 
  51.      android:padding="20px">   
  52.  
  53.      <TextView    
  54. android:id="@+id/more"   
  55.     android:layout_width="fill_parent"   
  56.     android:layout_height="wrap_content"   
  57.     android:text="More layout items here" 
  58.     android:layout_marginLeft="10px" 
  59.     android:layout_marginRight="10px" 
  60.    android:textColor="#ff8000" 
  61.     android:textStyle="bold" 
  62.     /> 
  63.  
  64.     </TableRow> 
  65.  
  66. </TableLayout> 
  67.  

 

這個布局文件是TableLayout布局,它定義了三行,行之間通過一條線割開

 

2.圖表的實現

  為了實現我們的圖表,我們首先創建一個位圖,然後關聯到我們的布局文件,有了位圖,我們就可以繪制圖表,做縮放,色彩和數據顯示 等效果。

 

  2.1繪制位圖

  首先我們使布局連接到XML對象的,那麼我們創建位圖。我們通過quicky_XY方法來實現所有的繪制,最後顯示在屏幕上。

  1. public void onCreate(Bundle savedInstanceState) {  
  2.   super.onCreate(savedInstanceState);  
  3.   setContentView(R.layout.main);  
  4.  
  5.   ImageView image = (ImageView) findViewById(R.id.testy_img);  
  6.  
  7.   Bitmap emptyBmap = Bitmap.createBitmap(250, 200, Config.ARGB_8888);  
  8.  
  9.   int width = emptyBmap.getWidth();  
  10.   int height = emptyBmap.getHeight();  
  11.   Bitmap charty = Bitmap.createBitmap(width, height,  
  12.     Bitmap.Config.ARGB_8888);  
  13.  
  14.   charty = quicky_XY(emptyBmap);  
  15.  
  16.   image.setImageBitmap(charty);  
  17.  }  
  18.  

 

  2.2繪制網格

  有了位圖後,將它與Canvas相關聯

  Canvas canvas = new Canvas(bitmap)

然後將所有的元素繪制到Canvas上,我們需要定義一些用於放置標簽和數據點空間的網格。

  1. public static void draw_the_grid(Canvas this_g, Vector these_labels) {  
  2.   double rounded_max = 0.0;  
  3.   double rounded_min = 0.0;  
  4.   double rounded_max_temp;  
  5.   Object curElt;  
  6.   String[] cur_elt_array;  
  7.   int left_margin_d, right_margin_d;  
  8.  
  9.   if (draw_only_this_idx == -1)  
  10.    curElt = these_labels.elementAt(0); // default it to 1st one if non  
  11.   // set  
  12.   else 
  13.    curElt = these_labels.elementAt(draw_only_this_idx); // now just the  
  14.   // 1st elt  
  15.  
  16.   cur_elt_array = (String[]) curElt;  
  17.  
  18.   rounded_max = get_ceiling_or_floor(  
  19.     Double.parseDouble(cur_elt_array[2]), true);  
  20.   rounded_min = get_ceiling_or_floor(  
  21.     Double.parseDouble(cur_elt_array[3]), false);  
  22.  
  23.   // ok so now we have the max value of the set just get a cool ceiling  
  24.   // and we go on  
  25.   final Paint paint = new Paint();  
  26.   paint.setTextSize(15);  
  27.  
  28.   left_margin_d = getCurTextLengthInPixels(paint, Double  
  29.     .toString(rounded_max));  
  30.   // keep the position for later drawing -- leave space for the legend  
  31.   int p_height = 170;  
  32.   int p_width = 220;  
  33.   int[] tmp_draw_sizes = { 2 + left_margin_d, 25,  
  34.     p_width - 2 - left_margin_d, p_height - 25 - 5 };  
  35.   drawSizes = tmp_draw_sizes; // keep it for later processing  
  36.  
  37.   // with the mzrgins worked out draw the plotting grid  
  38.   paint.setStyle(Paint.Style.FILL);  
  39.   paint.setColor(Color.WHITE);  
  40.  
  41.   // Android does by coords  
  42.   this_g  
  43.     .drawRect(drawSizes[0], drawSizes[1], drawSizes[0]  
  44.       + drawSizes[2], drawSizes[1] + drawSizes[3], paint);  
  45.  
  46.   paint.setColor(Color.GRAY);  
  47.  
  48.   // finally draw the grid  
  49.  
  50.   paint.setStyle(Paint.Style.STROKE);  
  51.   this_g  
  52.     .drawRect(drawSizes[0], drawSizes[1], drawSizes[0]  
  53.       + drawSizes[2], drawSizes[1] + drawSizes[3], paint);  
  54.  
  55.   for (int i = 1; i < 5; i++) {  
  56.    this_g.drawLine(drawSizes[0],  
  57.      drawSizes[1] + (i * drawSizes[3] / 5), drawSizes[0]  
  58.        + drawSizes[2], drawSizes[1]  
  59.        + (i * drawSizes[3] / 5), paint);  
  60.    this_g.drawLine(drawSizes[0] + (i * drawSizes[2] / 5),  
  61.      drawSizes[1], drawSizes[0] + (i * drawSizes[2] / 5),  
  62.      drawSizes[1] + drawSizes[3], paint);  
  63.   }  
  64.  
  65.   // good for one value  
  66.   print_axis_values_4_grid(this_g, cur_elt_array[1], Double  
  67.     .toString(rounded_max), Double.toString(rounded_min),  
  68.     cur_elt_array[0], 2, 0);  
  69.  
  70.  } // --- end of draw_grid ---  
  71.  

 

  2.3繪圖和縮放

    這些數據點需要一到屏幕上的坐標數據范圍正確的映射遍歷數據點和調用drawLine接連兩個點會完成我們的圖表。數據點通過數據為載體,現在將調用plot_array_list

  1. private static Point  scale_point(int this_x , double this_y  , Point drawPoint ,   
  2.             int scr_x  , int scr_y  , int scr_width  , int src_height  ,   
  3.             double maxX  , double minX  , double  maxY  , double minY  )  
  4.        {  
  5.            int temp_x, temp_y;  
  6.            Point temp = new Point();     
  7.              
  8.            if (maxY == minY)  //skip bad data  
  9.                return null;  
  10.  
  11.            //don't touch it if is nothing  
  12.            try 
  13.            {  
  14.                    temp_x = scr_x + (int)( ((double)this_x - minX) *   
  15. ((double)scr_width / (maxX - minX)) );  
  16.                    temp_y = scr_y + (int)( (maxY - this_y) *   
  17. ((double)src_height / (maxY - minY)) );  
  18.                   
  19.                    temp.x = temp_x;  
  20.                    temp.y= temp_y;  
  21.                    drawPoint = temp;  
  22.            }   
  23.            catch  (Exception e)  
  24.            {  
  25.           
  26.               return (null);  
  27.            }  
  28.              
  29.            return temp;  
  30.              
  31.        } // --- end of scale_point --  
  32.  
  33.  
  34.     public static boolean plot_array_list(Canvas this_g, Vector this_array_list ,   
  35. Vector these_labels , String this_title , int only_this_idx )   
  36.     {  
  37.              int idx;  
  38.              int lRow ;  
  39.              int nParms;  
  40.              int  i, points_2_plot, shifted_idx ;   
  41.              int prev_x, prev_y ;  
  42.              int cur_x=0, cur_y=0 ;   
  43.              //Dim ShowMarker As Object  
  44.              Point cur_point = new Point();  
  45.             cur_point.set(0,0);  
  46.        
  47.              double cur_maxX, cur_minX, cur_maxY=20, cur_minY=0, cur_rangeY;  
  48.              int cur_start_x, cur_points_2_plot;   
  49.      
  50.             int POINTS_TO_CHANGE = 30;  
  51.             double cur_OBD_val;  
  52.     
  53.              //Object curElt;    
  54.              String curElt;   
  55.              String[] cur_elt_array;  
  56.              Object curElt2;    
  57.              String[] cur_elt_array2;  
  58.        
  59.              final Paint paint = new Paint();  
  60.  
  61.              try // catch in this block for some thing  
  62.              {         
  63.                    points_2_plot = this_array_list.size();  
  64.                    {  
  65.                         cur_start_x = 0;  
  66.                         cur_points_2_plot = points_2_plot;  
  67.                         cur_maxX = cur_points_2_plot;  
  68.                         cur_minX = 0;  
  69.                    }  
  70.     
  71.                    //'Create the plot points for this series from the ChartPoints array:  
  72.      
  73.                    curElt = (String)this_array_list.elementAt(0);  
  74.                      
  75.                    //the lines have to come out good  
  76.                     paint.setStyle(Paint.Style.STROKE);  
  77. //                    
  78.                    //for(  nParms = 0 ; nParms < cur_elt_array.length ; nParms++ )  
  79.                    nParms = only_this_idx;  
  80.                    {  
  81.       
  82.                        //get cur item labels  
  83.                         curElt2 = these_labels.elementAt(nParms);  
  84.                         cur_elt_array2  = (String[]) curElt2;  
  85.                           
  86.                         cur_maxY = get_ceiling_or_floor   
  87. (Double.parseDouble(cur_elt_array2[2]) , true);  
  88.                         cur_minY = get_ceiling_or_floor   
  89. (Double.parseDouble(cur_elt_array2[3]) , false);  
  90.                           
  91.                         cur_points_2_plot = this_array_list.size();  
  92.                         cur_maxX = cur_points_2_plot;  
  93.       
  94.                       curElt = (String)this_array_list.elementAt(0);  
  95.                       cur_OBD_val = Double.parseDouble( curElt);  
  96.                         
  97.                       cur_point = scale_point(0, cur_OBD_val, cur_point,   
  98.                               drawSizes[0], drawSizes[1], drawSizes[2], drawSizes[3],   
  99.                               cur_maxX, cur_minX, cur_maxY,   
  100.       cur_minY); //'(CInt(curAxisValues.Mins(nParms - 2) / 5) + 1) * 5)  
  101.                          
  102.                        cur_x = cur_point.x;  
  103.                        cur_y = cur_point.y;  
  104.  
  105.                        paint.setColor(Color.GREEN);  
  106.                          
  107.                       // the point is only cool when samples are low  
  108.                        if ( cur_points_2_plot < POINTS_TO_CHANGE)  
  109.                          this_g.drawRect(cur_x-2, cur_y-2, cur_x-2 + 4,  
  110. cur_y-2+ 4 , paint);   
  111.                          
  112.                        prev_x = cur_x;  
  113.                        prev_y = cur_y;  
  114.  
  115.                        //'go and plot point for this parm -- pont after the 1st one   
  116.                        for (lRow = cur_start_x +1 ; lRow< cur_start_x +   
  117. cur_points_2_plot -1 ; lRow++)  
  118.                        {          
  119.                            curElt = (String)this_array_list.elementAt(lRow);  
  120.                              
  121.                            cur_OBD_val = Double.parseDouble( curElt);   
  122.                                    
  123.                             //'work out an approx if cur Y values not avail(e.g. nothing)  
  124.                            // if (! (cur_elt_array[nParms ] == null ) )   //skip bad one  
  125.                              if( cur_OBD_val == Double.NaN) continue;  //skip bad one  
  126.                             {                    
  127.          
  128.                                  
  129.                                 cur_point=scale_point(lRow, cur_OBD_val, cur_point,    
  130.                                     drawSizes[0], drawSizes[1],   
  131. drawSizes[2], drawSizes[3],   
  132.                                     cur_maxX, cur_minX, cur_maxY, cur_minY);  
  133.       
  134.                                 cur_x = cur_point.x;  
  135.                                 cur_y = cur_point.y;  
  136.                                   
  137.                                 if ( cur_points_2_plot < POINTS_TO_CHANGE)  
  138.                                    this_g.drawRect(cur_x-2, cur_y-2, cur_x-2 +4,   
  139. cur_y-2 + 4, paint );   
  140.  
  141.                                this_g.drawLine( prev_x, prev_y, cur_x, cur_y, paint);  
  142.                                prev_x = cur_x;  
  143.                                prev_y = cur_y;  
  144.                             
  145.                             } // ' if end of this_array(lRow, nParms - 1)<> nothing  
  146.                                    
  147.                    } // end of for lrow  
  148.                                  
  149.                } // end of for nParmns  
  150.  
  151.             //this_g.invalidate();  
  152.             return( true);  
  153.         }  
  154.         catch (Exception e)  
  155.         {  
  156.             return( false);  
  157.         }  
  158.  
  159.     } // --- end of plot_array_list  --  
  160.  

 

Java完整代碼:

  1. package com.wjq.chart;  
  2.  
  3. import java.util.Vector;  
  4.  
  5. import android.app.Activity;  
  6. import android.graphics.Bitmap;  
  7. import android.graphics.Canvas;  
  8. import android.graphics.Color;  
  9. import android.graphics.Paint;  
  10. import android.graphics.Point;  
  11. import android.graphics.Rect;  
  12. import android.graphics.RectF;  
  13. import android.graphics.Typeface;  
  14. import android.graphics.Bitmap.Config;  
  15. import android.graphics.Paint.FontMetrics;  
  16. import android.os.Bundle;  
  17. import android.widget.ImageView;  
  18.  
  19. public class Main extends Activity {  
  20.  static int draw_only_this_idx = -1;  
  21.  static int[] drawSizes;  
  22.  
  23.  @Override 
  24.  public void onCreate(Bundle savedInstanceState) {  
  25.   super.onCreate(savedInstanceState);  
  26.   setContentView(R.layout.main);  
  27.  
  28.   ImageView image = (ImageView) findViewById(R.id.testy_img);  
  29.  
  30.   Bitmap emptyBmap = Bitmap.createBitmap(250, 200, Config.ARGB_8888);  
  31.  
  32.   int width = emptyBmap.getWidth();  
  33.   int height = emptyBmap.getHeight();  
  34.   Bitmap charty = Bitmap.createBitmap(width, height,  
  35.     Bitmap.Config.ARGB_8888);  
  36.  
  37.   charty = quicky_XY(emptyBmap);  
  38.  
  39.   image.setImageBitmap(charty);  
  40.  }  
  41.  
  42.  public static Bitmap quicky_XY(Bitmap bitmap) {  
  43.   // xode to get bitmap onto screen  
  44.   Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap  
  45.     .getHeight(), Config.ARGB_8888);  
  46.   Canvas canvas = new Canvas(output);  
  47.  
  48.   final int color = 0xff0B0B61;  
  49.   final Paint paint = new Paint();  
  50.   final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());  
  51.   final RectF rectF = new RectF(rect);  
  52.   final float roundPx = 12;  
  53.  
  54.   // get the little rounded cornered outside  
  55.   paint.setAntiAlias(true);  
  56.   canvas.drawARGB(0, 0, 0, 0);  
  57.   paint.setColor(color);  
  58.   canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
  59.  
  60.   // ---- NOw just draw on this bitmap  
  61.  
  62.   // Set the labels info manually  
  63.   String[] cur_elt_array = new String[4];  
  64.   cur_elt_array[0] = "Voltage";  
  65.   cur_elt_array[1] = "volts";  
  66.   cur_elt_array[2] = "93"; // max  
  67.   cur_elt_array[3] = "0"; // min  
  68.  
  69.   Vector labels = new Vector();  
  70.   labels.add(cur_elt_array);  
  71.  
  72.   draw_the_grid(canvas, labels);  
  73.  
  74.   // se the data to be plotted and we should on our way  
  75.  
  76.   Vector data_2_plot = new Vector();  
  77.  
  78.   data_2_plot.add("0.2");  
  79.   data_2_plot.add("1.2");  
  80.   data_2_plot.add("9.6");  
  81.   data_2_plot.add("83.2");  
  82.   data_2_plot.add("44.2");  
  83.   data_2_plot.add("20.2");  
  84.   data_2_plot.add("16.2");  
  85.  
  86.   plot_array_list(canvas, data_2_plot, labels, "the title", 0);  
  87.  
  88.   canvas.drawBitmap(bitmap, rect, rect, paint);  
  89.  
  90.   return output;  
  91.  }  
  92.  
  93.  public static void draw_the_grid(Canvas this_g, Vector these_labels) {  
  94.   double rounded_max = 0.0;  
  95.   double rounded_min = 0.0;  
  96.   double rounded_max_temp;  
  97.   Object curElt;  
  98.   String[] cur_elt_array;  
  99.   int left_margin_d, right_margin_d;  
  100.  
  101.   if (draw_only_this_idx == -1)  
  102.    curElt = these_labels.elementAt(0); // default it to 1st one if non  
  103.   // set  
  104.   else 
  105.    curElt = these_labels.elementAt(draw_only_this_idx); // now just the  
  106.   // 1st elt  
  107.  
  108.   cur_elt_array = (String[]) curElt;  
  109.  
  110.   rounded_max = get_ceiling_or_floor(  
  111.     Double.parseDouble(cur_elt_array[2]), true);  
  112.   rounded_min = get_ceiling_or_floor(  
  113.     Double.parseDouble(cur_elt_array[3]), false);  
  114.  
  115.   // ok so now we have the max value of the set just get a cool ceiling  
  116.   // and we go on  
  117.   final Paint paint = new Paint();  
  118.   paint.setTextSize(15);  
  119.  
  120.   left_margin_d = getCurTextLengthInPixels(paint, Double  
  121.     .toString(rounded_max));  
  122.   // keep the position for later drawing -- leave space for the legend  
  123.   int p_height = 170;  
  124.   int p_width = 220;  
  125.   int[] tmp_draw_sizes = { 2 + left_margin_d, 25,  
  126.     p_width - 2 - left_margin_d, p_height - 25 - 5 };  
  127.   drawSizes = tmp_draw_sizes; // keep it for later processing  
  128.  
  129.   // with the mzrgins worked out draw the plotting grid  
  130.   paint.setStyle(Paint.Style.FILL);  
  131.   paint.setColor(Color.WHITE);  
  132.  
  133.   // Android does by coords  
  134.   this_g  
  135.     .drawRect(drawSizes[0], drawSizes[1], drawSizes[0]  
  136.       + drawSizes[2], drawSizes[1] + drawSizes[3], paint);  
  137.  
  138.   paint.setColor(Color.GRAY);  
  139.  
  140.   // finally draw the grid  
  141.  
  142.   paint.setStyle(Paint.Style.STROKE);  
  143.   this_g  
  144.     .drawRect(drawSizes[0], drawSizes[1], drawSizes[0]  
  145.       + drawSizes[2], drawSizes[1] + drawSizes[3], paint);  
  146.  
  147.   for (int i = 1; i < 5; i++) {  
  148.    this_g.drawLine(drawSizes[0],  
  149.      drawSizes[1] + (i * drawSizes[3] / 5), drawSizes[0]  
  150.        + drawSizes[2], drawSizes[1]  
  151.        + (i * drawSizes[3] / 5), paint);  
  152.    this_g.drawLine(drawSizes[0] + (i * drawSizes[2] / 5),  
  153.      drawSizes[1], drawSizes[0] + (i * drawSizes[2] / 5),  
  154.      drawSizes[1] + drawSizes[3], paint);  
  155.   }  
  156.  
  157.   // good for one value  
  158.   print_axis_values_4_grid(this_g, cur_elt_array[1], Double  
  159.     .toString(rounded_max), Double.toString(rounded_min),  
  160.     cur_elt_array[0], 2, 0);  
  161.  
  162.  } // --- end of draw_grid ---  
  163.  
  164.  private static Point scale_point(int this_x, double this_y,  
  165.    Point drawPoint, int scr_x, int scr_y, int scr_width,  
  166.    int src_height, double maxX, double minX, double maxY, double minY) {  
  167.   int temp_x, temp_y;  
  168.   Point temp = new Point();  
  169.  
  170.   if (maxY == minY) // skip bad data  
  171.    return null;  
  172.  
  173.   // don't touch it if is nothing  
  174.   try {  
  175.    temp_x = scr_x  
  176.      + (int) (((double) this_x - minX) * ((double) scr_width / (maxX - minX)));  
  177.    temp_y = scr_y  
  178.      + (int) ((maxY - this_y) * ((double) src_height / (maxY - minY)));  
  179.  
  180.    temp.x = temp_x;  
  181.    temp.y = temp_y;  
  182.    drawPoint = temp;  
  183.   } catch (Exception e) {  
  184.  
  185.    return (null);  
  186.   }  
  187.  
  188.   return temp;  
  189.  
  190.  } // --- end of scale_point --  
  191.  
  192.  public static boolean plot_array_list(Canvas this_g,  
  193.    Vector this_array_list, Vector these_labels, String this_title,  
  194.    int only_this_idx) {  
  195.   int idx;  
  196.   int lRow;  
  197.   int nParms;  
  198.   int i, points_2_plot, shifted_idx;  
  199.   int prev_x, prev_y;  
  200.   int cur_x = 0, cur_y = 0;  
  201.   // Dim ShowMarker As Object  
  202.   Point cur_point = new Point();  
  203.   cur_point.set(0, 0);  
  204.  
  205.   double cur_maxX, cur_minX, cur_maxY = 20, cur_minY = 0, cur_rangeY;  
  206.   int cur_start_x, cur_points_2_plot;  
  207.  
  208.   int POINTS_TO_CHANGE = 30;  
  209.   double cur_OBD_val;  
  210.  
  211.   // Object curElt;  
  212.   String curElt;  
  213.   String[] cur_elt_array;  
  214.   Object curElt2;  
  215.   String[] cur_elt_array2;  
  216.  
  217.   final Paint paint = new Paint();  
  218.  
  219.   try // catch in this block for some thing  
  220.   {  
  221.    points_2_plot = this_array_list.size();  
  222.    {  
  223.     cur_start_x = 0;  
  224.     cur_points_2_plot = points_2_plot;  
  225.     cur_maxX = cur_points_2_plot;  
  226.     cur_minX = 0;  
  227.    }  
  228.  
  229.    // 'Create the plot points for this series from the ChartPoints  
  230.    // array:  
  231.  
  232.    curElt = (String) this_array_list.elementAt(0);  
  233.  
  234.    // the lines have to come out good  
  235.    paint.setStyle(Paint.Style.STROKE);  
  236.    //                     
  237.    // for( nParms = 0 ; nParms < cur_elt_array.length ; nParms++ )  
  238.    nParms = only_this_idx;  
  239.    {  
  240.  
  241.     // get cur item labels  
  242.     curElt2 = these_labels.elementAt(nParms);  
  243.     cur_elt_array2 = (String[]) curElt2;  
  244.  
  245.     cur_maxY = get_ceiling_or_floor(Double  
  246.       .parseDouble(cur_elt_array2[2]), true);  
  247.     cur_minY = get_ceiling_or_floor(Double  
  248.       .parseDouble(cur_elt_array2[3]), false);  
  249.  
  250.     cur_points_2_plot = this_array_list.size();  
  251.     cur_maxX = cur_points_2_plot;  
  252.  
  253.     curElt = (String) this_array_list.elementAt(0);  
  254.     cur_OBD_val = Double.parseDouble(curElt);  
  255.  
  256.     cur_point = scale_point(0, cur_OBD_val, cur_point,  
  257.       drawSizes[0], drawSizes[1], drawSizes[2], drawSizes[3],  
  258.       cur_maxX, cur_minX, cur_maxY, cur_minY); // '(CInt(curAxisValues.Mins(nParms  
  259.     // - 2) / 5)  
  260.     // + 1) * 5)  
  261.  
  262.     cur_x = cur_point.x;  
  263.     cur_y = cur_point.y;  
  264.  
  265.     paint.setColor(Color.GREEN);  
  266.  
  267.     // the point is only cool when samples are low  
  268.     if (cur_points_2_plot < POINTS_TO_CHANGE)  
  269.      this_g.drawRect(cur_x - 2, cur_y - 2, cur_x - 2 + 4,  
  270.        cur_y - 2 + 4, paint);  
  271.  
  272.     prev_x = cur_x;  
  273.     prev_y = cur_y;  
  274.  
  275.     // 'go and plot point for this parm -- pont after the 1st one  
  276.     for (lRow = cur_start_x + 1; lRow < cur_start_x  
  277.       + cur_points_2_plot - 1; lRow++) {  
  278.      curElt = (String) this_array_list.elementAt(lRow);  
  279.  
  280.      cur_OBD_val = Double.parseDouble(curElt);  
  281.  
  282.      // 'work out an approx if cur Y values not avail(e.g.  
  283.      // nothing)  
  284.      // if (! (cur_elt_array[nParms ] == null ) ) //skip bad one  
  285.      if (cur_OBD_val == Double.NaN)  
  286.       continue; // skip bad one  
  287.      {  
  288.  
  289.       cur_point = scale_point(lRow, cur_OBD_val, cur_point,  
  290.         drawSizes[0], drawSizes[1], drawSizes[2],  
  291.         drawSizes[3], cur_maxX, cur_minX, cur_maxY,  
  292.         cur_minY);  
  293.  
  294.       cur_x = cur_point.x;  
  295.       cur_y = cur_point.y;  
  296.  
  297.       if (cur_points_2_plot < POINTS_TO_CHANGE)  
  298.        this_g.drawRect(cur_x - 2, cur_y - 2,  
  299.          cur_x - 2 + 4, cur_y - 2 + 4, paint);  
  300.  
  301.       this_g.drawLine(prev_x, prev_y, cur_x, cur_y, paint);  
  302.       prev_x = cur_x;  
  303.       prev_y = cur_y;  
  304.  
  305.      } // ' if end of this_array(lRow, nParms - 1)<> nothing  
  306.  
  307.     } // end of for lrow  
  308.  
  309.    } // end of for nParmns  
  310.  
  311.    // this_g.invalidate();  
  312.    return (true);  
  313.   } catch (Exception e) {  
  314.    return (false);  
  315.   }  
  316.  
  317.  } // --- end of plot_array_list --  
  318.  
  319.  public static void print_axis_values_4_grid(Canvas thisDrawingArea,  
  320.    String cur_units, String cur_max, String cur_min, String cur_label,  
  321.    int x_guide, int this_idx) {  
  322.   String this_str;  
  323.   double delta = (Double.valueOf(cur_max).doubleValue() - Double.valueOf(  
  324.     cur_min).doubleValue()) / 5;  
  325.  
  326.   final Paint paint = new Paint();  
  327.   paint.setColor(Color.WHITE);  
  328.  
  329.   paint.setTypeface(Typeface.SANS_SERIF);  
  330.   paint.setTextSize(8);  
  331.  
  332.   for (int i = 0; i < 6; i++) {  
  333.    this_str = Double  
  334.      .toString((Double.valueOf(cur_min).doubleValue() + delta  
  335.        * i));  
  336.    final int point = this_str.indexOf('.');  
  337.    if (point > 0) {  
  338.     // If has a decimal point, may need to clip off after or force 2  
  339.     // decimal places  
  340.     this_str = this_str + "00";  
  341.     this_str = this_str.substring(0, point + 3);  
  342.    } else {  
  343.     this_str = this_str + ".00";  
  344.    }  
  345.  
  346.    if (i == 5) {  
  347.     thisDrawingArea.drawText(this_str, x_guide - 2, drawSizes[1]  
  348.       + drawSizes[3] - (i * drawSizes[3] / 5), paint);  
  349.    } else {  
  350.     thisDrawingArea.drawText(this_str, x_guide - 2, drawSizes[1]  
  351.       + drawSizes[3] - (i * drawSizes[3] / 5) - 3, paint);  
  352.    }  
  353.  
  354.   }  
  355.   paint.setTextSize(10);  
  356.  
  357.   switch (this_idx) {  
  358.   case 0:  
  359.    thisDrawingArea.drawText("  " + cur_label + " - " + cur_units,  
  360.      x_guide - 2, drawSizes[1] - 15, paint);  
  361.  
  362.    break;  
  363.  
  364.   default:  
  365.    thisDrawingArea.drawText("  " + cur_label + " - " + cur_units,  
  366.      x_guide - 2 - 30, drawSizes[1] - 15, paint);  
  367.  
  368.    break;  
  369.   }  
  370.  
  371.  }  
  372.  
  373.  private static int getCurTextLengthInPixels(Paint this_paint,  
  374.    String this_text) {  
  375.   FontMetrics fp = this_paint.getFontMetrics();  
  376.   Rect rect = new Rect();  
  377.   this_paint.getTextBounds(this_text, 0, this_text.length(), rect);  
  378.   return rect.width();  
  379.  }  
  380.  
  381.  public static double get_ceiling_or_floor(double this_val, boolean is_max) {  
  382.   double this_min_tmp;  
  383.   int this_sign;  
  384.   int this_10_factor = 0;  
  385.   double this_rounded;  
  386.  
  387.   if (this_val == 0.0) {  
  388.    this_rounded = 0.0;  
  389.    return this_rounded;  
  390.   }  
  391.  
  392.   this_min_tmp = Math.abs(this_val);  
  393.  
  394.   if (this_min_tmp >= 1.0 && this_min_tmp < 10.0)  
  395.    this_10_factor = 1;  
  396.   else if (this_min_tmp >= 10.0 && this_min_tmp < 100.0)  
  397.    this_10_factor = 10;  
  398.   else if (this_min_tmp >= 100.0 && this_min_tmp < 1000.0)  
  399.    this_10_factor = 100;  
  400.   else if (this_min_tmp >= 1000.0 && this_min_tmp < 10000.0)  
  401.    this_10_factor = 1000;  
  402.   else if (this_min_tmp >= 10000.0 && this_min_tmp < 100000.0)  
  403.    this_10_factor = 10000;  
  404.  
  405.   // 'cover when min is pos and neg  
  406.   if (is_max) {  
  407.    if (this_val > 0.0)  
  408.     this_sign = 1;  
  409.    else 
  410.     this_sign = -1;  
  411.  
  412.   } else {  
  413.    if (this_val > 0.0)  
  414.     this_sign = -1;  
  415.    else 
  416.     this_sign = 1;  
  417.  
  418.   }  
  419.  
  420.   if (this_min_tmp > 1)  
  421.    this_rounded = (double) (((int) (this_min_tmp / this_10_factor) + this_sign) * this_10_factor);  
  422.   else {  
  423.    this_rounded = (int) (this_min_tmp * 100.0);  
  424.    // ' cover same as above bfir number up to .001 less than tha it  
  425.    // will skip  
  426.    if (this_rounded >= 1 && this_rounded < 9)  
  427.     this_10_factor = 1;  
  428.    else if (this_rounded >= 10 && this_rounded < 99)  
  429.     this_10_factor = 10;  
  430.    else if (this_rounded >= 100 && this_rounded < 999)  
  431.     this_10_factor = 100;  
  432.  
  433.    this_rounded = (double) (((int) ((this_rounded) / this_10_factor) + this_sign) * this_10_factor);  
  434.    this_rounded = (int) (this_rounded) / 100.0;  
  435.  
  436.   }  
  437.  
  438.   if (this_val < 0)  
  439.    this_rounded = -this_rounded;  
  440.  
  441.   return this_rounded;  
  442.  
  443.  }  
  444. }  
  445.  

 

源碼下載:XYChart.rar

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved