安卓如何画曲线图? 安卓源码 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单啊,Android的2D API很丰富的 你去看《Android游戏开发大全》里面就有,而且还有源码。我正在看,倒是可以画出来,就是不想写,等我有空了写给你看。 先声明我是用Android Studio 0.4.6做的,这东西按Tab键能自动把代码补齐,所以比较适合手残党,就是反应有点慢。下面这个Class是主要实现的Class:package com.ak.myapplication2.app;//蓝色部分换成你的包在的位置import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;/** * Created by Administrator on 14-4-11. */public class AWP extends View{ public AWP(Context context, AttributeSet attrs) { super(context, attrs); } protected void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.drawColor(Color.BLACK);//设置背景颜色 Paint paint=new Paint(); paint.setColor(Color.BLUE); for(int i=0;i<100;i++){ canvas.drawPoint(i,i,paint);//这就是画布Canvas的画点函数,你完全可以在这里用这个函数去画复杂的曲线,只要你的数学好 } }}下面是调用上面那个AWP画图函数的布局XML文件main_awp.xml:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.ak.myapplication2.app.AWP//这里就是刚才那个Class的名字 android:id="@+id/awp" android:layout_width="fill_parent" android:layout_height="fill_parent" /></LinearLayout>这里是调用上面那个布局XML文件main_awp.xml的Class:package com.ak.myapplication2.app;import android.app.Activity;import android.os.Bundle;/** * Created by Administrator on 14-4-11. */public class MainAWP extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.awp_main);//这里的awp_main就是上面那个xml文件的名称 }}下面是的布局文件AndroidManifest.xml调用上面的那个主Class MainAWP:<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ak.myapplication2.app" > <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.ak.myapplication2.app.MainAWP"//这里就是上面那个主Class android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>没了。 这是主要部分(第一部分)修改后的代码。我的手机是1080*1920像素的,所以我把W和H分别设成了1080和1800:package com.ak.myapplication2.app;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;/** * Created by Administrator on 14-4-11. */public class AWP extends View{ float L=0,U=0,W=1080,H=1800,Ox=L+W/2,Oy=U+H/2;//左,上,宽,高,原点在画布上的x坐标,原点在画布上的y坐标 public AWP(Context context, AttributeSet attrs) { super(context, attrs); } protected void onDraw(Canvas canvas){ super.onDraw(canvas); Paint paint=new Paint(); paint.setARGB(255,175,175,175); drawGrid(canvas, paint, 0.4f, 0.1f,2*(float)Math.PI,2); paint.setARGB(255,255,0,0); for(float x=-2f*(float)Math.PI;x<2f*(float)Math.PI;x+=0.001){ drawPoint(canvas, paint, x,(float)Math.sin(x),2*(float)Math.PI,2); } } //使用像素点单位画网格 private void drawGrid(Canvas canvas,Paint paint,float dx,float dy){ float x=Ox,y=Oy; while (x>L){ canvas.drawLine(x,U,x,U+H,paint); x-=dx; } x=Ox; while (x<L+W){ canvas.drawLine(x,U,x,U+H,paint); x+=dx; } while (y>U){ canvas.drawLine(L,y,L+W,y,paint); y-=dy; } y=Oy; while (y<U+H){ canvas.drawLine(L,y,L+W,y,paint); y+=dy; } paint.setARGB(255,0,0,0); x=Ox; canvas.drawLine(x,U,x,U+H,paint); y=Oy; canvas.drawLine(L,y,L+W,y,paint); } //使用自定义单位画网格。 private void drawGrid(Canvas canvas,Paint paint,float dx,float dy,float halfWidth,float halfHeight){ float x=Ox,y=Oy,dpx=dx*W/2f/halfWidth,dpy=dy*H/2f/halfHeight; while (x>L){ canvas.drawLine(x,U,x,U+H,paint); x-=dpx; } x=Ox; while (x<L+W){ canvas.drawLine(x,U,x,U+H,paint); x+=dpx; } while (y>U){ canvas.drawLine(L,y,L+W,y,paint); y-=dpy; } y=Oy; while (y<U+H){ canvas.drawLine(L,y,L+W,y,paint); y+=dpy; } paint.setARGB(255,0,0,0); x=Ox; canvas.drawLine(x,U,x,U+H,paint); y=Oy; canvas.drawLine(L,y,L+W,y,paint); } //像素单位画点 private void drawPoint(Canvas canvas,Paint paint,float x,float y){ canvas.drawPoint(x+Ox,Oy-y,paint); } //自定义单位画点,halfWidth与halfHeight把画布的半宽与半高自定义化。如drawGrid(canvas,paint,0.5f,0.0f,1f,1f)将在X轴的右半部分的一半处画一个点 private void drawPoint(Canvas canvas,Paint paint,float x,float y,float halfWidth,float halfHeight){ drawPoint(canvas,paint,W/2f/halfWidth*x,H/2f/halfHeight*y); }}这是调试时的手机屏幕截图: 我在网上找了歌DEMO,但是曲线的title无法显示, 不知道为什么,求大神解答啊package com.viziner.minecoal.ui.activitys;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.Random;import java.util.Timer;import org.achartengine.ChartFactory;import org.achartengine.GraphicalView;import org.achartengine.chart.PointStyle;import org.achartengine.model.TimeSeries;import org.achartengine.model.XYMultipleSeriesDataset;import org.achartengine.model.XYSeries;import org.achartengine.renderer.XYMultipleSeriesRenderer;import org.achartengine.renderer.XYSeriesRenderer;import org.androidannotations.annotations.AfterViews;import org.androidannotations.annotations.Bean;import org.androidannotations.annotations.EActivity;import org.androidannotations.annotations.Extra;import org.androidannotations.annotations.ViewById;import org.androidannotations.annotations.WindowFeature;import android.content.Intent;import android.graphics.Color;import android.util.Log;import android.view.Window;import android.view.ViewGroup.LayoutParams;import android.widget.LinearLayout;import com.viziner.minecoal.R;import com.viziner.minecoal.listener.TitleClickListener;import com.viziner.minecoal.rest.Tools;import com.viziner.minecoal.ui.viewgroup.TitleView;import com.viziner.minecoal.ui.views.MyChartView;@EActivity(R.layout.qu_xian_3)@WindowFeature(value = { Window.FEATURE_NO_TITLE, Window.FEATURE_INDETERMINATE_PROGRESS })public class QuXian_3_Activity extends BaseActivity implements TitleClickListener { @ViewById TitleView title; private GraphicalView chart; @Extra String[] time, data; Double[] datas; /** 曲线数量 */ private static final int SERIES_NR = 1; private TimeSeries series1; private XYMultipleSeriesDataset dataset1; /** 时间数据 */ Date[] xcache = new Date[20]; /** 数据 */ int[] ycache = new int[20]; double max, min; @Override public void backClick() { finish(); } @Override public void otherClick() { if (!networkStatusOK(this)) { showTextToast("网络未连接!"); return; } startActivityForResult(new Intent(this, QuXianSheZhiActivity_.class), 200); } @AfterViews void afterview() { title.setTitle("数据曲线"); title.titleType(TitleView.TYPE.BOTH_BTN); title.setButton2Src(R.drawable.set_bg); title.setListener(this); LinearLayout layout = (LinearLayout)findViewById(R.id.linearlayout); datas = new Double[data.length]; for (int i = 0; i < data.length; i++){ datas[i] = Double.valueOf(data[i]); } max = datas[0]; for (int i = 0; i < datas.length; i++){ if (datas[i] > max){ max = datas[i]; } } min = datas[0]; for (int i = 0; i < datas.length; i++){ if (datas[i] < min){ min = datas[i]; } } chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(), getDemoRenderer(max, min), "HH:mm"); layout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT, 900)); } private XYMultipleSeriesRenderer getDemoRenderer(double maxX, double minX) { XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); renderer.setChartTitleTextSize(20); renderer.setAxisTitleTextSize(16); renderer.setAxesColor(Color.YELLOW); renderer.setLabelsTextSize(35); //数轴刻度字体大小 renderer.setLabelsColor(Color.BLACK); renderer.setLegendTextSize(15); //曲线说明 renderer.setXLabelsColor(Color.WHITE); renderer.setYLabelsColor(0,Color.WHITE); renderer.setShowLegend(false); renderer.setMargins(new int[] {20, 30, 100, 0}); XYSeriesRenderer r = new XYSeriesRenderer(); r.setColor(Color.GREEN); r.setChartValuesTextSize(15); r.setChartValuesSpacing(3); r.setPointStyle(PointStyle.CIRCLE); r.setFillBelowLine(true); r.setFillBelowLineColor(0xffffff); r.setFillPoints(true); renderer.addSeriesRenderer(r); renderer.setMarginsColor(0xffffff); renderer.setShowGrid(true); renderer.setYAxisMax(maxX * 1.1); renderer.setYAxisMin(minX * 1.1); renderer.setXLabels(6); renderer.setInScroll(true); //调整大小 renderer.setPanEnabled(true, true); return renderer; } /** * 数据对象 * @return */ private XYMultipleSeriesDataset getDateDemoDataset() { dataset1 = new XYMultipleSeriesDataset(); final int nr = 60;// long value = new Date().getTime();// Random r = new Random(); Calendar c = Calendar.getInstance(); for (int i = 0; i < SERIES_NR; i++) { series1 = new TimeSeries("Demo" + (i + 1));// for (int k = 0; k < nr; k++) {// series1.add(new Date(value - 60000 * 60 +k*1000*60), 20 +r.nextInt() % 10); for (int k = 0; k < time.length; k++) { try { c.setTime(new SimpleDateFormat("yyyyMMddHHmmss").parse(time[k])); } catch (ParseException e) { e.printStackTrace(); Log.e("err", e.getMessage()); } series1.add(new Date(c.getTimeInMillis()+33000), datas[k]); } dataset1.addSeries(series1); } return dataset1; }} 我有demo 今天刚下的 csdn 上面有 和你说的需求差不多 package com.example.mycharttest;import java.util.Date;import java.util.Random;import java.util.Timer;import java.util.TimerTask;import org.achartengine.ChartFactory;import org.achartengine.GraphicalView;import org.achartengine.chart.PointStyle;import org.achartengine.model.TimeSeries;import org.achartengine.model.XYMultipleSeriesDataset;import org.achartengine.renderer.XYMultipleSeriesRenderer;import org.achartengine.renderer.XYSeriesRenderer;import android.app.Activity;import android.content.Intent;import android.graphics.Color;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;public class RtChartsActivity extends Activity { private Timer timer = new Timer(); private GraphicalView chart; private TextView textview; private TimerTask task; private int addY = -1; private long addX; /**«˙œfl ˝¡ø*/ private static final int SERIES_NR=1; private static final String TAG = "message"; private TimeSeries series1; private XYMultipleSeriesDataset dataset1; private Handler handler; private Random random=new Random(); /** ±º‰ ˝æ›*/ Date[] xcache = new Date[20]; /** ˝æ›*/ int[] ycache = new int[20]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rtchart); LinearLayout layout = (LinearLayout)findViewById(R.id.linearlayout); //…˙≥…Õº±Ì chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(), getDemoRenderer(), "hh:mm:ss"); layout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT,380)); //Œ™TextViewÃ̺” ¬º˛ textview = (TextView)findViewById(R.id.myview); textview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(RtChartsActivity.this, "ceshiview", 1).show(); Intent intent = new Intent(); intent.setClass(RtChartsActivity.this, MainActivity.class); startActivity(intent); } }); handler = new Handler() { @Override public void handleMessage(Message msg) { //À¢–¬Õº±Ì updateChart(); super.handleMessage(msg); } }; task = new TimerTask() { @Override public void run() { Message message = new Message(); message.what = 200; handler.sendMessage(message); } }; timer.schedule(task, 2*1000,1000); } private void updateChart() { //…Ë∂®≥§∂»Œ™20 int length = series1.getItemCount(); if(length>=20) length = 20; addY=random.nextInt()%10; addX=new Date().getTime(); //Ω´«∞√ʵƒµ„∑≈»Îª∫¥Ê for (int i = 0; i < length; i++) { xcache[i] = new Date((long)series1.getX(i)); ycache[i] = (int) series1.getY(i); } series1.clear(); //Ω´–¬≤˙…˙µƒµ„ ◊œ»º”»ÎµΩµ„ºØ÷–£¨»ª∫Û‘⁄—≠ª∑ÃÂ÷–Ω´◊¯±Í±‰ªª∫Ûµƒ“ªœµ¡–µ„∂º÷ÿ–¬º”»ÎµΩµ„ºØ÷– //’‚¿Ôø…“‘ ‘—È“ªœ¬∞—À≥–Úµflµππ˝¿¥ « ≤√¥–ßπ˚£¨º¥œ»‘À––—≠ª∑㨑ŸÃ̺”–¬≤˙…˙µƒµ„ series1.add(new Date(addX), addY); for (int k = 0; k < length; k++) { series1.add(xcache[k], ycache[k]); } //‘⁄ ˝æ›ºØ÷–Ã̺”–¬µƒµ„ºØ dataset1.removeSeries(series1); dataset1.addSeries(series1); //«˙œfl∏¸–¬ chart.invalidate(); } /** * …Ë∂®»Á±Ì—˘ Ω * @return */ private XYMultipleSeriesRenderer getDemoRenderer() { XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); renderer.setChartTitle(" µ ±«˙œfl");//±Í renderer.setChartTitleTextSize(20); renderer.setXTitle(" ±º‰"); //x÷·Àµ√˜ renderer.setAxisTitleTextSize(16); renderer.setAxesColor(Color.BLACK); renderer.setLabelsTextSize(15); // ˝÷·øÃ∂»◊÷ÃÂ¥Û–° renderer.setLabelsColor(Color.BLACK); renderer.setLegendTextSize(15); //«˙œflÀµ√˜ renderer.setXLabelsColor(Color.BLACK); renderer.setYLabelsColor(0,Color.BLACK); renderer.setShowLegend(false); renderer.setMargins(new int[] {20, 30, 100, 0}); XYSeriesRenderer r = new XYSeriesRenderer(); r.setColor(Color.BLUE); r.setChartValuesTextSize(15); r.setChartValuesSpacing(3); r.setPointStyle(PointStyle.CIRCLE); r.setFillBelowLine(true); r.setFillBelowLineColor(Color.WHITE); r.setFillPoints(true); renderer.addSeriesRenderer(r); renderer.setMarginsColor(Color.WHITE); renderer.setPanEnabled(false,false); renderer.setShowGrid(true); renderer.setYAxisMax(50); renderer.setYAxisMin(-30); renderer.setInScroll(true); //µ˜’˚¥Û–° return renderer; } /** * ˝æ›∂‘œÛ * @return */ private XYMultipleSeriesDataset getDateDemoDataset() { dataset1 = new XYMultipleSeriesDataset(); final int nr = 10; long value = new Date().getTime(); Random r = new Random(); for (int i = 0; i < SERIES_NR; i++) { series1 = new TimeSeries("Demo series " + (i + 1)); for (int k = 0; k < nr; k++) { series1.add(new Date(value+k*1000), 20 +r.nextInt() % 10); } dataset1.addSeries(series1); } Log.i(TAG, dataset1.toString()); return dataset1; } @Override public void onDestroy() { //µ±Ω· ¯≥Ã–Ú ±πÿµÙTimer timer.cancel(); super.onDestroy(); };} Button ImageView ImageButton有关问题 关于设置播放器大小问题 android 平板只用UDP接收数据,CPU就占70%,太不正常了。 doInBackground(String... values)该函数的参数是啥意思啊 打开wrox的代码报错 如下 ANDROID开版,散分祝贺 请教:在已经root设备上的apk代码中运行shell指令为何失败 请问 关于在fragment使用popupwindow 弹出对话框的问题 请教树莓派和安卓问题 如何让安卓apk 在手机中自动静默更新 android布局问题 android怎么限制其他程序访问网络。
package com.ak.myapplication2.app;//蓝色部分换成你的包在的位置
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;/**
* Created by Administrator on 14-4-11.
*/
public class AWP extends View{
public AWP(Context context, AttributeSet attrs) {
super(context, attrs);
}
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawColor(Color.BLACK);//设置背景颜色
Paint paint=new Paint();
paint.setColor(Color.BLUE);
for(int i=0;i<100;i++){
canvas.drawPoint(i,i,paint);//这就是画布Canvas的画点函数,你完全可以在这里用这个函数去画复杂的曲线,只要你的数学好
}
}
}下面是调用上面那个AWP画图函数的布局XML文件main_awp.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.ak.myapplication2.app.AWP//这里就是刚才那个Class的名字
android:id="@+id/awp"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>这里是调用上面那个布局XML文件main_awp.xml的Class:
package com.ak.myapplication2.app;import android.app.Activity;
import android.os.Bundle;/**
* Created by Administrator on 14-4-11.
*/
public class MainAWP extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.awp_main);//这里的awp_main就是上面那个xml文件的名称
}
}下面是的布局文件AndroidManifest.xml调用上面的那个主Class MainAWP:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ak.myapplication2.app" > <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.ak.myapplication2.app.MainAWP"//这里就是上面那个主Class
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application></manifest>
没了。
我的手机是1080*1920像素的,所以我把W和H分别设成了1080和1800:
package com.ak.myapplication2.app;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;/**
* Created by Administrator on 14-4-11.
*/
public class AWP extends View{
float L=0,U=0,W=1080,H=1800,Ox=L+W/2,Oy=U+H/2;//左,上,宽,高,原点在画布上的x坐标,原点在画布上的y坐标
public AWP(Context context, AttributeSet attrs) {
super(context, attrs);
}
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
Paint paint=new Paint();
paint.setARGB(255,175,175,175);
drawGrid(canvas, paint, 0.4f, 0.1f,2*(float)Math.PI,2);
paint.setARGB(255,255,0,0);
for(float x=-2f*(float)Math.PI;x<2f*(float)Math.PI;x+=0.001){
drawPoint(canvas, paint, x,(float)Math.sin(x),2*(float)Math.PI,2);
}
}
//使用像素点单位画网格
private void drawGrid(Canvas canvas,Paint paint,float dx,float dy){
float x=Ox,y=Oy;
while (x>L){
canvas.drawLine(x,U,x,U+H,paint);
x-=dx;
}
x=Ox;
while (x<L+W){
canvas.drawLine(x,U,x,U+H,paint);
x+=dx;
} while (y>U){
canvas.drawLine(L,y,L+W,y,paint);
y-=dy;
}
y=Oy;
while (y<U+H){
canvas.drawLine(L,y,L+W,y,paint);
y+=dy;
}
paint.setARGB(255,0,0,0);
x=Ox;
canvas.drawLine(x,U,x,U+H,paint);
y=Oy;
canvas.drawLine(L,y,L+W,y,paint);
}
//使用自定义单位画网格。
private void drawGrid(Canvas canvas,Paint paint,float dx,float dy,float halfWidth,float halfHeight){
float x=Ox,y=Oy,dpx=dx*W/2f/halfWidth,dpy=dy*H/2f/halfHeight;
while (x>L){
canvas.drawLine(x,U,x,U+H,paint);
x-=dpx;
}
x=Ox;
while (x<L+W){
canvas.drawLine(x,U,x,U+H,paint);
x+=dpx;
} while (y>U){
canvas.drawLine(L,y,L+W,y,paint);
y-=dpy;
}
y=Oy;
while (y<U+H){
canvas.drawLine(L,y,L+W,y,paint);
y+=dpy;
}
paint.setARGB(255,0,0,0);
x=Ox;
canvas.drawLine(x,U,x,U+H,paint);
y=Oy;
canvas.drawLine(L,y,L+W,y,paint);
}
//像素单位画点
private void drawPoint(Canvas canvas,Paint paint,float x,float y){
canvas.drawPoint(x+Ox,Oy-y,paint);
}
//自定义单位画点,halfWidth与halfHeight把画布的半宽与半高自定义化。如drawGrid(canvas,paint,0.5f,0.0f,1f,1f)将在X轴的右半部分的一半处画一个点
private void drawPoint(Canvas canvas,Paint paint,float x,float y,float halfWidth,float halfHeight){
drawPoint(canvas,paint,W/2f/halfWidth*x,H/2f/halfHeight*y);
}
}
这是调试时的手机屏幕截图:
package com.viziner.minecoal.ui.activitys;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;
import java.util.Timer;import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.TimeSeries;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.androidannotations.annotations.ViewById;
import org.androidannotations.annotations.WindowFeature;import android.content.Intent;
import android.graphics.Color;
import android.util.Log;
import android.view.Window;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;import com.viziner.minecoal.R;
import com.viziner.minecoal.listener.TitleClickListener;
import com.viziner.minecoal.rest.Tools;
import com.viziner.minecoal.ui.viewgroup.TitleView;
import com.viziner.minecoal.ui.views.MyChartView;@EActivity(R.layout.qu_xian_3)
@WindowFeature(value = { Window.FEATURE_NO_TITLE,
Window.FEATURE_INDETERMINATE_PROGRESS })
public class QuXian_3_Activity extends BaseActivity implements
TitleClickListener { @ViewById
TitleView title; private GraphicalView chart;
@Extra
String[] time, data;
Double[] datas; /** 曲线数量 */
private static final int SERIES_NR = 1;
private TimeSeries series1;
private XYMultipleSeriesDataset dataset1; /** 时间数据 */
Date[] xcache = new Date[20];
/** 数据 */
int[] ycache = new int[20];
double max, min; @Override
public void backClick() {
finish();
} @Override
public void otherClick() {
if (!networkStatusOK(this)) {
showTextToast("网络未连接!");
return;
}
startActivityForResult(new Intent(this, QuXianSheZhiActivity_.class),
200);
} @AfterViews
void afterview() {
title.setTitle("数据曲线");
title.titleType(TitleView.TYPE.BOTH_BTN);
title.setButton2Src(R.drawable.set_bg);
title.setListener(this);
LinearLayout layout = (LinearLayout)findViewById(R.id.linearlayout);
datas = new Double[data.length];
for (int i = 0; i < data.length; i++){
datas[i] = Double.valueOf(data[i]);
}
max = datas[0];
for (int i = 0; i < datas.length; i++){
if (datas[i] > max){
max = datas[i];
}
}
min = datas[0];
for (int i = 0; i < datas.length; i++){
if (datas[i] < min){
min = datas[i];
}
}
chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(), getDemoRenderer(max, min), "HH:mm");
layout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT, 900)); }
private XYMultipleSeriesRenderer getDemoRenderer(double maxX, double minX) {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); renderer.setChartTitleTextSize(20);
renderer.setAxisTitleTextSize(16);
renderer.setAxesColor(Color.YELLOW);
renderer.setLabelsTextSize(35); //数轴刻度字体大小
renderer.setLabelsColor(Color.BLACK);
renderer.setLegendTextSize(15); //曲线说明
renderer.setXLabelsColor(Color.WHITE);
renderer.setYLabelsColor(0,Color.WHITE);
renderer.setShowLegend(false);
renderer.setMargins(new int[] {20, 30, 100, 0});
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(Color.GREEN);
r.setChartValuesTextSize(15);
r.setChartValuesSpacing(3);
r.setPointStyle(PointStyle.CIRCLE);
r.setFillBelowLine(true);
r.setFillBelowLineColor(0xffffff);
r.setFillPoints(true);
renderer.addSeriesRenderer(r);
renderer.setMarginsColor(0xffffff);
renderer.setShowGrid(true);
renderer.setYAxisMax(maxX * 1.1);
renderer.setYAxisMin(minX * 1.1);
renderer.setXLabels(6);
renderer.setInScroll(true); //调整大小
renderer.setPanEnabled(true, true);
return renderer;
}
/**
* 数据对象
* @return
*/
private XYMultipleSeriesDataset getDateDemoDataset() {
dataset1 = new XYMultipleSeriesDataset();
final int nr = 60;
// long value = new Date().getTime();
// Random r = new Random();
Calendar c = Calendar.getInstance();
for (int i = 0; i < SERIES_NR; i++) {
series1 = new TimeSeries("Demo" + (i + 1));
// for (int k = 0; k < nr; k++) {
// series1.add(new Date(value - 60000 * 60 +k*1000*60), 20 +r.nextInt() % 10);
for (int k = 0; k < time.length; k++) {
try {
c.setTime(new SimpleDateFormat("yyyyMMddHHmmss").parse(time[k]));
} catch (ParseException e) {
e.printStackTrace();
Log.e("err", e.getMessage());
}
series1.add(new Date(c.getTimeInMillis()+33000), datas[k]);
}
dataset1.addSeries(series1);
}
return dataset1;
}
}
import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.TimeSeries;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;public class RtChartsActivity extends Activity {
private Timer timer = new Timer();
private GraphicalView chart;
private TextView textview;
private TimerTask task;
private int addY = -1;
private long addX;
/**«˙œfl ˝¡ø*/
private static final int SERIES_NR=1;
private static final String TAG = "message";
private TimeSeries series1;
private XYMultipleSeriesDataset dataset1;
private Handler handler;
private Random random=new Random();
/** ±º‰ ˝æ›*/
Date[] xcache = new Date[20];
/** ˝æ›*/
int[] ycache = new int[20]; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rtchart);
LinearLayout layout = (LinearLayout)findViewById(R.id.linearlayout);
//…˙≥…Õº±Ì
chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(), getDemoRenderer(), "hh:mm:ss");
layout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT,380));
//Œ™TextViewÃ̺” ¬º˛
textview = (TextView)findViewById(R.id.myview);
textview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(RtChartsActivity.this, "ceshiview", 1).show();
Intent intent = new Intent();
intent.setClass(RtChartsActivity.this, MainActivity.class);
startActivity(intent);
}
});
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//À¢–¬Õº±Ì
updateChart();
super.handleMessage(msg);
}
};
task = new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what = 200;
handler.sendMessage(message);
}
};
timer.schedule(task, 2*1000,1000);
}
private void updateChart() {
//…Ë∂®≥§∂»Œ™20
int length = series1.getItemCount();
if(length>=20) length = 20;
addY=random.nextInt()%10;
addX=new Date().getTime();
//Ω´«∞√ʵƒµ„∑≈»Îª∫¥Ê
for (int i = 0; i < length; i++) {
xcache[i] = new Date((long)series1.getX(i));
ycache[i] = (int) series1.getY(i);
}
series1.clear();
//Ω´–¬≤˙…˙µƒµ„ ◊œ»º”»ÎµΩµ„ºØ÷–£¨»ª∫Û‘⁄—≠ª∑ÃÂ÷–Ω´◊¯±Í±‰ªª∫Ûµƒ“ªœµ¡–µ„∂º÷ÿ–¬º”»ÎµΩµ„ºØ÷–
//’‚¿Ôø…“‘ ‘—È“ªœ¬∞—À≥–Úµflµππ˝¿¥ « ≤√¥–ßπ˚£¨º¥œ»‘À––—≠ª∑㨑ŸÃ̺”–¬≤˙…˙µƒµ„
series1.add(new Date(addX), addY);
for (int k = 0; k < length; k++) {
series1.add(xcache[k], ycache[k]);
}
//‘⁄ ˝æ›ºØ÷–Ã̺”–¬µƒµ„ºØ
dataset1.removeSeries(series1);
dataset1.addSeries(series1);
//«˙œfl∏¸–¬
chart.invalidate();
}
/**
* …Ë∂®»Á±Ì—˘ Ω
* @return
*/
private XYMultipleSeriesRenderer getDemoRenderer() {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
renderer.setChartTitle(" µ ±«˙œfl");//±ÍÂ
renderer.setChartTitleTextSize(20);
renderer.setXTitle(" ±º‰"); //x÷·Àµ√˜
renderer.setAxisTitleTextSize(16);
renderer.setAxesColor(Color.BLACK);
renderer.setLabelsTextSize(15); // ˝÷·øÃ∂»◊÷ÃÂ¥Û–°
renderer.setLabelsColor(Color.BLACK);
renderer.setLegendTextSize(15); //«˙œflÀµ√˜
renderer.setXLabelsColor(Color.BLACK);
renderer.setYLabelsColor(0,Color.BLACK);
renderer.setShowLegend(false);
renderer.setMargins(new int[] {20, 30, 100, 0});
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(Color.BLUE);
r.setChartValuesTextSize(15);
r.setChartValuesSpacing(3);
r.setPointStyle(PointStyle.CIRCLE);
r.setFillBelowLine(true);
r.setFillBelowLineColor(Color.WHITE);
r.setFillPoints(true);
renderer.addSeriesRenderer(r);
renderer.setMarginsColor(Color.WHITE);
renderer.setPanEnabled(false,false);
renderer.setShowGrid(true);
renderer.setYAxisMax(50);
renderer.setYAxisMin(-30);
renderer.setInScroll(true); //µ˜’˚¥Û–°
return renderer;
}
/**
* ˝æ›∂‘œÛ
* @return
*/
private XYMultipleSeriesDataset getDateDemoDataset() {
dataset1 = new XYMultipleSeriesDataset();
final int nr = 10;
long value = new Date().getTime();
Random r = new Random();
for (int i = 0; i < SERIES_NR; i++) {
series1 = new TimeSeries("Demo series " + (i + 1));
for (int k = 0; k < nr; k++) {
series1.add(new Date(value+k*1000), 20 +r.nextInt() % 10);
}
dataset1.addSeries(series1);
}
Log.i(TAG, dataset1.toString());
return dataset1;
}
@Override
public void onDestroy() {
//µ±Ω· ¯≥Ã–Ú ±πÿµÙTimer
timer.cancel();
super.onDestroy();
};
}