关键词:android,achartengine,pie chart,click,点击,监听器
最近需要在自己的android应用上实现统计图的功能,后来定为要实现饼图(扇形图),网上虽然有很多的例子和各种实现方法,但是就老是没有找到一个可以在统计图尤其是饼图中实现点击(click)功能的demo,后来经过自己多天废寝忘食的寻找,终于让我找到了一个可以增加点击事件的统计图尤其是饼图的例子。
下边给出饼图部分的一些代码和实现效果,此例子用的是achartengine的包,详细代码请见文章末尾的下载网址。因为它的实现效果还不是我最想要的,我想要实现的是点击饼图的某一部分,被点击的那一部分又可以分成另外几个小部分显示出来,这样的实现效果暂时不会,请各位多多指教啊!
/**
* Copyright (C) 2009 - 2013 SC 4ViewSoft SRL
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.achartengine.chartdemo.demo.chart;
import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chartdemo.demo.R;
import org.achartengine.model.CategorySeries;
import org.achartengine.model.SeriesSelection;
import org.achartengine.renderer.DefaultRenderer;
import org.achartengine.renderer.SimpleSeriesRenderer;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
public class PieChartBuilder extends Activity {
/** Colors to be used for the pie slices. */
private static int[] COLORS = new int[] { Color.GREEN, Color.BLUE, Color.MAGENTA, Color.CYAN };
/** The main series that will include all the data. */
private CategorySeries mSeries = new CategorySeries("");
/** The main renderer for the main dataset. */
private DefaultRenderer mRenderer = new DefaultRenderer();
/** Button for adding entered data to the current series. */
private Button mAdd;
/** Edit text field for entering the slice value. */
private EditText mValue;
/** The chart view that displays the data. */
private GraphicalView mChartView;
@Override
protected void onRestoreInstanceState(Bundle savedState) {
super.onRestoreInstanceState(savedState);
mSeries = (CategorySeries) savedState.getSerializable("current_series");
mRenderer = (DefaultRenderer) savedState.getSerializable("current_renderer");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("current_series", mSeries);
outState.putSerializable("current_renderer", mRenderer);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xy_chart);
mValue = (EditText) findViewById(R.id.xValue);
mRenderer.setZoomButtonsVisible(true);
mRenderer.setStartAngle(180);
mRenderer.setDisplayValues(true);
mAdd = (Button) findViewById(R.id.add);
mAdd.setEnabled(true);
mValue.setEnabled(true);
mAdd.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
double value = 0;
try {
value = Double.parseDouble(mValue.getText().toString());
} catch (NumberFormatException e) {
mValue.requestFocus();
return;
}
mValue.setText("");
mValue.requestFocus();
mSeries.add("Series " + (mSeries.getItemCount() + 1), value);
SimpleSeriesRenderer renderer = new SimpleSeriesRenderer();
renderer.setColor(COLORS[(mSeries.getItemCount() - 1) % COLORS.length]);
mRenderer.addSeriesRenderer(renderer);
mChartView.repaint();
}
});
}
@Override
protected void onResume() {
super.onResume();
if (mChartView == null) {
LinearLayout layout = (LinearLayout) findViewById(R.id.chart);
mChartView = ChartFactory.getPieChartView(this, mSeries, mRenderer);
mRenderer.setClickEnabled(true);
// mChartView.setOnTouchListener(new View.OnTouchListener() {
//
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// // TODO Auto-generated method stub
// Toast.makeText(PieChartBuilder.this, "huangchuyang", Toast.LENGTH_SHORT)
// .show();
// return false;
// }
// });
mChartView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint();
if (seriesSelection == null) {
Toast.makeText(PieChartBuilder.this, "No chart element selected", Toast.LENGTH_SHORT)
.show();
} else {
for (int i = 0; i < mSeries.getItemCount(); i++) {
mRenderer.getSeriesRendererAt(i).setHighlighted(i == seriesSelection.getPointIndex());
mRenderer.getSeriesRendererAt(i).
}
mChartView.repaint();
Toast.makeText(
PieChartBuilder.this,
"Chart data point index " + seriesSelection.getPointIndex() + " selected"
+ " point value=" + seriesSelection.getValue(), Toast.LENGTH_SHORT).show();
}
}
});
layout.addView(mChartView, new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
} else {
mChartView.repaint();
}
}
}
下边是部分效果截图:
完整代码下载地址: http://download.csdn.net/detail/jy_sharer/6524561