使用HelloCharts开源图表库制作柱状图
来源:互联网 发布:万能看图王pdf 软件 编辑:程序博客网 时间:2024/06/11 10:45
效果图:
github地址:https://github.com/lecho/hellocharts-android
注:本文是从github的例子上做的延伸以及添加了一些注释,并未在实际项目中使用,仅供参考
经测试,在pad上会出现适配问题,柱状图的位置和下标出现混乱,暂时无法解决
layout布局:
<lecho.lib.hellocharts.view.ColumnChartView
android:id="@+id/column"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</lecho.lib.hellocharts.view.ColumnChartView>
android:id="@+id/column"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</lecho.lib.hellocharts.view.ColumnChartView>
java代码:
import java.util.ArrayList;
import java.util.List;
import java.util.List;
import lecho.lib.hellocharts.listener.ColumnChartOnValueSelectListener;
import lecho.lib.hellocharts.model.Axis;
import lecho.lib.hellocharts.model.AxisValue;
import lecho.lib.hellocharts.model.Column;
import lecho.lib.hellocharts.model.ColumnChartData;
import lecho.lib.hellocharts.model.SubcolumnValue;
import lecho.lib.hellocharts.util.ChartUtils;
import lecho.lib.hellocharts.view.Chart;
import lecho.lib.hellocharts.view.ColumnChartView;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
/** 此开源控件在pad上面显示会出现坐标柱状图位置不对照的情况 */
public class MainActivity extends Activity {
import lecho.lib.hellocharts.model.Axis;
import lecho.lib.hellocharts.model.AxisValue;
import lecho.lib.hellocharts.model.Column;
import lecho.lib.hellocharts.model.ColumnChartData;
import lecho.lib.hellocharts.model.SubcolumnValue;
import lecho.lib.hellocharts.util.ChartUtils;
import lecho.lib.hellocharts.view.Chart;
import lecho.lib.hellocharts.view.ColumnChartView;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
/** 此开源控件在pad上面显示会出现坐标柱状图位置不对照的情况 */
public class MainActivity extends Activity {
private ColumnChartView mColumnChartView;
private ColumnChartData mColumnChartData;
private ColumnChartData mColumnChartData;
private static final int DEFAULT_DATA = 0;
private static final int SUBCOLUMNS_DATA = 1;
private static final int STACKED_DATA = 2;
private static final int NEGATIVE_SUBCOLUMNS_DATA = 3;
private static final int NEGATIVE_STACKED_DATA = 4;
private static final int SUBCOLUMNS_DATA = 1;
private static final int STACKED_DATA = 2;
private static final int NEGATIVE_SUBCOLUMNS_DATA = 3;
private static final int NEGATIVE_STACKED_DATA = 4;
private boolean hasAxes = true;
private boolean hasAxesNames = true;
private boolean hasLabels = true;
private boolean hasLabelForSelected = false;
private int dataType = DEFAULT_DATA;
// private int dataType = SUBCOLUMNS_DATA;
// private int dataType = STACKED_DATA;
// private int dataType = NEGATIVE_SUBCOLUMNS_DATA;
// private int dataType = NEGATIVE_STACKED_DATA;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mColumnChartView = (ColumnChartView) findViewById(R.id.column);
mColumnChartView.setOnValueTouchListener(new ValueTouchListener());
generateData();
}
private void generateData() {
switch (dataType) {
case DEFAULT_DATA:
generateDefaultData();
break;
case SUBCOLUMNS_DATA:
generateSubcolumnsData();
break;
case STACKED_DATA:
generateStackedData();
break;
case NEGATIVE_SUBCOLUMNS_DATA:
generateNegativeSubcolumnsData();
break;
case NEGATIVE_STACKED_DATA:
generateNegativeStackedData();
break;
default:
generateDefaultData();
break;
}
}
private void reset() {
hasAxes = true;
hasAxesNames = true;
hasLabels = false;
hasLabelForSelected = false;
dataType = DEFAULT_DATA;
mColumnChartView.setValueSelectionEnabled(hasLabelForSelected);
private boolean hasAxesNames = true;
private boolean hasLabels = true;
private boolean hasLabelForSelected = false;
private int dataType = DEFAULT_DATA;
// private int dataType = SUBCOLUMNS_DATA;
// private int dataType = STACKED_DATA;
// private int dataType = NEGATIVE_SUBCOLUMNS_DATA;
// private int dataType = NEGATIVE_STACKED_DATA;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mColumnChartView = (ColumnChartView) findViewById(R.id.column);
mColumnChartView.setOnValueTouchListener(new ValueTouchListener());
generateData();
}
private void generateData() {
switch (dataType) {
case DEFAULT_DATA:
generateDefaultData();
break;
case SUBCOLUMNS_DATA:
generateSubcolumnsData();
break;
case STACKED_DATA:
generateStackedData();
break;
case NEGATIVE_SUBCOLUMNS_DATA:
generateNegativeSubcolumnsData();
break;
case NEGATIVE_STACKED_DATA:
generateNegativeStackedData();
break;
default:
generateDefaultData();
break;
}
}
private void reset() {
hasAxes = true;
hasAxesNames = true;
hasLabels = false;
hasLabelForSelected = false;
dataType = DEFAULT_DATA;
mColumnChartView.setValueSelectionEnabled(hasLabelForSelected);
}
private void generateDefaultData() {
int numSubcolumns = 1;//设置每个柱状图显示的颜色数量(每个柱状图显示多少块)
int numColumns = 8;//柱状图的数量
// Column can have many subcolumns, here by default I use 1 subcolumn in each of 8 columns.
List<Column> columns = new ArrayList<Column>();
List<SubcolumnValue> values;
for (int i = 0; i < numColumns; ++i) {
int numSubcolumns = 1;//设置每个柱状图显示的颜色数量(每个柱状图显示多少块)
int numColumns = 8;//柱状图的数量
// Column can have many subcolumns, here by default I use 1 subcolumn in each of 8 columns.
List<Column> columns = new ArrayList<Column>();
List<SubcolumnValue> values;
for (int i = 0; i < numColumns; ++i) {
values = new ArrayList<SubcolumnValue>();
for (int j = 0; j < numSubcolumns; ++j) {
SubcolumnValue value = new SubcolumnValue((float) Math.random() * 50f + 5, ChartUtils.pickColor());//第一个值是数值(值>0 方向朝上,值<0,方向朝下),第二个值是颜色
// SubcolumnValue value = new SubcolumnValue((float) Math.random() * 50f + 5, Color.parseColor("#00000000"));//第一个值是数值,第二个值是颜色
// values.add(new SubcolumnValue((float) Math.random() * 50f + 5, ChartUtils.pickColor()));
values.add(value);
}
for (int j = 0; j < numSubcolumns; ++j) {
SubcolumnValue value = new SubcolumnValue((float) Math.random() * 50f + 5, ChartUtils.pickColor());//第一个值是数值(值>0 方向朝上,值<0,方向朝下),第二个值是颜色
// SubcolumnValue value = new SubcolumnValue((float) Math.random() * 50f + 5, Color.parseColor("#00000000"));//第一个值是数值,第二个值是颜色
// values.add(new SubcolumnValue((float) Math.random() * 50f + 5, ChartUtils.pickColor()));
values.add(value);
}
Column column = new Column(values);//一个柱状图的实例
column.setHasLabels(hasLabels);//设置是否显示每个柱状图的高度,
column.setHasLabelsOnlyForSelected(hasLabelForSelected);//点击的时候是否显示柱状图的高度,和setHasLabels()和用的时候,setHasLabels()失效
columns.add(column);
}
column.setHasLabels(hasLabels);//设置是否显示每个柱状图的高度,
column.setHasLabelsOnlyForSelected(hasLabelForSelected);//点击的时候是否显示柱状图的高度,和setHasLabels()和用的时候,setHasLabels()失效
columns.add(column);
}
mColumnChartData = new ColumnChartData(columns);//表格的数据实例
if (hasAxes) {
Axis axisX = new Axis();
// axisX.setInside(true);//是否显示在里面,默认为false
AxisValue value1 = new AxisValue(0f);//值是在哪显示 0 是指 第0个柱状图
value1.setLabel("[0-15]");//设置显示的文本,默认为柱状图的位置
AxisValue value2 = new AxisValue(1.0f);
value2.setLabel("[15-30]");
AxisValue value3 = new AxisValue(2.0f);
value3.setLabel("[30-35]");
AxisValue value4 = new AxisValue(3.0f);
value4.setLabel("[35-45]");
AxisValue value5 = new AxisValue(4.0f);
value5.setLabel("[45-50]");
AxisValue value6 = new AxisValue(5.0f);
value6.setLabel("[50-55]");
AxisValue value7 = new AxisValue(6.0f);
value7.setLabel("[55-60]");
AxisValue value8 = new AxisValue(7.0f);
value8.setLabel("[65-70]");
List<AxisValue> axisValues = new ArrayList<AxisValue>();
axisValues.add(value1);
axisValues.add(value2);
axisValues.add(value3);
axisValues.add(value4);
axisValues.add(value5);
axisValues.add(value6);
axisValues.add(value7);
axisValues.add(value8);
axisX.setValues(axisValues);
Axis axisY = new Axis().setHasLines(true);
if (hasAxesNames) {
axisX.setName("Axis X(涂涂的坐标轴)");//设置X轴的注释
axisY.setName("Axis Y");//设置Y轴的注释
}
mColumnChartData.setAxisXBottom(axisX);//设置X轴显示的位置
mColumnChartData.setAxisYLeft(axisY);//设置Y轴显示的位置
} else {
mColumnChartData.setAxisXBottom(null);
mColumnChartData.setAxisYLeft(null);
}
Axis axisX = new Axis();
// axisX.setInside(true);//是否显示在里面,默认为false
AxisValue value1 = new AxisValue(0f);//值是在哪显示 0 是指 第0个柱状图
value1.setLabel("[0-15]");//设置显示的文本,默认为柱状图的位置
AxisValue value2 = new AxisValue(1.0f);
value2.setLabel("[15-30]");
AxisValue value3 = new AxisValue(2.0f);
value3.setLabel("[30-35]");
AxisValue value4 = new AxisValue(3.0f);
value4.setLabel("[35-45]");
AxisValue value5 = new AxisValue(4.0f);
value5.setLabel("[45-50]");
AxisValue value6 = new AxisValue(5.0f);
value6.setLabel("[50-55]");
AxisValue value7 = new AxisValue(6.0f);
value7.setLabel("[55-60]");
AxisValue value8 = new AxisValue(7.0f);
value8.setLabel("[65-70]");
List<AxisValue> axisValues = new ArrayList<AxisValue>();
axisValues.add(value1);
axisValues.add(value2);
axisValues.add(value3);
axisValues.add(value4);
axisValues.add(value5);
axisValues.add(value6);
axisValues.add(value7);
axisValues.add(value8);
axisX.setValues(axisValues);
Axis axisY = new Axis().setHasLines(true);
if (hasAxesNames) {
axisX.setName("Axis X(涂涂的坐标轴)");//设置X轴的注释
axisY.setName("Axis Y");//设置Y轴的注释
}
mColumnChartData.setAxisXBottom(axisX);//设置X轴显示的位置
mColumnChartData.setAxisYLeft(axisY);//设置Y轴显示的位置
} else {
mColumnChartData.setAxisXBottom(null);
mColumnChartData.setAxisYLeft(null);
}
mColumnChartView.setColumnChartData(mColumnChartData);//为View设置数据
}
/**
* Generates columns with subcolumns, columns have larger separation than subcolumns.
*/
private void generateSubcolumnsData() {
int numSubcolumns = 4;
int numColumns = 4;
// Column can have many subcolumns, here I use 4 subcolumn in each of 8 columns.
List<Column> columns = new ArrayList<Column>();
List<SubcolumnValue> values;
for (int i = 0; i < numColumns; ++i) {
* Generates columns with subcolumns, columns have larger separation than subcolumns.
*/
private void generateSubcolumnsData() {
int numSubcolumns = 4;
int numColumns = 4;
// Column can have many subcolumns, here I use 4 subcolumn in each of 8 columns.
List<Column> columns = new ArrayList<Column>();
List<SubcolumnValue> values;
for (int i = 0; i < numColumns; ++i) {
values = new ArrayList<SubcolumnValue>();
for (int j = 0; j < numSubcolumns; ++j) {
values.add(new SubcolumnValue((float) Math.random() * 50f + 5, ChartUtils.pickColor()));
}
for (int j = 0; j < numSubcolumns; ++j) {
values.add(new SubcolumnValue((float) Math.random() * 50f + 5, ChartUtils.pickColor()));
}
Column column = new Column(values);
column.setHasLabels(hasLabels);
column.setHasLabelsOnlyForSelected(hasLabelForSelected);
columns.add(column);
}
column.setHasLabels(hasLabels);
column.setHasLabelsOnlyForSelected(hasLabelForSelected);
columns.add(column);
}
mColumnChartData = new ColumnChartData(columns);
if (hasAxes) {
Axis axisX = new Axis();
Axis axisY = new Axis().setHasLines(true);
if (hasAxesNames) {
axisX.setName("Axis X");
axisY.setName("Axis Y");
}
mColumnChartData.setAxisXBottom(axisX);
mColumnChartData.setAxisYLeft(axisY);
} else {
mColumnChartData.setAxisXBottom(null);
mColumnChartData.setAxisYLeft(null);
}
Axis axisX = new Axis();
Axis axisY = new Axis().setHasLines(true);
if (hasAxesNames) {
axisX.setName("Axis X");
axisY.setName("Axis Y");
}
mColumnChartData.setAxisXBottom(axisX);
mColumnChartData.setAxisYLeft(axisY);
} else {
mColumnChartData.setAxisXBottom(null);
mColumnChartData.setAxisYLeft(null);
}
mColumnChartView.setColumnChartData(mColumnChartData);
}
/**
* Generates columns with stacked subcolumns.
*/
private void generateStackedData() {
int numSubcolumns = 4;
int numColumns = 8;
// Column can have many stacked subcolumns, here I use 4 stacke subcolumn in each of 4 columns.
List<Column> columns = new ArrayList<Column>();
List<SubcolumnValue> values;
for (int i = 0; i < numColumns; ++i) {
* Generates columns with stacked subcolumns.
*/
private void generateStackedData() {
int numSubcolumns = 4;
int numColumns = 8;
// Column can have many stacked subcolumns, here I use 4 stacke subcolumn in each of 4 columns.
List<Column> columns = new ArrayList<Column>();
List<SubcolumnValue> values;
for (int i = 0; i < numColumns; ++i) {
values = new ArrayList<SubcolumnValue>();
for (int j = 0; j < numSubcolumns; ++j) {
values.add(new SubcolumnValue((float) Math.random() * 20f + 5, ChartUtils.pickColor()));
}
for (int j = 0; j < numSubcolumns; ++j) {
values.add(new SubcolumnValue((float) Math.random() * 20f + 5, ChartUtils.pickColor()));
}
Column column = new Column(values);
column.setHasLabels(hasLabels);
column.setHasLabelsOnlyForSelected(hasLabelForSelected);
columns.add(column);
}
column.setHasLabels(hasLabels);
column.setHasLabelsOnlyForSelected(hasLabelForSelected);
columns.add(column);
}
mColumnChartData = new ColumnChartData(columns);
// Set stacked flag.
mColumnChartData.setStacked(true);
mColumnChartData.setStacked(true);
if (hasAxes) {
Axis axisX = new Axis();
Axis axisY = new Axis().setHasLines(true);
if (hasAxesNames) {
axisX.setName("Axis X");//设置X轴的注释
axisY.setName("Axis Y");//设置Y轴的注释
}
mColumnChartData.setAxisXBottom(axisX);//设置X轴显示的位置
mColumnChartData.setAxisYLeft(axisY);//设置Y轴显示的位置
} else {
mColumnChartData.setAxisXBottom(null);
mColumnChartData.setAxisYLeft(null);
}
Axis axisX = new Axis();
Axis axisY = new Axis().setHasLines(true);
if (hasAxesNames) {
axisX.setName("Axis X");//设置X轴的注释
axisY.setName("Axis Y");//设置Y轴的注释
}
mColumnChartData.setAxisXBottom(axisX);//设置X轴显示的位置
mColumnChartData.setAxisYLeft(axisY);//设置Y轴显示的位置
} else {
mColumnChartData.setAxisXBottom(null);
mColumnChartData.setAxisYLeft(null);
}
mColumnChartView.setColumnChartData(mColumnChartData);
}
}
private void generateNegativeSubcolumnsData() {
int numSubcolumns = 4;
int numColumns = 4;
List<Column> columns = new ArrayList<Column>();
List<SubcolumnValue> values;
for (int i = 0; i < numColumns; ++i) {
int numColumns = 4;
List<Column> columns = new ArrayList<Column>();
List<SubcolumnValue> values;
for (int i = 0; i < numColumns; ++i) {
values = new ArrayList<SubcolumnValue>();
for (int j = 0; j < numSubcolumns; ++j) {
int sign = getSign();
values.add(new SubcolumnValue((float) Math.random() * 50f * sign + 5 * sign, ChartUtils.pickColor
()));
}
for (int j = 0; j < numSubcolumns; ++j) {
int sign = getSign();
values.add(new SubcolumnValue((float) Math.random() * 50f * sign + 5 * sign, ChartUtils.pickColor
()));
}
Column column = new Column(values);
column.setHasLabels(hasLabels);
column.setHasLabelsOnlyForSelected(hasLabelForSelected);
columns.add(column);
}
column.setHasLabels(hasLabels);
column.setHasLabelsOnlyForSelected(hasLabelForSelected);
columns.add(column);
}
mColumnChartData = new ColumnChartData(columns);
if (hasAxes) {
Axis axisX = new Axis();
Axis axisY = new Axis().setHasLines(true);
if (hasAxesNames) {
axisX.setName("Axis X");
axisY.setName("Axis Y");
}
mColumnChartData.setAxisXBottom(axisX);
mColumnChartData.setAxisYLeft(axisY);
} else {
mColumnChartData.setAxisXBottom(null);
mColumnChartData.setAxisYLeft(null);
}
Axis axisX = new Axis();
Axis axisY = new Axis().setHasLines(true);
if (hasAxesNames) {
axisX.setName("Axis X");
axisY.setName("Axis Y");
}
mColumnChartData.setAxisXBottom(axisX);
mColumnChartData.setAxisYLeft(axisY);
} else {
mColumnChartData.setAxisXBottom(null);
mColumnChartData.setAxisYLeft(null);
}
mColumnChartView.setColumnChartData(mColumnChartData);
}
}
private void generateNegativeStackedData() {
int numSubcolumns = 4;
int numColumns = 8;
// Column can have many stacked subcolumns, here I use 4 stacke subcolumn in each of 4 columns.
List<Column> columns = new ArrayList<Column>();
List<SubcolumnValue> values;
for (int i = 0; i < numColumns; ++i) {
int numColumns = 8;
// Column can have many stacked subcolumns, here I use 4 stacke subcolumn in each of 4 columns.
List<Column> columns = new ArrayList<Column>();
List<SubcolumnValue> values;
for (int i = 0; i < numColumns; ++i) {
values = new ArrayList<SubcolumnValue>();
for (int j = 0; j < numSubcolumns; ++j) {
int sign = getSign();
values.add(new SubcolumnValue((float) Math.random() * 20f * sign + 5 * sign, ChartUtils.pickColor()));
}
for (int j = 0; j < numSubcolumns; ++j) {
int sign = getSign();
values.add(new SubcolumnValue((float) Math.random() * 20f * sign + 5 * sign, ChartUtils.pickColor()));
}
Column column = new Column(values);
column.setHasLabels(hasLabels);
column.setHasLabelsOnlyForSelected(hasLabelForSelected);
columns.add(column);
}
column.setHasLabels(hasLabels);
column.setHasLabelsOnlyForSelected(hasLabelForSelected);
columns.add(column);
}
mColumnChartData = new ColumnChartData(columns);
// Set stacked flag.
mColumnChartData.setStacked(true);
mColumnChartData.setStacked(true);
if (hasAxes) {
Axis axisX = new Axis();
Axis axisY = new Axis().setHasLines(true);
if (hasAxesNames) {
axisX.setName("Axis X");
axisY.setName("Axis Y");
}
mColumnChartData.setAxisXBottom(axisX);
mColumnChartData.setAxisYLeft(axisY);
} else {
mColumnChartData.setAxisXBottom(null);
mColumnChartData.setAxisYLeft(null);
}
Axis axisX = new Axis();
Axis axisY = new Axis().setHasLines(true);
if (hasAxesNames) {
axisX.setName("Axis X");
axisY.setName("Axis Y");
}
mColumnChartData.setAxisXBottom(axisX);
mColumnChartData.setAxisYLeft(axisY);
} else {
mColumnChartData.setAxisXBottom(null);
mColumnChartData.setAxisYLeft(null);
}
mColumnChartView.setColumnChartData(mColumnChartData);
}
}
private int getSign() {
int[] sign = new int[]{-1, 1};
return sign[Math.round((float) Math.random())];
}
private void toggleLabels() {
hasLabels = !hasLabels;
int[] sign = new int[]{-1, 1};
return sign[Math.round((float) Math.random())];
}
private void toggleLabels() {
hasLabels = !hasLabels;
if (hasLabels) {
hasLabelForSelected = false;
mColumnChartView.setValueSelectionEnabled(hasLabelForSelected);
}
hasLabelForSelected = false;
mColumnChartView.setValueSelectionEnabled(hasLabelForSelected);
}
generateData();
}
}
private void toggleLabelForSelected() {
hasLabelForSelected = !hasLabelForSelected;
mColumnChartView.setValueSelectionEnabled(hasLabelForSelected);
hasLabelForSelected = !hasLabelForSelected;
mColumnChartView.setValueSelectionEnabled(hasLabelForSelected);
if (hasLabelForSelected) {
hasLabels = false;
}
hasLabels = false;
}
generateData();
}
}
private void toggleAxes() {
hasAxes = !hasAxes;
hasAxes = !hasAxes;
generateData();
}
}
private void toggleAxesNames() {
hasAxesNames = !hasAxesNames;
hasAxesNames = !hasAxesNames;
generateData();
}
}
/**
* To animate values you have to change targets values and then call {@link Chart#startDataAnimation()}
* method(don't confuse with View.animate()).
*/
private void prepareDataAnimation() {
for (Column column : mColumnChartData.getColumns()) {
for (SubcolumnValue value : column.getValues()) {
value.setTarget((float) Math.random() * 100);
}
}
}
* To animate values you have to change targets values and then call {@link Chart#startDataAnimation()}
* method(don't confuse with View.animate()).
*/
private void prepareDataAnimation() {
for (Column column : mColumnChartData.getColumns()) {
for (SubcolumnValue value : column.getValues()) {
value.setTarget((float) Math.random() * 100);
}
}
}
private class ValueTouchListener implements ColumnChartOnValueSelectListener {
@Override
public void onValueSelected(int columnIndex, int subcolumnIndex, SubcolumnValue value) {
Toast.makeText(MainActivity.this, "Selected: " + value, Toast.LENGTH_SHORT).show();
}
public void onValueSelected(int columnIndex, int subcolumnIndex, SubcolumnValue value) {
Toast.makeText(MainActivity.this, "Selected: " + value, Toast.LENGTH_SHORT).show();
}
@Override
public void onValueDeselected() {
public void onValueDeselected() {
}
}
}
}
2 1
- 使用HelloCharts开源图表库制作柱状图
- HelloCharts图表库之柱状图
- hellocharts-android图表库之柱状图:ColunmChartView
- hellocharts图表插件---柱状图
- Android开源图表库:HelloCharts
- Android 图表开源框架HelloCharts 之 柱状图、折线图、饼状图,Fragment
- Android开源图表控件hellocharts-android简单使用
- 关于开源图表hellocharts-android的一些使用心得
- 开源图表库hellocharts之最详细的使用介绍
- 开源图表库hellocharts之最详细的使用介绍
- hellocharts-android图表库使用详解
- hellocharts-android开源图表库(效果非常好)
- hellocharts-android开源图表库(效果非常好)
- HelloCharts开源图表库(一)之折线图
- hellocharts-android开源图表库(效果非常好)
- hellocharts-android开源图表库(效果非常好)
- hellocharts-android开源图表库(效果非常好)
- android开源图表框架HelloChart的使用 (hellocharts-library-1.5.8.jar)
- Spring简介
- oracle 表空间查看
- PAT Advanced 1012
- mysql
- iOS 内存管理 (有ARC)
- 使用HelloCharts开源图表库制作柱状图
- 以此作为自己 python blog 里程的开始
- EditText限制输入金额(价格)格式
- 淘宝核心系统团队的产品线
- eclipse修改dynamic web module version
- 埃拉托斯特尼筛法求素数表
- 用户控件添加贝塞尔 曲线不显示问题
- NYOJ 53 不高兴的小明
- 整数中1出现的次数(从1到n整数中1出现的次数)