在本文中,我们将带你了解我的AndroidAChartEngine已经可以使用,但如何让它看起来不错?在这篇文章中,我们将为您详细介绍我的AndroidAChartEngine已经可以使用,但如何让它
在本文中,我们将带你了解我的Android AChartEngine已经可以使用,但如何让它看起来不错?在这篇文章中,我们将为您详细介绍我的Android AChartEngine已经可以使用,但如何让它看起来不错?的方方面面,并解答android acodec常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的AChartEngine和Android Studio、AChartEngine实现Android实时时间变化曲线、AchartEngine折线图Xaxis Android、Android AChartEngine – 无法更改Y轴标签的textColor。
本文目录一览:- 我的Android AChartEngine已经可以使用,但如何让它看起来不错?(android acodec)
- AChartEngine和Android Studio
- AChartEngine实现Android实时时间变化曲线
- AchartEngine折线图Xaxis Android
- Android AChartEngine – 无法更改Y轴标签的textColor
我的Android AChartEngine已经可以使用,但如何让它看起来不错?(android acodec)
我有一个主要针对平板电脑的Android应用,它将在TimeCharts中显示一些不同的实时数据.所以我已经有了一个服务来与数据源进行通信,数据源抓取数据,解析它并将值添加到单例TimeSeries.当用户导入和导出片段时,片段只需添加正确的TimeSeries并继续调用mChartView.repaint();每500ms
所有这些都是可操作的,可以在标签,旋转,通知等方面很好地工作.
因为它是一款平板电脑应用,我想实现两件事:1)最大化观看区域; 2)让它看起来不错.
1)我已经删除了缩放按钮(出于某种原因,如果我尝试添加它们,它给我NullException)和mRenderer.setZoomButtonsVisible(false);但是仍有巨大的底部空间需要大量的屏幕空间.我尝试设置一个负边框,它可以工作,但标签不会随着这个边框移动而我最终会让X轴越过标签甚至传递它们.
如何使用边框向下移动标签,或者将它们放在图形的顶部?
2)
a)该应用程序是用户可配置为使用Holo_Dark或Holo_light.所以我在渲染器上使用透明背景(请参阅下面的代码段)来显示holo所做的漂亮背景阴影.如何更改轴文本颜色?我找到了mRenderer.setAxesColor(颜色),但它只更改了行,而不是文本.
int color = Color.argb(0,255,255); // Transparent colour mRenderer.setBackgroundColor(color); mRenderer.setMarginsColor(color);
b)Y轴在其标签的顶部交叉,我如何将它们向左偏移一点,以便文本可读? (它不是用setMargins())
c)当用户在图表周围进行缩放和平移时,图表会停止更新/重新缩放屏幕上的最新值,并且用户必须保持平移以查看最新值.我在ActionBar上添加了一个“重置缩放”按钮,但我无法使其工作.什么是使值再次更新的代码.
d)如果我的TimeSeires的范围是10分钟(每秒2个值),我怎么能让它只显示最后1分钟(例如),如果用户想要以前的值,他可以反击? (以及c上的使用按钮)重新开始)
目前我的渲染设置为:
int color = Color.argb(0,255); // Transparent colour mRenderer.setBackgroundColor(color); mRenderer.setMarginsColor(color); mRenderer.setAxisTitleTextSize(16); // 16 mRenderer.setChartTitleTextSize(20); // 20 mRenderer.setLabelsTextSize(15); // 15 mRenderer.setLegendTextSize(15); // 15 mRenderer.setPointSize(0); // 10 mRenderer.setMargins(new int[] { 20,30,15,0 }); mRenderer.setZoomButtonsVisible(false); mRenderer.setShowAxes(true); mRenderer.setShowLegend(true); mRenderer.setShowGridX(true); mRenderer.setShowLabels(true);
每个渲染添加到Multiple渲染器的内容如下:
renderer.setdisplayChartValues(false); mRenderer.addSeriesRenderer(renderer);
非常感谢所有的帮助!
编辑只是为了包含我的最终代码供其他人查看:
我最终完全放弃了图例,并在图表上方浮动实现了我自己的图例,因此布局是一个带有ChartView和TableLayout的FrameLayout.
我实现了一个由几个类扩展的抽象CurvesFragment类.
我在片段OnCreateView中配置图表为:
mChartView = ChartFactory.getTimeChartView(getActivity().getApplicationContext(),mDataset,mRenderer,"HH:mm:ss"); // X axis in a time scale // Setup chart renderer ============================= mRenderer.setLabelsTextSize(15); // Text size mRenderer.setMargins(new int[] { 0,Utils.convertToPx(5,getActivity().getApplicationContext()),0 }); // 5dp on the left to show that little line mRenderer.setZoomButtonsVisible(false); // bye bye zoom mRenderer.setShowAxes(true); // show both axes mRenderer.setShowLegend(false); // bye bye legend mRenderer.setShowGridX(true); // X grid helps identify values mRenderer.setShowLabels(true); // See the values mRenderer.setYLabelsAlign(Align.LEFT); // put the Y labels on the left of the axis if (Utils.getCurrentTheme(getActivity().getApplicationContext()) == android.R.style.Theme_Holo) { mRenderer.setXLabelsColor(getResources().getColor(android.R.color.primary_text_dark)); mRenderer.setYLabelsColor(0,getResources().getColor(android.R.color.primary_text_dark)); mRenderer.setMarginsColor(getResources().getColor(android.R.color.background_dark)); legend.setBackgroundResource(R.drawable.border_dark); } else { // same as above but for Holo_light } // And from here proceed to add the TimeCharts with using renderer.setdisplayChartValues(false);
在我的操作栏上,我包含了Pause / Resume和ResetZoom的按钮.
重置缩放很简单:
mRenderer.setXAxisMax(-Double.MAX_VALUE); mRenderer.setXAxisMin(Double.MAX_VALUE); mRenderer.setYAxisMax(-Double.MAX_VALUE); mRenderer.setYAxisMin(Double.MAX_VALUE); mChartView.repaint();
有一个后台服务,它包含对TimeSeries的引用,它总是从WiFi读取新数据并将它们添加到系列中.这样,在片段中有一个runnable执行每700ms调用repaint()为:
// Chart rendering control ======================== private Runnable updateDataSet = new Runnable() { public void run() { if (!chartPaused) { double max = mRenderer.getXAxisMax(); // get renderer maximum value double min = mRenderer.getXAxisMin(); // get renderer minimum value // Check if the user scrolled/zoomed/panned the graph or if it's on 'auto' if (!((max == Double.MAX_VALUE || max == -Double.MAX_VALUE) && (min == Double.MAX_VALUE || min == -Double.MAX_VALUE))) { double newMax = mDataset.getSeriesAt(0).getMaxX(); // new max is the latest value from our series double newMin = newMax - Math.abs(max - min); // new min value is the X range the user zoomed into mRenderer.setXAxisMax(newMax); // set the new values mRenderer.setXAxisMin(newMin); } // Logic that updates the TableLayout with the legend is placed here mChartView.repaint(); } getView().postDelayed(updateDataSet,700); } };
并且有一个ZoomListener和一个PanListener,每次用户触摸它时都会暂停图表.这样用户可以缩放和平移,但每当它恢复图表更新时,它只会向前滚动到最早的数据而不改变缩放级别.
我猜最终的结果很稳固,在Holo_Light和Holo_Dark上看起来都不错.
感谢Dan为答案以及创建引擎的所有其他开发人员提供了很多帮助.
快乐的编码!
解决方法
mRenderer.setShowLegend(false);
要么
mRenderer.setMargins(new int[] {top,left,bottom,right});
也许降低底值?
问题2.
一个)
mRenderer.setXLabelsColor(); mRenderer.setYLabelsColor();
b)
mRenderer.setXLabelsAlign();
C)
当系列获得新值时,我认为您可以执行以下操作:
mRenderer.setXAxisMin(); mRenderer.setXAxisMax();
提供x min和x max值作为要显示的范围并调用mChartView.repaint();之后.
d)与c)相同
作为一个建议,请尝试将这些长问题分成几个较小的问题,你可以更快地得到答案.没有多少ACE用户知道如何回答所有问题.即使是这个图书馆的作者也要考虑一些答案:)
AChartEngine和Android Studio
在网上阅读我选择的achartengine似乎拥有我需要的一切.
我下载了jar文件,我插入了libs文件夹,我选择了“添加到库”,我在gradlew中午餐.
在导入org.achartengine.xxxx的源中导致我总是返回无法解析符号的错误.
你有什么建议吗?
谢谢
安德里亚
解决方法
我做了什么:
>在项目范围的build.gradle中添加了以下内容(项目根目录中的一个):
allprojects { repositories { ... maven { url "https://repository-achartengine.forge.cloudbees.com/snapshot/" } } }
>对于使用该库的每个模块,将其添加到其build.gradle(如果它应包含在所有模块中,您可以将它放到顶级build.gradle中):
dependencies { ... compile group: 'org.achartengine',name: 'achartengine',version: '1.2.0' }
现在我可以在项目中使用该库,我在代码中看到类帮助弹出窗口并构建运行成功.
AChartEngine实现Android实时时间变化曲线
话不多说先看效果图
参考https://blog.csdn.net/s_best1987/article/details/8946759#
AChartEngine给我们提供了GraphicalView这个类,可以灵活的在任何位置插入图表,非常的方便。
下面对相关类进行讲解:
GraphicalView:图表控件,是一个基本类,也是一个容器控件,所有的图表都在此控件中呈现;
ChartFactory:工厂类,通过此类来构建不同的图表对象,比如LineChart(折线图)、CubeLineChart(圆滑折线图)、PieChart(饼图)等;
XYMultipleSeriesDataset:数据集容器,在此类中存放多条曲线的数据集合
XYMultipleSeriesRenderer:渲染器容器,此类初始化坐标系,网格,标题等,还用来存放多条曲线的渲染器
XYSeries:数据集,存放曲线的数据
XYSeriesRenderer:渲染器,存放曲线的参数,比如线条颜色,描点大小等
好了 上代码:
LinearLayout layout = (LinearLayout)findViewById(R.id.chart);
//生成图表
chart = ChartFactory.getTimeChartView(this, getDateDemoDataset(), getDemoRenderer(), "MM/dd HH:mm");
layout.addView(chart, new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.FILL_PARENT));
private XYMultipleSeriesDataset getDateDemoDataset() {
dataset1 = new XYMultipleSeriesDataset();
long value = System.currentTimeMillis();
// try {
// value = format1.parse("2020-03-11 00:00:00").getTime();
// } catch (ParseException e) {
// // Todo Auto-generated catch block
// e.printstacktrace();
// }
Date[] dd=new Date[nr];
for (int i = 0; i < nr; i++) {
dd[i]=new Date(value+1000*1800*i);
}
Random r = new Random();
for (int i = 0; i < SERIES_NR; i++) {
series1 = new TimeSeries("Demo series ");
for (int k = 0; k < nr; k++) {
// series1.add(new Date(value+k*1000*24*3600), 20 +r.nextInt() % 10);
series1.add(dd[k], 20 +r.nextInt() % 10);
}
dataset1.addSeries(series1);
}
Log.i(TAG, dataset1.toString());
return dataset1;
}
private XYMultipleSeriesRenderer getDemoRenderer() {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
// renderer.setChartTitle("实时曲线");//标题
// renderer.setChartTitleTextSize(20);
renderer.setAxisTitleTextSize(16);
renderer.setAxesColor(Color.BLACK);
renderer.setLabelsTextSize(15); //数轴刻度字体大小
renderer.setLabelsColor(Color.BLACK);
renderer.setLegendTextSize(15); //曲线说明
renderer.setXLabelsColor(Color.BLACK);
renderer.setYLabelsColor(0,Color.BLACK);
renderer.setShowCustomTextGrid(true); // 设置X轴和Y轴网格是否显示.
renderer.setGridColor(Color.WHITE);// LTGRAY); //网格颜色,灰色
renderer.setMarginsColor(Color.BLUE); // 设置四边颜色
renderer.setBackgroundColor(Color.WHITE); //设置中间背景色
//
renderer.setShowLegend(true);
renderer.setMargins(new int[] {20, 30, 30, 0});
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(Color.RED);
r.setChartValuesTextSize(15);
r.setPointStyle(PointStyle.CIRCLE);
r.setFillBelowLine(true);
// r.setFillBelowLineColor(Color.WHITE);
r.setFillPoints(true);
renderer.addSeriesRenderer(r);
renderer.setPanEnabled(true, true);
renderer.setShowGrid(true);
renderer.setYAxisMax(50);
renderer.setYAxisMin(-20);
return renderer;
}
final int nr = 48;
时间曲线图的横坐标为时间轴,对齐要相应的处理。
文件上传在审核。后续修改源码地址。
AchartEngine折线图Xaxis Android
这是完整的代码:
public class ChartExample extends Activity { private GraphicalView mChartView; XYMultipleSeriesRenderer renderer; @Override protected void onCreate(Bundle savedInstanceState) { // Todo Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.layout_chart); LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout2); String[] titles = new String[] { "spens1","2second" }; List<double[]> x = new ArrayList<double[]>(); x.add(new double[] { 1,2,3,5,7,9,11,12 }); x.add(new double[] { 1,12 }); // } List<double[]> values = new ArrayList<double[]>(); values.add(new double[] { 9,15,19,23,26,25,22,18,13,10 }); values.add(new double[] { 11,21,40,12,24,20,12 }); int[] colors = new int[] { Color.BLUE,Color.RED}; PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE,PointStyle.CIRCLE}; renderer = buildrenderer(colors,styles); int length = renderer.getSeriesRendererCount(); for (int i = 0; i < length; i++) { ((XYSeriesRenderer) renderer.getSeriesRendererAt(i)) .setFillPoints(true); } setChartSettings(renderer,"score CARD VIEW","Attetempts","Marks scored",12.5,45,Color.LTGRAY,Color.LTGRAY); renderer.setXLabels(12); renderer.setYLabels(10); renderer.setShowGrid(false); renderer.setXLabelsAlign(Align.CENTER); renderer.setYLabelsAlign(Align.CENTER); //renderer.setZoomButtonsVisible(true); //renderer.setPanLimits(new double[] { 0,40 }); //renderer.setZoomLimits(new double[] { 0,40 }); renderer.setPanEnabled(false,false); renderer.setZoomEnabled(false,false); renderer.setShowLegend(false); for(int k=0;k<12;k++) { renderer.addXTextLabel(k+1,"test"); } if (mChartView == null) { Log.d("Oncreate ","if (mChartView == null)"); mChartView = ChartFactory.getLineChartView(this,mDataset(titles,x,values),renderer); layout.addView(mChartView,new LayoutParams( LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); } else { mChartView.repaint(); Log.d("Oncreate ","if (mChartView != null)"); } } private void setChartSettings(XYMultipleSeriesRenderer renderer3,String title,String xTitle,String yTitle,double xMin,double xMax,double yMin,double yMax,int axesColor,int labelsColor) { // Todo Auto-generated method stub renderer3.setChartTitle(title); renderer3.setXTitle(xTitle); renderer3.setYTitle(yTitle); renderer3.setXAxisMin(xMin); renderer3.setXAxisMax(xMax); renderer3.setYAxisMin(yMin); renderer3.setYAxisMax(yMax); renderer3.setAxesColor(axesColor); renderer3.setLabelsColor(labelsColor); } private XYMultipleSeriesRenderer buildrenderer(int[] colors,PointStyle[] styles) { // Todo Auto-generated method stub XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); setRenderer(renderer,colors,styles); return renderer; } private void setRenderer(XYMultipleSeriesRenderer renderer2,int[] colors,PointStyle[] styles) { // Todo Auto-generated method stub renderer2.setAxisTitleTextSize(16); renderer2.setChartTitleTextSize(20); renderer2.setLabelsTextSize(15); renderer2.setLegendTextSize(15); renderer2.setPointSize(5f); renderer2.setMargins(new int[] { 20,30,20 }); int length = colors.length; for (int i = 0; i < length; i++) { XYSeriesRenderer r = new XYSeriesRenderer(); r.setColor(colors[i]); r.setPointStyle(styles[i]); renderer2.addSeriesRenderer(r); } } private XYMultipleSeriesDataset mDataset(String[] titles,List<double[]> xValues,List<double[]> yValues) { // Todo Auto-generated method stub XYMultipleSeriesDataset dataset1 = new XYMultipleSeriesDataset(); addXYSeries(dataset1,titles,xValues,yValues,0); return dataset1; } private void addXYSeries(XYMultipleSeriesDataset dataset,String[] titles,List<double[]> yValues,int scale) { // Todo Auto-generated method stub int length = titles.length; for (int i = 0; i < length; i++) { double[] xV = xValues.get(i); XYSeries series = new XYSeries(titles[i],scale); double[] yV = yValues.get(i); int seriesLength = xV.length; for (int k = 0; k < seriesLength; k++) { series.add(xV[k],yV[k]); } dataset.addSeries(series); } } }
能帮到我了吗?
解决方法
renderer.setXLabels(0);
和完整的类代码:
package com.example.lockexample; import java.util.ArrayList; import java.util.List; 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.graphics.Color; import android.graphics.Paint.Align; import android.os.Bundle; import android.util.Log; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; public class ChartExample extends Activity { private GraphicalView mChartView; XYMultipleSeriesRenderer renderer; @Override protected void onCreate(Bundle savedInstanceState) { // Todo Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.layout_chart); LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout2); String[] titles = new String[] { "spens1",Color.LTGRAY); //renderer.setXLabels(12); renderer.setYLabels(10); renderer.setXLabels(0); renderer.setShowGrid(true); renderer.setXLabelsAlign(Align.CENTER); renderer.setYLabelsAlign(Align.RIGHT); renderer.setMargins(new int[] { 25,35,15 }); //renderer.setZoomButtonsVisible(true); //renderer.setPanLimits(new double[] { 0,false); renderer.setMarginsColor(Color.parseColor("#EEEDED")); renderer.setXLabelsColor(Color.BLACK); renderer.setYLabelsColor(0,Color.BLACK); renderer.setApplyBackgroundColor(true); renderer.setBackgroundColor(Color.parseColor("#FBFBFC")); //renderer.setShowLegend(false); for(int k=0;k<12;k++) { renderer.addXTextLabel(k+1,int labelsColor) { // Todo Auto-generated method stub renderer3.setChartTitle(title); renderer3.setXTitle(xTitle); renderer3.setYTitle(yTitle); renderer3.setXAxisMin(xMin); renderer3.setXAxisMax(xMax); renderer3.setYAxisMin(yMin); renderer3.setYAxisMax(yMax); renderer3.setAxesColor(axesColor); renderer3.setLabelsColor(labelsColor); } private XYMultipleSeriesRenderer buildrenderer(int[] colors,PointStyle[] styles) { // Todo Auto-generated method stub renderer2.setAxisTitleTextSize(16); renderer2.setChartTitleTextSize(20); renderer2.setLabelsTextSize(15); renderer2.setLegendTextSize(15); renderer2.setPointSize(5f); //renderer2.setMargins(new int[] { 20,20 }); renderer2.setMargins(new int[] { 25,15 }); int length = colors.length; for (int i = 0; i < length; i++) { XYSeriesRenderer r = new XYSeriesRenderer(); r.setColor(colors[i]); r.setPointStyle(styles[i]); renderer2.addSeriesRenderer(r); } } private XYMultipleSeriesDataset mDataset(String[] titles,yV[k]); } dataset.addSeries(series); } } }
Android AChartEngine – 无法更改Y轴标签的textColor
不幸的是我无法找到Y轴标签的相应方法!
还有办法设置实际折线图的颜色吗?
我还尝试使用标签对齐Y轴左侧的标签
mRenderer.setYAxisAlign(Align.LEFT,0); mRenderer.setYLabelsAlign(Align.LEFT,0);
但它似乎确实有效.
解决方法
使用Align.LEFT时,表示它们左对齐,如果要在轴的左侧右对齐它们,请使用Align.RIGHT.
折线图颜色是来自其自己的渲染器的颜色.
关于我的Android AChartEngine已经可以使用,但如何让它看起来不错?和android acodec的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于AChartEngine和Android Studio、AChartEngine实现Android实时时间变化曲线、AchartEngine折线图Xaxis Android、Android AChartEngine – 无法更改Y轴标签的textColor的相关知识,请在本站寻找。
本文标签: