XYMultipleSeriesRenderer 绘制K线图,点击弹出pop (demo)

之前写过一个这个问题的主要代码,现在放上完整的一个demo.
备注:
我不知道怎么上传附件啊。。所以只能再次开个新文将代码粘过来。。
图片资源就没法了。。。

项目中需要添加  achartengine-0.6.0.jar
Activity:

package com.test;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;


import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;

public class TestXYActivity extends Activity {
/** Called when the activity is first created. */
private LinearLayout containerbody;
private GraphicalView mLineChartView;
private PopupWindow mPopupWindow;
private PopupWindow mPopupWindow1;
private PopupWindow popWin;
private View mPopupView;
private View mPopupView1;
private TextView mPopTxt1;
private TextView mPopTxt2;
private TextView mPopTxt3;
private TextView mPopTxt4;

private XYSeries series;
private final int CHART_MARGINS_LEFT = 20;
private final int CHART_MARGINS_TOP = 30;
private final int CHART_MARGINS_RIGHT = 20;
// private final int CHART_MARGINS_BOTTOM = 0;
private int chart_margins_bottom;
private final int CHART_X_LABELS = 9;
private final int CHART_Y_LABELS = 6;
private final int CHART_X_AXISMAX = CHART_X_LABELS + 1;
private final int CHART_Y_AXISMAX = CHART_Y_LABELS * 10;
private int panXLimit = 30;
private int lineEndX = 30;
private int mEventStartX;
// private int mEventStartY;
private int mEventEndX;
private int mEventEndY;
private int mScreenOffsetX = 0;
// private int mScreenOffsetY = 0;
private int POPWIN_WIDTH ;
private int POPWIN_HEIGHT;
private int POPWIN_WIDTH1 ;
private int POPWIN_HEIGHT1;

private List<Map<String,String>> mDataMapList = new ArrayList<Map<String,String>>();
private Map<String, String> mDataMap = new HashMap<String, String>();
private int touchPoint;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

init();

fillDataList();

initChartView();
}

private void init(){
// init PopupView
mPopupView = View.inflate(TestXYActivity.this, R.layout.pop_msg, null);
mPopTxt1 = (TextView) mPopupView.findViewById(R.id.msgText1);
mPopTxt2 = (TextView) mPopupView.findViewById(R.id.msgText2);
mPopTxt3 = (TextView) mPopupView.findViewById(R.id.msgText3);
mPopTxt1.setText("AAA");
mPopTxt2.setText("BBB");
mPopTxt3.setText("CCC");

mPopupView1 = View.inflate(TestXYActivity.this, R.layout.pop_msg1, null);
mPopTxt4 = (TextView) mPopupView1.findViewById(R.id.msgText4);
// mPopTxt4.setOnClickListener(forwardUserAcceptTodayListener);
mPopTxt4.setText("预约15条");

POPWIN_WIDTH = dip2px(this, 97.2f);
POPWIN_HEIGHT = dip2px(this, 90.6f);
POPWIN_WIDTH1 = dip2px(this, 97.2f);
POPWIN_HEIGHT1 = dip2px(this, 52f);
}

public int dip2px(Context context, float dipValue)
{
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}

private void fillDataList(){
// Calendar c = Calendar.getInstance();
Random r = new Random();
for(int i = 0;i<30;i++){

Map<String, String> tempMap = new HashMap<String, String>();
tempMap.put("BUSSUCCESS", "0");
tempMap.put("BUSTOTAL", ""+r.nextInt(30));
tempMap.put("BUSUNSUCCESS", "0");
tempMap.put("BUSFAILED", "0");
tempMap.put("type", "1");
mDataMapList.add(tempMap);
}

}


private void initChartView()
{
System.out.println("initChartView here !");
// 1, 构造显示用渲染图
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
// renderer.setPointSize(5);
// 2,进行显示
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
// 2.1, 构建数据
series = new XYSeries("业绩曲线");
// 填充数据
System.out.println("initChartView here !lineEndX = " + lineEndX);
for (int x = 0; x < lineEndX; x++)
{
// 填x,y值
mDataMap = mDataMapList.get(x);
// X轴从1开始,所以x+1
series.add(x + 1, Integer.parseInt(mDataMap.get("BUSTOTAL")));
// series.add(x + 1, (int) Math.abs(Math.random() * CHART_Y_AXISMAX));
System.out.println("x = " + (x + 1) + " | y = " + Integer.parseInt(mDataMap.get("BUSTOTAL")));
}
// 需要绘制的点放进dataset中
dataset.addSeries(series);

// 3, 对点的绘制进行设置
XYSeriesRenderer xyRenderer = new XYSeriesRenderer();
// 3.1设置K 线颜色
xyRenderer.setColor(Color.RED);
// 3.2设置点的样式
xyRenderer.setPointStyle(PointStyle.CIRCLE);
xyRenderer.setFillPoints(true);
//设置线的宽度
xyRenderer.setLineWidth(3);
// 3.3, 将要绘制的点添加到坐标绘制中
renderer.addSeriesRenderer(xyRenderer);

// 4, 设置图表属性
// 显示网格
renderer.setShowGrid(true);
// 设置4周边距
chart_margins_bottom = (int) getResources().getDimension(R.dimen.chart_margin_bottom);
renderer.setMargins(new int[] { CHART_MARGINS_TOP, CHART_MARGINS_LEFT, chart_margins_bottom, CHART_MARGINS_RIGHT });
// 边框外侧颜色
// renderer.setMarginsColor(Color.argb(0, 0xff, 0, 0)); // 穿透背景色
renderer.setMarginsColor(Color.WHITE);
// 设置背景颜色
renderer.setBackgroundColor(Color.TRANSPARENT);
// 设置背景颜色生效
renderer.setApplyBackgroundColor(true);
// 是否支持图表移动
renderer.setPanEnabled(true, false);
// 坐标滑动上、下限
renderer.setPanLimits(new double[]{1, panXLimit, 0, 100});
// 是否支持图表缩放
renderer.setZoomEnabled(false, false);
// X轴等分,最小、最大坐标值
renderer.setXLabels(CHART_X_LABELS);
renderer.setXAxisMin(1);
renderer.setXAxisMax(CHART_X_AXISMAX);
// Y轴等分,最小、最大坐标值
renderer.setYLabels(CHART_Y_LABELS);
renderer.setYAxisMin(0);
renderer.setYAxisMax(CHART_Y_AXISMAX);

// 坐标轴颜色
renderer.setAxesColor(Color.rgb(242, 103, 16));
// 坐标轴单位文字颜色、字号
renderer.setLabelsColor(Color.rgb(25, 110, 172));
renderer.setLabelsTextSize(16);
// 坐标轴文字对齐
renderer.setYLabelsAlign(Paint.Align.RIGHT);
//设置原点大小
renderer.setPointSize(5);
// 设置图表标题文字
// renderer.setChartTitle(getString(R.string.chart_title));
// 是否显示图例
renderer.setShowLegend(false);

// 生成图表视图
mLineChartView = ChartFactory.getLineChartView(TestXYActivity.this, dataset, renderer);
mLineChartView.setOnTouchListener(chartViewOnTouchListener);
mLineChartView.setId(0);

// 添加至父容器
containerbody = (LinearLayout) findViewById(R.id.container_chart);
containerbody.addView(mLineChartView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
// firstShowChart();
}
private OnTouchListener chartViewOnTouchListener = new OnTouchListener()
{
public boolean onTouch(View v, MotionEvent event)
{
// TODO Auto-generated method stub
dismissPopupWindow();

switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
mEventStartX = (int) event.getX();
// mEventStartY = (int) event.getY();
break;
case MotionEvent.ACTION_UP:
// *图表点击坐标
mEventEndX = (int) event.getX();
mEventEndY = (int) event.getY();
System.out.println("1.------------------------------");
// 屏幕是否位移
mScreenOffsetX += mEventEndX - mEventStartX == 0 ? 0 : mEventEndX - mEventStartX;
// 是否超出X轴原点(是,归0)
mScreenOffsetX = mScreenOffsetX > 0 ? 0 : mScreenOffsetX;
System.out.println("############ mOffsetX = " + mScreenOffsetX);

if (event.getX() < CHART_MARGINS_LEFT || event.getX() > containerbody.getRight() - CHART_MARGINS_LEFT || event.getY() < CHART_MARGINS_TOP
|| event.getY() > containerbody.getBottom() - CHART_MARGINS_TOP)
{
// out of the chartView, do nothing.
}
else
{
// 取屏幕宽、高
int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
// 取图表区域宽、高
int chartViewWidth = mLineChartView.getWidth();
int chartViewHeight = mLineChartView.getHeight();
// 求图表单元格宽、高
int chartCellWidth = (chartViewWidth - CHART_MARGINS_LEFT * 2) / CHART_X_LABELS;
int chartCellHeight = (chartViewHeight - CHART_MARGINS_TOP - chart_margins_bottom) / CHART_Y_LABELS;
// 是否超出X轴上限(是,取上限值)
mScreenOffsetX = mScreenOffsetX < -chartCellWidth * (panXLimit - CHART_X_AXISMAX) ? -chartCellWidth * (panXLimit - CHART_X_AXISMAX)
: mScreenOffsetX;
System.out.println("-chartCellWidth * panXLimit = " + -chartCellWidth * (panXLimit - CHART_X_AXISMAX));
System.out.println("@@@@mScreenOffsetX = " + mScreenOffsetX);
// *求图表像素坐标 换算成图表单位坐标
int chartEventX = 1 + Math.round((mEventEndX - CHART_MARGINS_LEFT) / chartCellWidth);
int chartEventY = CHART_Y_AXISMAX - Math.round((mEventEndY - CHART_MARGINS_TOP) / chartCellHeight * 10);
System.out.println("chartEventX = " + chartEventX);
System.out.println("chartEventY = " + chartEventY);
// 求位移单元格
int chartOffsetX = Math.round(mScreenOffsetX / chartCellWidth);
System.out.println("############ chartOffsetX = " + chartOffsetX);
System.out.println("2.================================");
// 求图表像素坐标 换算成屏幕像素坐标
int screenEventX = mEventEndX + (screenWidth - chartViewWidth) / 2;
int screenEventY = mEventEndY + (screenHeight - chartViewHeight) / 2;
// System.out.println("chartEventX = " + event.getX());
// System.out.println("chartEventY = " + event.getY());
// System.out.println("screenEventX = " + screenEventX);
// System.out.println("screenEventY = " + screenEventY);

boolean mType = true;
isShowPopWin: for (int i = 0; i < lineEndX; i++)
{
int pxSeriesX = ((int) (series.getX(i)) - 1) * chartCellWidth + CHART_MARGINS_LEFT;
int pxSeriesY = (CHART_Y_AXISMAX - (int) (series.getY(i))) * chartCellHeight / 10 + CHART_MARGINS_TOP;
System.out.println("3.**********************************");
// System.out.println(" mEventEndX = " + mEventEndX);
// System.out.println(" pxSeriesX + mScreenOffsetX - chartCellWidth / 2 = " + (pxSeriesX + mScreenOffsetX - chartCellWidth / 2));
// System.out.println(" pxSeriesX + mScreenOffsetX + chartCellWidth / 2 = " + (pxSeriesX + mScreenOffsetX + chartCellWidth / 2));
// System.out.println(" mEventEndY = " + mEventEndY);
// System.out.println(" pxSeriesY - chartCellHeight / 2 = " + (pxSeriesY - chartCellHeight / 2));
// System.out.println(" pxSeriesY + chartCellHeight / 2 = " + (pxSeriesY + chartCellHeight / 2));

if (mEventEndX > pxSeriesX + mScreenOffsetX - chartCellWidth / 2 && mEventEndX < pxSeriesX + mScreenOffsetX + chartCellWidth / 2
&& mEventEndY > pxSeriesY - chartCellHeight / 2 && mEventEndY < pxSeriesY + chartCellHeight / 2)
{
System.out.println(" series.getX(i) = " + series.getX(i));
System.out.println(" pxSeriesX = " + pxSeriesX);


mDataMap = mDataMapList.get(i);
String bustotal = mDataMap.get("BUSTOTAL").toString();
String busunsuccess = mDataMap.get("BUSUNSUCCESS").toString();
touchPoint = i;
// 根据type,判断窗口绿or蓝
if("0".equals(mDataMap.get("type").toString()))
{
mType = false;
mPopTxt1.setText("预约" + bustotal + "条");
mPopTxt2.setText(busunsuccess + "条");
}
else
{
mType = true;
mPopTxt4.setText("已办理" + bustotal + "条");
}
if (screenWidth - screenEventX < POPWIN_WIDTH)
{
mPopupView.setBackgroundDrawable(getResources().getDrawable(R.drawable.blue_pop_right));
mPopupView.setPadding(0, dip2px(TestXYActivity.this, 30), dip2px(TestXYActivity.this, 23), 0);
mPopTxt1.setGravity(Gravity.RIGHT);
mPopTxt2.setGravity(Gravity.RIGHT);
mPopTxt3.setGravity(Gravity.RIGHT);

mPopupView1.setBackgroundDrawable(getResources().getDrawable(R.drawable.green_pop_right));
mPopupView1.setPadding(0, dip2px(TestXYActivity.this, 30), dip2px(TestXYActivity.this, 23), 0);
mPopTxt4.setGravity(Gravity.RIGHT);

screenEventX -= POPWIN_WIDTH;
}
else
{
mPopupView.setBackgroundDrawable(getResources().getDrawable(R.drawable.blue_pop_left));
mPopupView.setPadding(dip2px(TestXYActivity.this, 23), dip2px(TestXYActivity.this, 30), 0, 0);
mPopTxt1.setGravity(Gravity.LEFT);
mPopTxt2.setGravity(Gravity.LEFT);
mPopTxt3.setGravity(Gravity.LEFT);

mPopupView1.setBackgroundDrawable(getResources().getDrawable(R.drawable.green_pop_left));
mPopupView1.setPadding(dip2px(TestXYActivity.this, 20), dip2px(TestXYActivity.this, 30), 0, 0);
mPopTxt4.setGravity(Gravity.LEFT);
}

mPopupWindow = new PopupWindow(mPopupView, POPWIN_WIDTH, POPWIN_HEIGHT);
mPopupWindow1 = new PopupWindow(mPopupView1, POPWIN_WIDTH1, POPWIN_HEIGHT1);
if(mType)
{
if (mPopupWindow1.isShowing())
{
mPopupWindow1.update(screenEventX, screenEventY, POPWIN_WIDTH, POPWIN_HEIGHT);
}
else
{
mPopupWindow1.showAtLocation(mLineChartView, Gravity.NO_GRAVITY, screenEventX, screenEventY );
}
}
else
{//+ POPWIN_HEIGHT / 2
if (mPopupWindow.isShowing())
{
mPopupWindow.update(screenEventX, screenEventY , POPWIN_WIDTH, POPWIN_HEIGHT);
}
else
{
mPopupWindow.showAtLocation(mLineChartView, Gravity.NO_GRAVITY, screenEventX, screenEventY);
}
}

break isShowPopWin;
}
}
}
break;
default:
break;
}

return false;
}
};
private void dismissPopupWindow()
{
if (mPopupWindow != null)
{
if (mPopupWindow.isShowing())
{
mPopupWindow.dismiss();
}
mPopupWindow = null;
}
if (mPopupWindow1 != null)
{
if (mPopupWindow1.isShowing())
{
mPopupWindow1.dismiss();
}
mPopupWindow1 = null;
}

if (popWin != null)
{
if (popWin.isShowing())
{
popWin.dismiss();
}
popWin = null;
}
}
}

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
android:id="@+id/container_chart"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</LinearLayout>

</LinearLayout>

pop_msg.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation = "vertical"
android:paddingLeft = "23dip"
android:paddingTop = "35dip">
<TextView
android:id = "@+id/msgText1"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:textSize = "12sp"
android:textColor = "#ff4f4f4f" ></TextView>
<TextView
android:id = "@+id/msgText2"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:textSize = "14sp"
android:textColor = "#ffff0000"></TextView>
<TextView
android:id = "@+id/msgText3"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:textSize = "13sp"
android:textColor = "#ff2f2f2f">
</TextView>
</LinearLayout>

pop_msg1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation = "vertical"
android:paddingLeft = "10dip"
android:paddingTop = "35dip">
<TextView
android:id = "@+id/msgText4"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:textSize = "12sp"
android:textColor = "#ff4f4f4f"
android:gravity="center_horizontal"></TextView>
</LinearLayout>

dimens:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="chart_margin_bottom">90px</dimen>
</resources>

另外,由于设置显示view高度不同,点击显示pop的y坐标需要根据实际情况设置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值