- 浏览: 578390 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (411)
- webservice (3)
- oracle (37)
- sqlserver (8)
- j2ee (56)
- linux (7)
- javaweb (47)
- office (1)
- struts (23)
- hibernate (11)
- spring (29)
- 网络 (2)
- tomcat (13)
- tongweb (0)
- weblogic (0)
- powerdesiginer (3)
- svn (3)
- js (20)
- ie (2)
- 编译 (3)
- css (2)
- 操作系统 (5)
- Android (41)
- jbpm4.3 (1)
- fckeditor (3)
- 操作excel (2)
- db2常用命令 (1)
- ibatis (5)
- mysql (16)
- 表达式语言 (1)
- java方式调用存储过程 (1)
- ca (1)
- linux客户端 (1)
- 电子数码 (1)
- 行业应用 (12)
- 开发工具 (4)
- 面试 (1)
- 计算机原理 (1)
- NOSQL (5)
- 虚拟机 (1)
- nginx (0)
- velocity (2)
- jndi (1)
- spring mvc (39)
- springmvc (32)
- 安全 (5)
- htmleditor (6)
- iphone4 (1)
- html (4)
- jstl (2)
- ckeditor (5)
- 连接池 (1)
- jquery (6)
- 分页 (1)
- 技术研发规则 (1)
- javamail (1)
- maven (2)
- upload (1)
- log (1)
- 测试 (10)
- spring roo (1)
- 版本控制 (2)
- find bugs (0)
- jsf (0)
- springroo (0)
- 小道理 (1)
- 小道理,技术标准 (1)
- jsf (0)
- bitbao (2)
- redmine (3)
- 团队意识 (1)
- mybatis (2)
- jquery mobile (1)
- flexpaper (0)
- json (4)
- URLRewriteFilte (1)
- html5 (1)
- 都乐保活动 (0)
- openfire (0)
- TreeMap (1)
- build (0)
- javaweb,tag (0)
- algorithm (1)
- tag (2)
- 扯淡 (0)
- mac (2)
- 叶一火(老一) (1)
- 游玩 (1)
- 编码 (1)
- 上线部署 (0)
- 研发管理 (0)
- thumbnailator (2)
- 旅游 (0)
- bingweibo (1)
- 杂谈 (4)
- ktv (1)
- weibo (1)
- 爱情 (2)
- 饮食 (1)
- MediaWiki (1)
- git (1)
- 版本库 (1)
- servlet (1)
- 感悟 (1)
- 人生 (1)
- highcharts (1)
- poi (0)
- websphere (0)
- php (1)
最新评论
-
woshixushigang:
good
org.springframework.beans.TypeMismatchException: Failed to convert property valu -
nathanleewei:
org.springframework.jdbc.core.B ...
org.springframework.beans.TypeMismatchException: Failed to convert property valu -
浪禾木:
请问是ckeditor\contents.css吗?改过以后 ...
ckeditor自动换行问题 -
simusuishi:
刚哥威武!
ckeditor取值赋值问题 -
a455642158:
收割完毕……
Android开源项目源码下载(不断更新中)
通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
绘制一个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;
}
}
发表评论
-
Android 菜单(OptionMenu)大全 建立你自己的菜单
2011-04-29 12:09 987Android 菜单(OptionMenu)大全 建立你自己 ... -
Android学习点点滴滴之获取系统可用内存
2011-04-29 12:08 958Android学习点点滴滴之获取系统可用内存 ... -
Android学习点点滴滴之获取正在运行的进程
2011-04-29 12:07 1050Android学习点点滴滴之获取正在运行的进程 ... -
Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)
2011-04-29 12:07 1211Android 应用程序窗体显示状态操作(requestWi ... -
Android游戏开发教程汇总
2011-04-29 12:06 1095Android游戏开发教程汇总 把最近搜集到 ... -
Android 对话框(Dialog)大全 建立你自己的对话框
2011-04-29 12:06 859Android 对话框(Dialog)大全 建立你自己的对话框 ... -
Android资源总结(开发工具/环境搭建/教程/论坛/博客/反编译工具)
2011-04-29 12:05 913Android资源总结(开发工具/环境搭建/教程/论坛/博客 ... -
android Toast大全(五种情形)建立属于你自己的Toast
2011-04-29 12:04 814android Toast大全(五种情形)建立属于你自己的T ... -
Android2.3操作系统即将发布,亮点解读
2011-04-29 12:02 1042Android2.3操作系统即将发布,亮点解读 ... -
Android之Bundle传递数据详解与实例及Bundle与SharedPreferences的区别
2011-04-29 12:02 1264Android之Bundle传递数据详解与实例及Bundle ... -
Android开源项目源码下载(不断更新中)
2011-04-29 12:01 5797Android开源项目源码下 ... -
android控件之VideoView建立自己的播放器
2011-04-29 12:01 1163android控件之VideoView建立自己的播放器 ... -
Android控件之ZoomButton缩放按钮
2011-04-29 12:00 1108Android控件之ZoomButton缩放按钮 ... -
Android控件之ZoomControls缩放控件
2011-04-29 12:00 1331Android控件之ZoomControls缩放控件 ... -
Android简单数据存储类SharedPreferences详解及实例(通过“记住密码”功能学习SharedPreferences)
2011-04-29 11:58 1159Android简单数据存储类SharedPreference ... -
Android布局控件之LinearLayout详解
2011-04-29 11:58 1361Android布局控件之LinearLa ... -
Android控件之SlidingDrawer(滑动式抽屉)详解与实例
2011-04-29 11:56 1318Android控件之SlidingDrawer ... -
转Android系统架构
2011-04-29 11:55 898转Android系统架构 Android的系统 ... -
Android学习资料分享(不断更新中)
2011-04-29 11:54 1373Android学习资料分享(不断更新中) 最近 ... -
Android权限说明
2011-04-29 11:53 777Android权限说明 程序执行需要读取到安全敏 ...
相关推荐
通过创建一个位图的XY Chart来深入学习Android绘图类Rect、Paint、Bitmap与Canvas,是一种有效掌握Android图形处理机制的方式。在这个过程中,我们将重点理解这些核心类的作用以及它们之间的相互作用,从而能够构建...
`drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)`是`drawBitmap()`方法的一个重载版本,其参数含义如下: 1. **Bitmap bitmap**: 这是你要绘制的位图对象,通常是从资源文件、内存缓存或者直接创建的...
例如,你可以创建一个自定义的进度条,使用Canvas绘制背景和进度条,通过改变Paint的颜色和位置来显示进度。或者创建一个可交互的图表视图,根据数据动态更新Canvas上的图形。 通过深入理解和实践Paint和Canvas的...
- **缩放**:`Bitmap.createScaledBitmap(Bitmap source, int width, int height, boolean filter)`用于创建一个新的缩放后的Bitmap。 - **裁剪**:`Bitmap.createBitmap(Bitmap source, int x, int y, int width,...
使用`Bitmap.createBitmap()`来创建一个新的Bitmap时,可以指定其宽度、高度和颜色格式,以控制内存消耗。同时,记得在不再使用Bitmap时调用`recycle()`释放资源,但需要注意,一旦回收,不能再次使用。 3. **位图...
例如,你可以创建一个`Bitmap`,然后在它的`Canvas`上画一个红色的圆: ```java Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint paint = ...
通过本文的学习,我们可以了解到在Android开发中如何利用`Rect`类来绘制各种图形元素。这些基础知识对于开发者来说非常重要,可以帮助他们更灵活地控制应用界面的设计和布局。同时,了解`Rect`与其他图形绘制工具...
Canvas是Android中的一个类,它提供了各种绘制方法,如drawRect(), drawCircle(), drawBitmap()等,用于在SurfaceView、ImageView等组件上进行绘图。Canvas的主要功能是接受绘图命令,并将它们应用到指定的Bitmap或...
通过分析这个压缩包中的"4-7-2(Canvas画布)"文件,开发者可以学习如何创建Canvas,使用Paint设置样式,以及如何绘制基本图形和Bitmap。实践中,不断试验和调整,掌握Canvas的使用将极大地提升你在Android应用开发中...
创建一个协程并在通道上发送绘图任务: ```kotlin launch(Dispatchers.Main) { val drawingChannel = Channel() drawingChannel.send { canvas.drawSomethingComplicated() } drawingChannel.receive().run() ...
在Android开发中,Canvas是用于在屏幕上绘制图形的重要工具,它是`android.graphics.Canvas`类的实例。本篇文章将深入探讨如何使用Android Canvas进行图形绘制,包括基本概念、常用方法以及实际应用示例。 Canvas...
首先,我们需要创建一个Bitmap对象,然后获取Canvas实例,通常通过Bitmap的`createCanvas()`方法。接下来,我们就可以调用Canvas的各种draw方法开始绘制了。 1. **基础绘图方法**: - `drawRect(Rect rect, Paint ...
Android自定义View中Paint、Rect、Canvas是三个非常重要的组件, Paint类用于设置绘制的颜色、样式等属性,Rect类用于定义一个矩形区域,Canvas类用于实现各种图形的绘制工作。在自定义View中,我们可以使用这三个...
首先,我们需要创建一个圆形的画布(Canvas),然后在这个画布上绘制Bitmap。这里的关键在于使用PorterDuffXfermode模式,它可以控制图像如何与画布上的现有内容混合。具体操作如下: 1. 创建一个与原Bitmap大小...
在实际开发中,通常会创建一个自定义的View类,重写`onDraw()`方法,在其中使用Canvas进行绘制。Paint对象是Canvas的得力助手,它可以设置颜色、样式、抗锯齿、纹理等多种属性,以实现更丰富的绘图效果。 除了基本...
首先创建一个新的`Bitmap` 和一个`Canvas`,然后定义一个圆形的边界,使用`drawRoundRect()` 方法绘制一个圆角矩形。接着通过`PorterDuffXfermode` 设置混合模式为`SRC_IN`,并使用`drawBitmap()` 方法将原`Bitmap` ...
在Android的Canvas类中,`clipPath()`是一个用于剪裁绘制区域的方法,它可以将当前的绘图限制在一个特定的路径内。通过这个功能,我们可以创建出各种形状的视图,比如圆形。在实现CircleImageView时,我们可以通过`...
在Android开发中,绘制图形是常见且重要的任务之一,而`Paint`类是Android系统提供的一个核心绘图工具。本文将深入探讨如何使用`Paint`类实现渐变色效果,特别是在自定义`View`中的应用。 渐变色在UI设计中广泛使用...
Canvas 类是Android图形库中的基础类,它相当于一个画布,允许开发者在其上绘制各种图形和图像。在Android绘图过程中,通常需要以下四个元素: 1. 位图(Bitmap):存储像素数据。 2. Canvas 画板:承载绘画内容,...
总的来说,这个压缩包中的源码是为Android开发者提供的一个便利工具,可以帮助他们快速实现圆形和圆角图片的显示,提高开发效率。理解并掌握这些方法的实现原理,对于提升Android UI开发技能大有裨益。