绘制一个XY集是一种很常见的任务,基于Android平台的绘制很简单,它让所有的GUI在XML中定义的(虽然它也可以通过代码创建)模型是相当不错的。大部分的图形处理一个样本查看,但在大多数情况下,图应该是一个部分的实施走上屏幕布局XML定义为一所以在这里展示我们ImageView布局对象。

  在Android环境中,有一整套程序的图形通常是位图实现像素,Canvas是用来绘制位图的画布,通过这一点我们可以得出元(文字,线条等)它描述了的颜色,款式等。

下面是效果图

  图形界面我们通过Xml定义。

  1.XML的GUI布局

<?xml version="1.0" encoding="utf-8"?>

<TableLayout

xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:background="#4B088A">
 
    <TableRow android:layout_width="fill_parent"
    android:layout_height="wrap_content"
     android:padding="20px">
  
     <TextView 
android:id="@+id/some"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Some layout  items here"
    android:layout_marginLeft="10px"
    android:layout_marginRight="10px"
    android:textColor="#ff8000"
    android:textStyle="bold"
    />

</TableRow>

<View    
  android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="#FFE6E6E6"
/>
   
    <TableRow>

<ImageView 
android:id="@+id/testy_img"
android:layout_marginLeft="20px"
android:padding="20px"
    />

</TableRow>

<View    
  android:layout_width="fill_parent"
android:layout_height="1dip"
android:background="#FFE6E6E6" />

<TableRow android:layout_width="fill_parent"

android:layout_height="wrap_content"
     android:padding="20px">

<TextView 
android:id="@+id/more"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="More layout items here"
    android:layout_marginLeft="10px"
    android:layout_marginRight="10px"
   android:textColor="#ff8000"
    android:textStyle="bold"
    />

</TableRow>

</TableLayout>

这个布局文件是TableLayout布局,它定义了三行,行之间通过一条线割开

2.图表的实现

  为了实现我们的图表,我们首先创建一个位图,然后关联到我们的布局文件,有了位图,我们就可以绘制图表,做缩放,色彩和数据显示 等效果。

  2.1绘制位图

  首先我们使布局连接到XML对象的,那么我们创建位图。我们通过quicky_XY方法来实现所有的绘制,最后显示在屏幕上。

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

ImageView image = (ImageView) findViewById(R.id.testy_img);

Bitmap emptyBmap = Bitmap.createBitmap(250, 200, Config.ARGB_8888);

int width = emptyBmap.getWidth();
  int height = emptyBmap.getHeight();
  Bitmap charty = Bitmap.createBitmap(width, height,
    Bitmap.Config.ARGB_8888);

charty = quicky_XY(emptyBmap);

image.setImageBitmap(charty);
 }

  2.2绘制网格

  有了位图后,将它与Canvas相关联

  Canvas canvas = new Canvas(bitmap)

然后将所有的元素绘制到Canvas上,我们需要定义一些用于放置标签和数据点空间的网格。

public static void draw_the_grid(Canvas this_g, Vector these_labels) {
  double rounded_max = 0.0;
  double rounded_min = 0.0;
  double rounded_max_temp;
  Object curElt;
  String[] cur_elt_array;
  int left_margin_d, right_margin_d;

if (draw_only_this_idx == -1)
   curElt = these_labels.elementAt(0); // default it to 1st one if non
  // set
  else
   curElt = these_labels.elementAt(draw_only_this_idx); // now just the
  // 1st elt

cur_elt_array = (String[]) curElt;

rounded_max = get_ceiling_or_floor(
    Double.parseDouble(cur_elt_array[2]), true);
  rounded_min = get_ceiling_or_floor(
    Double.parseDouble(cur_elt_array[3]), false);

// ok so now we have the max value of the set just get a cool ceiling
  // and we go on
  final Paint paint = new Paint();
  paint.setTextSize(15);

left_margin_d = getCurTextLengthInPixels(paint, Double
    .toString(rounded_max));
  // keep the position for later drawing -- leave space for the legend
  int p_height = 170;
  int p_width = 220;
  int[] tmp_draw_sizes = { 2 + left_margin_d, 25,
    p_width - 2 - left_margin_d, p_height - 25 - 5 };
  drawSizes = tmp_draw_sizes; // keep it for later processing

// with the mzrgins worked out draw the plotting grid
  paint.setStyle(Paint.Style.FILL);
  paint.setColor(Color.WHITE);

// Android does by coords
  this_g
    .drawRect(drawSizes[0], drawSizes[1], drawSizes[0]
      + drawSizes[2], drawSizes[1] + drawSizes[3], paint);

paint.setColor(Color.GRAY);

// finally draw the grid

paint.setStyle(Paint.Style.STROKE);
  this_g
    .drawRect(drawSizes[0], drawSizes[1], drawSizes[0]
      + drawSizes[2], drawSizes[1] + drawSizes[3], paint);

for (int i = 1; i < 5; i++) {
   this_g.drawLine(drawSizes[0],
     drawSizes[1] + (i * drawSizes[3] / 5), drawSizes[0]
       + drawSizes[2], drawSizes[1]
       + (i * drawSizes[3] / 5), paint);
   this_g.drawLine(drawSizes[0] + (i * drawSizes[2] / 5),
     drawSizes[1], drawSizes[0] + (i * drawSizes[2] / 5),
     drawSizes[1] + drawSizes[3], paint);
  }

// good for one value
  print_axis_values_4_grid(this_g, cur_elt_array[1], Double
    .toString(rounded_max), Double.toString(rounded_min),
    cur_elt_array[0], 2, 0);

} // --- end of draw_grid ---

  2.3绘图和缩放

    这些数据点需要一到屏幕上的坐标数据范围正确的映射遍历数据点和调用drawLine接连两个点会完成我们的图表。数据点通过数据为载体,现在将调用plot_array_list

private static Point  scale_point(int this_x , double this_y  , Point drawPoint ,
            int scr_x  , int scr_y  , int scr_width  , int src_height  ,
            double maxX  , double minX  , double  maxY  , double minY  )
       {
           int temp_x, temp_y;
           Point temp = new Point();  
          
           if (maxY == minY)  //skip bad data
               return null;

//don't touch it if is nothing
           try
           {
                   temp_x = scr_x + (int)( ((double)this_x - minX) *
((double)scr_width / (maxX - minX)) );
                   temp_y = scr_y + (int)( (maxY - this_y) *
((double)src_height / (maxY - minY)) );
               
                   temp.x = temp_x;
                   temp.y= temp_y;
                   drawPoint = temp;
           }
           catch  (Exception e)
           {
       
              return (null);
           }
          
           return temp;
          
       } // --- end of scale_point --

public static boolean plot_array_list(Canvas this_g, Vector this_array_list ,
Vector these_labels , String this_title , int only_this_idx )
    {
             int idx;
             int lRow ;
             int nParms;
             int  i, points_2_plot, shifted_idx ;
             int prev_x, prev_y ;
             int cur_x=0, cur_y=0 ;
             //Dim ShowMarker As Object
             Point cur_point = new Point();
            cur_point.set(0,0);
    
             double cur_maxX, cur_minX, cur_maxY=20, cur_minY=0, cur_rangeY;
             int cur_start_x, cur_points_2_plot;
  
            int POINTS_TO_CHANGE = 30;
            double cur_OBD_val;
 
             //Object curElt; 
             String curElt;
             String[] cur_elt_array;
             Object curElt2; 
             String[] cur_elt_array2;
    
             final Paint paint = new Paint();

try // catch in this block for some thing
             {      
                   points_2_plot = this_array_list.size();
                   {
                        cur_start_x = 0;
                        cur_points_2_plot = points_2_plot;
                        cur_maxX = cur_points_2_plot;
                        cur_minX = 0;
                   }
 
                   //'Create the plot points for this series from the ChartPoints array:
  
                   curElt = (String)this_array_list.elementAt(0);
                  
                   //the lines have to come out good
                    paint.setStyle(Paint.Style.STROKE);
//                 
                   //for(  nParms = 0 ; nParms < cur_elt_array.length ; nParms++ )
                   nParms = only_this_idx;
                   {
   
                       //get cur item labels
                        curElt2 = these_labels.elementAt(nParms);
                        cur_elt_array2  = (String[]) curElt2;
                       
                        cur_maxY = get_ceiling_or_floor
(Double.parseDouble(cur_elt_array2[2]) , true);
                        cur_minY = get_ceiling_or_floor
(Double.parseDouble(cur_elt_array2[3]) , false);
                       
                        cur_points_2_plot = this_array_list.size();
                        cur_maxX = cur_points_2_plot;
   
                      curElt = (String)this_array_list.elementAt(0);
                      cur_OBD_val = Double.parseDouble( curElt);
                     
                      cur_point = scale_point(0, cur_OBD_val, cur_point,
                              drawSizes[0], drawSizes[1], drawSizes[2], drawSizes[3],
                              cur_maxX, cur_minX, cur_maxY,
      cur_minY); //'(CInt(curAxisValues.Mins(nParms - 2) / 5) + 1) * 5)
                      
                       cur_x = cur_point.x;
                       cur_y = cur_point.y;

paint.setColor(Color.GREEN);
                      
                      // the point is only cool when samples are low
                       if ( cur_points_2_plot < POINTS_TO_CHANGE)
                         this_g.drawRect(cur_x-2, cur_y-2, cur_x-2 + 4,
cur_y-2+ 4 , paint);
                      
                       prev_x = cur_x;
                       prev_y = cur_y;

//'go and plot point for this parm -- pont after the 1st one
                       for (lRow = cur_start_x +1 ; lRow< cur_start_x +
cur_points_2_plot -1 ; lRow++)
                       {       
                           curElt = (String)this_array_list.elementAt(lRow);
                          
                           cur_OBD_val = Double.parseDouble( curElt);
                                
                            //'work out an approx if cur Y values not avail(e.g. nothing)
                           // if (! (cur_elt_array[nParms ] == null ) )   //skip bad one
                             if( cur_OBD_val == Double.NaN) continue;  //skip bad one
                            {                 
      
                              
                                cur_point=scale_point(lRow, cur_OBD_val, cur_point, 
                                    drawSizes[0], drawSizes[1],
drawSizes[2], drawSizes[3],
                                    cur_maxX, cur_minX, cur_maxY, cur_minY);
   
                                cur_x = cur_point.x;
                                cur_y = cur_point.y;
                               
                                if ( cur_points_2_plot < POINTS_TO_CHANGE)
                                   this_g.drawRect(cur_x-2, cur_y-2, cur_x-2 +4,
cur_y-2 + 4, paint );

this_g.drawLine( prev_x, prev_y, cur_x, cur_y, paint);
                               prev_x = cur_x;
                               prev_y = cur_y;
                         
                            } // ' if end of this_array(lRow, nParms - 1)<> nothing
                                
                   } // end of for lrow
                              
               } // end of for nParmns

//this_g.invalidate();
            return( true);
        }
        catch (Exception e)
        {
            return( false);
        }

} // --- end of plot_array_list  --

Java完整代码:

package com.wjq.chart;

import java.util.Vector;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.graphics.Bitmap.Config;
import android.graphics.Paint.FontMetrics;
import android.os.Bundle;
import android.widget.ImageView;

public class Main extends Activity {
 static int draw_only_this_idx = -1;
 static int[] drawSizes;

@Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

ImageView image = (ImageView) findViewById(R.id.testy_img);

Bitmap emptyBmap = Bitmap.createBitmap(250, 200, Config.ARGB_8888);

int width = emptyBmap.getWidth();
  int height = emptyBmap.getHeight();
  Bitmap charty = Bitmap.createBitmap(width, height,
    Bitmap.Config.ARGB_8888);

charty = quicky_XY(emptyBmap);

image.setImageBitmap(charty);
 }

public static Bitmap quicky_XY(Bitmap bitmap) {
  // xode to get bitmap onto screen
  Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
    .getHeight(), Config.ARGB_8888);
  Canvas canvas = new Canvas(output);

final int color = 0xff0B0B61;
  final Paint paint = new Paint();
  final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
  final RectF rectF = new RectF(rect);
  final float roundPx = 12;

// get the little rounded cornered outside
  paint.setAntiAlias(true);
  canvas.drawARGB(0, 0, 0, 0);
  paint.setColor(color);
  canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

// ---- NOw just draw on this bitmap

// Set the labels info manually
  String[] cur_elt_array = new String[4];
  cur_elt_array[0] = "Voltage";
  cur_elt_array[1] = "volts";
  cur_elt_array[2] = "93"; // max
  cur_elt_array[3] = "0"; // min

Vector labels = new Vector();
  labels.add(cur_elt_array);

draw_the_grid(canvas, labels);

// se the data to be plotted and we should on our way

Vector data_2_plot = new Vector();

data_2_plot.add("0.2");
  data_2_plot.add("1.2");
  data_2_plot.add("9.6");
  data_2_plot.add("83.2");
  data_2_plot.add("44.2");
  data_2_plot.add("20.2");
  data_2_plot.add("16.2");

plot_array_list(canvas, data_2_plot, labels, "the title", 0);

canvas.drawBitmap(bitmap, rect, rect, paint);

return output;
 }

public static void draw_the_grid(Canvas this_g, Vector these_labels) {
  double rounded_max = 0.0;
  double rounded_min = 0.0;
  double rounded_max_temp;
  Object curElt;
  String[] cur_elt_array;
  int left_margin_d, right_margin_d;

if (draw_only_this_idx == -1)
   curElt = these_labels.elementAt(0); // default it to 1st one if non
  // set
  else
   curElt = these_labels.elementAt(draw_only_this_idx); // now just the
  // 1st elt

cur_elt_array = (String[]) curElt;

rounded_max = get_ceiling_or_floor(
    Double.parseDouble(cur_elt_array[2]), true);
  rounded_min = get_ceiling_or_floor(
    Double.parseDouble(cur_elt_array[3]), false);

// ok so now we have the max value of the set just get a cool ceiling
  // and we go on
  final Paint paint = new Paint();
  paint.setTextSize(15);

left_margin_d = getCurTextLengthInPixels(paint, Double
    .toString(rounded_max));
  // keep the position for later drawing -- leave space for the legend
  int p_height = 170;
  int p_width = 220;
  int[] tmp_draw_sizes = { 2 + left_margin_d, 25,
    p_width - 2 - left_margin_d, p_height - 25 - 5 };
  drawSizes = tmp_draw_sizes; // keep it for later processing

// with the mzrgins worked out draw the plotting grid
  paint.setStyle(Paint.Style.FILL);
  paint.setColor(Color.WHITE);

// Android does by coords
  this_g
    .drawRect(drawSizes[0], drawSizes[1], drawSizes[0]
      + drawSizes[2], drawSizes[1] + drawSizes[3], paint);

paint.setColor(Color.GRAY);

// finally draw the grid

paint.setStyle(Paint.Style.STROKE);
  this_g
    .drawRect(drawSizes[0], drawSizes[1], drawSizes[0]
      + drawSizes[2], drawSizes[1] + drawSizes[3], paint);

for (int i = 1; i < 5; i++) {
   this_g.drawLine(drawSizes[0],
     drawSizes[1] + (i * drawSizes[3] / 5), drawSizes[0]
       + drawSizes[2], drawSizes[1]
       + (i * drawSizes[3] / 5), paint);
   this_g.drawLine(drawSizes[0] + (i * drawSizes[2] / 5),
     drawSizes[1], drawSizes[0] + (i * drawSizes[2] / 5),
     drawSizes[1] + drawSizes[3], paint);
  }

// good for one value
  print_axis_values_4_grid(this_g, cur_elt_array[1], Double
    .toString(rounded_max), Double.toString(rounded_min),
    cur_elt_array[0], 2, 0);

} // --- end of draw_grid ---

private static Point scale_point(int this_x, double this_y,
   Point drawPoint, int scr_x, int scr_y, int scr_width,
   int src_height, double maxX, double minX, double maxY, double minY) {
  int temp_x, temp_y;
  Point temp = new Point();

if (maxY == minY) // skip bad data
   return null;

// don't touch it if is nothing
  try {
   temp_x = scr_x
     + (int) (((double) this_x - minX) * ((double) scr_width / (maxX - minX)));
   temp_y = scr_y
     + (int) ((maxY - this_y) * ((double) src_height / (maxY - minY)));

temp.x = temp_x;
   temp.y = temp_y;
   drawPoint = temp;
  } catch (Exception e) {

return (null);
  }

return temp;

} // --- end of scale_point --

public static boolean plot_array_list(Canvas this_g,
   Vector this_array_list, Vector these_labels, String this_title,
   int only_this_idx) {
  int idx;
  int lRow;
  int nParms;
  int i, points_2_plot, shifted_idx;
  int prev_x, prev_y;
  int cur_x = 0, cur_y = 0;
  // Dim ShowMarker As Object
  Point cur_point = new Point();
  cur_point.set(0, 0);

double cur_maxX, cur_minX, cur_maxY = 20, cur_minY = 0, cur_rangeY;
  int cur_start_x, cur_points_2_plot;

int POINTS_TO_CHANGE = 30;
  double cur_OBD_val;

// Object curElt;
  String curElt;
  String[] cur_elt_array;
  Object curElt2;
  String[] cur_elt_array2;

final Paint paint = new Paint();

try // catch in this block for some thing
  {
   points_2_plot = this_array_list.size();
   {
    cur_start_x = 0;
    cur_points_2_plot = points_2_plot;
    cur_maxX = cur_points_2_plot;
    cur_minX = 0;
   }

// 'Create the plot points for this series from the ChartPoints
   // array:

curElt = (String) this_array_list.elementAt(0);

// the lines have to come out good
   paint.setStyle(Paint.Style.STROKE);
   //                  
   // for( nParms = 0 ; nParms < cur_elt_array.length ; nParms++ )
   nParms = only_this_idx;
   {

// get cur item labels
    curElt2 = these_labels.elementAt(nParms);
    cur_elt_array2 = (String[]) curElt2;

cur_maxY = get_ceiling_or_floor(Double
      .parseDouble(cur_elt_array2[2]), true);
    cur_minY = get_ceiling_or_floor(Double
      .parseDouble(cur_elt_array2[3]), false);

cur_points_2_plot = this_array_list.size();
    cur_maxX = cur_points_2_plot;

curElt = (String) this_array_list.elementAt(0);
    cur_OBD_val = Double.parseDouble(curElt);

cur_point = scale_point(0, cur_OBD_val, cur_point,
      drawSizes[0], drawSizes[1], drawSizes[2], drawSizes[3],
      cur_maxX, cur_minX, cur_maxY, cur_minY); // '(CInt(curAxisValues.Mins(nParms
    // - 2) / 5)
    // + 1) * 5)

cur_x = cur_point.x;
    cur_y = cur_point.y;

paint.setColor(Color.GREEN);

// the point is only cool when samples are low
    if (cur_points_2_plot < POINTS_TO_CHANGE)
     this_g.drawRect(cur_x - 2, cur_y - 2, cur_x - 2 + 4,
       cur_y - 2 + 4, paint);

prev_x = cur_x;
    prev_y = cur_y;

// 'go and plot point for this parm -- pont after the 1st one
    for (lRow = cur_start_x + 1; lRow < cur_start_x
      + cur_points_2_plot - 1; lRow++) {
     curElt = (String) this_array_list.elementAt(lRow);

cur_OBD_val = Double.parseDouble(curElt);

// 'work out an approx if cur Y values not avail(e.g.
     // nothing)
     // if (! (cur_elt_array[nParms ] == null ) ) //skip bad one
     if (cur_OBD_val == Double.NaN)
      continue; // skip bad one
     {

cur_point = scale_point(lRow, cur_OBD_val, cur_point,
        drawSizes[0], drawSizes[1], drawSizes[2],
        drawSizes[3], cur_maxX, cur_minX, cur_maxY,
        cur_minY);

cur_x = cur_point.x;
      cur_y = cur_point.y;

if (cur_points_2_plot < POINTS_TO_CHANGE)
       this_g.drawRect(cur_x - 2, cur_y - 2,
         cur_x - 2 + 4, cur_y - 2 + 4, paint);

this_g.drawLine(prev_x, prev_y, cur_x, cur_y, paint);
      prev_x = cur_x;
      prev_y = cur_y;

} // ' if end of this_array(lRow, nParms - 1)<> nothing

} // end of for lrow

} // end of for nParmns

// this_g.invalidate();
   return (true);
  } catch (Exception e) {
   return (false);
  }

} // --- end of plot_array_list --

public static void print_axis_values_4_grid(Canvas thisDrawingArea,
   String cur_units, String cur_max, String cur_min, String cur_label,
   int x_guide, int this_idx) {
  String this_str;
  double delta = (Double.valueOf(cur_max).doubleValue() - Double.valueOf(
    cur_min).doubleValue()) / 5;

final Paint paint = new Paint();
  paint.setColor(Color.WHITE);

paint.setTypeface(Typeface.SANS_SERIF);
  paint.setTextSize(8);

for (int i = 0; i < 6; i++) {
   this_str = Double
     .toString((Double.valueOf(cur_min).doubleValue() + delta
       * i));
   final int point = this_str.indexOf('.');
   if (point > 0) {
    // If has a decimal point, may need to clip off after or force 2
    // decimal places
    this_str = this_str + "00";
    this_str = this_str.substring(0, point + 3);
   } else {
    this_str = this_str + ".00";
   }

if (i == 5) {
    thisDrawingArea.drawText(this_str, x_guide - 2, drawSizes[1]
      + drawSizes[3] - (i * drawSizes[3] / 5), paint);
   } else {
    thisDrawingArea.drawText(this_str, x_guide - 2, drawSizes[1]
      + drawSizes[3] - (i * drawSizes[3] / 5) - 3, paint);
   }

}
  paint.setTextSize(10);

switch (this_idx) {
  case 0:
   thisDrawingArea.drawText("  " + cur_label + " - " + cur_units,
     x_guide - 2, drawSizes[1] - 15, paint);

break;

default:
   thisDrawingArea.drawText("  " + cur_label + " - " + cur_units,
     x_guide - 2 - 30, drawSizes[1] - 15, paint);

break;
  }

}

private static int getCurTextLengthInPixels(Paint this_paint,
   String this_text) {
  FontMetrics fp = this_paint.getFontMetrics();
  Rect rect = new Rect();
  this_paint.getTextBounds(this_text, 0, this_text.length(), rect);
  return rect.width();
 }

public static double get_ceiling_or_floor(double this_val, boolean is_max) {
  double this_min_tmp;
  int this_sign;
  int this_10_factor = 0;
  double this_rounded;

if (this_val == 0.0) {
   this_rounded = 0.0;
   return this_rounded;
  }

this_min_tmp = Math.abs(this_val);

if (this_min_tmp >= 1.0 && this_min_tmp < 10.0)
   this_10_factor = 1;
  else if (this_min_tmp >= 10.0 && this_min_tmp < 100.0)
   this_10_factor = 10;
  else if (this_min_tmp >= 100.0 && this_min_tmp < 1000.0)
   this_10_factor = 100;
  else if (this_min_tmp >= 1000.0 && this_min_tmp < 10000.0)
   this_10_factor = 1000;
  else if (this_min_tmp >= 10000.0 && this_min_tmp < 100000.0)
   this_10_factor = 10000;

// 'cover when min is pos and neg
  if (is_max) {
   if (this_val > 0.0)
    this_sign = 1;
   else
    this_sign = -1;

} else {
   if (this_val > 0.0)
    this_sign = -1;
   else
    this_sign = 1;

}

if (this_min_tmp > 1)
   this_rounded = (double) (((int) (this_min_tmp / this_10_factor) + this_sign) * this_10_factor);
  else {
   this_rounded = (int) (this_min_tmp * 100.0);
   // ' cover same as above bfir number up to .001 less than tha it
   // will skip
   if (this_rounded >= 1 && this_rounded < 9)
    this_10_factor = 1;
   else if (this_rounded >= 10 && this_rounded < 99)
    this_10_factor = 10;
   else if (this_rounded >= 100 && this_rounded < 999)
    this_10_factor = 100;

this_rounded = (double) (((int) ((this_rounded) / this_10_factor) + this_sign) * this_10_factor);
   this_rounded = (int) (this_rounded) / 100.0;

}

if (this_val < 0)
   this_rounded = -this_rounded;

return this_rounded;

}
}

源码下载:http://files.cnblogs.com/salam/XYChart.rar

转载于:https://www.cnblogs.com/salam/archive/2010/11/10/1873437.html

通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)相关推荐

  1. [转]通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)...

    本文转自:http://www.cnblogs.com/salam/archive/2010/11/10/1873437.html 绘制一个XY集是一种很常见的任务,基于Android平台的绘制很简单 ...

  2. vue代码生成器可视化界面_手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)...

    在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...

  3. 【Python游戏】Python实现一个植物大战僵尸小游戏,非常简单,可以用于做毕业设计哟 | 附源码

    前言 halo,包子们上午好 今天给打击整一个植物大战僵尸 无广告版本 哈哈 说实话,现在的小游戏很多都是有广告,多少有点难受 今天给大家直接安排 相关文件 关注小编,私信小编领取哟! 当然别忘了一件 ...

  4. SpringCloud-服务注册与实现-Eureka创建服务提供者(附源码下载)

    场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  5. java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)

    java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

  6. 再来一个小游戏——原生js逐句解释开发简易版别踩白块,附源码

    芜湖!没想到上个做扫雷的阅读量这么高(激动) 先捞一下:做个小项目~纯原生JS手把手逐句解释写一个扫雷小游戏(附源码) 快看↑ 这次就做一个别踩白块吧哈哈哈哈哈 最终版演示地址:钢琴块 源码在最后!最 ...

  7. 一个电商项目的数据库设计实践(第一部分)(附源码)

    一次电商项目后台的数据库设计小结(第一部分)(附源码) 1.准备工作 2.用户实体 2.1 用户登陆表(customer_login) 2.2 用户信息表(customer_inf) 2.3 用户级别 ...

  8. apache poi 修改docx表格_一个excel(20M)就能干趴你的poi,你信吗(附源码)?

    点击上方"阿拉奇学Java",选择"置顶或者星标" 优质文章第一时间送达! 链接: www.cnblogs.com/rongdi/p/11872810.html ...

  9. html怎么让方块自动旋转,如何使用纯CSS实现一个圆环旋转错觉的动画效果(附源码)...

    本篇文章给大家带来的内容是关于如何使用纯CSS实现一个圆环旋转错觉的动画效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 效果预览 源代码下载 https://github.com ...

  10. java qq聊天界面_【附源码】用Java写了一个类QQ界面聊天小项目,可在线聊天!...

    原标题:[附源码]用Java写了一个类QQ界面聊天小项目,可在线聊天! 目录: 1.功能实现 2.模块划分 3.使用到知识 4.部分代码实现 5.运行例图 1.功能实现 1.修改功能(密码.昵称.个性 ...

最新文章

  1. PostgreSQL数据库dblink和postgres_fdw扩展使用比较
  2. EeePC1000hg安装archlinux20121201和openbox
  3. mongod无法启动
  4. matlab emf 读取,20140219-Emf_Demo EMF 矢量图 可以读取和保存EMF 的封闭类 非常实用 matlab 238万源代码下载- www.pudn.com...
  5. sqlalchemy 增删改
  6. 中国电信第三大IDC机房落户南海
  7. 第八章 交互技术,8.5 双11晚会背后的技术(作者:邵雍)
  8. Nginx+ffmpeg的HLS开源server搭建配置及开发具体解释
  9. JS打开新窗口(window.open() 、href)
  10. ORA-12162错误解决
  11. 再谈GOF设计模式的设计原则
  12. html5创建网站的步骤,自己建网站的流程是什么,自己建网站需要什么步骤?
  13. java源码——计算立体图形的表面积和体积
  14. Java:每日获取稳定可用免费代理ip(仅供日常使用,请勿用作他途)
  15. Arduino前馈反向传播神经网络
  16. 华为鸿蒙麒麟玉兔_华为注册整本山海经?操作系统取名鸿蒙芯片取名麒麟
  17. Redis和美团自研的Squirrel,Cellar
  18. Python中的sort()使用方法
  19. HAProxy+Pacemaker
  20. TeraCopy key

热门文章

  1. 苹果 macOS 11 Big Sur初体验, 升还是不升?
  2. 看雪CTF.TSRC 2018 团队赛 第五题 『交响曲』 解题思路
  3. Zip 文件覆盖漏洞曝光,Java、.NET、Go 生态集体中枪
  4. 给页面title添加图标
  5. 非对称加密提交表单到PHP
  6. 【java集合框架源码剖析系列】java源码剖析之HashMap
  7. 配置Nginx不同域名访问不同项目
  8. ios学习:UIToolBar的单独使用
  9. Volume Shadow Copy Service(VSS)如何工作
  10. 超详细java中的ClassLoader详解