- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人可以帮我编辑为触摸缩放示例制作 androidplot 的人提供的代码吗?我打算使用它,但我注意到每次放大绘图时我都无法缩小到原始大小。
最佳答案
我修复了 androidplot touchzoom 示例,它现在可以按预期滚动和缩放,而不会丢失边界的大小这是 mainActivity.java 的代码
package com.tutorialz.paul.scaleplotdesign;
import java.util.ArrayList;
import java.util.Random;
import android.app.Activity;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.Toast;
import com.androidplot.Plot;
import com.androidplot.ui.SizeLayoutType;
import com.androidplot.ui.SizeMetrics;
import com.androidplot.xy.BoundaryMode;
import com.androidplot.xy.LineAndPointFormatter;
import com.androidplot.xy.PointLabelFormatter;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYPlot;
public class MainActivity extends Activity implements OnTouchListener {
private static final int SERIES_SIZE = 200;
private XYPlot plotOne, plotTwo;
private SimpleXYSeries series1 = null;
private SimpleXYSeries series2 = null;
private PointF minXY;
private PointF maxXY;
float zoomRatio = 2, leftBoundary, rightBoundary;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//plot setup
plotOne = (XYPlot) findViewById(R.id.myFirstXYPlot);
plotOne.setOnTouchListener(this);
plotOne.getGraphWidget().setTicksPerRangeLabel(2);
plotOne.getGraphWidget().setTicksPerDomainLabel(2);
plotOne.getGraphWidget().setRangeLabelWidth(25);
plotOne.setRangeLabel("");
plotOne.setDomainLabel("");
plotOne.setBorderStyle(Plot.BorderStyle.NONE, null, null);
plotOne.getLayoutManager().remove(plotOne.getLegendWidget());
plotOne.getGraphWidget().setSize(new SizeMetrics(0,SizeLayoutType.FILL,
0, SizeLayoutType.FILL));
plotOne.setPlotMargins(0,0,0,0);
plotTwo = (XYPlot) findViewById(R.id.mySecondXYPlot);
plotTwo.setOnTouchListener(this);
plotTwo.getGraphWidget().setTicksPerRangeLabel(2);
plotTwo.getGraphWidget().setTicksPerDomainLabel(2);
plotTwo.getGraphWidget().setRangeLabelWidth(25);
plotTwo.setRangeLabel("");
plotTwo.setDomainLabel("");
plotTwo.setBorderStyle(Plot.BorderStyle.NONE, null, null);
plotTwo.getLayoutManager().remove(plotTwo.getLegendWidget());
plotTwo.getGraphWidget().setSize(new SizeMetrics(0,SizeLayoutType.FILL,
0, SizeLayoutType.FILL));
plotTwo.setPlotMargins(0,0,0,0);
//********
//series setup
series1 = new SimpleXYSeries("PARAM");
populateSeries(series1, 25);
//series1.setModel(values1, SimpleXYSeries.ArrayFormat.Y_VALS_ONLY);
series1.useImplicitXVals();
LineAndPointFormatter line1 = new LineAndPointFormatter();
line1.setPointLabelFormatter(new PointLabelFormatter());
line1.configure(getApplicationContext(), R.xml.f1);
series2 = new SimpleXYSeries("PARAM");
populateSeries(series2, 15);
//series2.setModel(values1, SimpleXYSeries.ArrayFormat.Y_VALS_ONLY);
series2.useImplicitXVals();
LineAndPointFormatter line2 = new LineAndPointFormatter();
line2.setPointLabelFormatter(new PointLabelFormatter());
line2.configure(getApplicationContext(), R.xml.f2);
plotOne.addSeries(series1, line1);
plotTwo.addSeries(series2, line2);
plotOne.redraw();
plotTwo.redraw();
plotOne.calculateMinMaxVals();
minXY = new PointF(plotOne.getCalculatedMinX().floatValue(),
plotOne.getCalculatedMinY().floatValue());
maxXY = new PointF(plotOne.getCalculatedMaxX().floatValue(),
plotOne.getCalculatedMaxY().floatValue());
leftBoundary = series1.getX(0).floatValue();
rightBoundary = series1.getX(series1.size() - 1).floatValue();
}
private void populateSeries(SimpleXYSeries series, int max) {
Random r = new Random();
for(int i = 0; i < SERIES_SIZE; i++) {
series.addLast(i, r.nextInt(max));
}
}
//*****************
// Definition of the touch states
static final int NONE = 0;
static final int ONE_FINGER_DRAG = 1;
static final int TWO_FINGERS_DRAG = 2;
int mode = NONE;
PointF firstFinger;
float distBetweenFingers;
boolean stopThread = false;
@Override
public boolean onTouch(View arg0, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: // Start gesture
firstFinger = new PointF(event.getX(), event.getY());
mode = ONE_FINGER_DRAG;
stopThread = true;
break;
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_UP:
mode = NONE;
break;
case MotionEvent.ACTION_POINTER_DOWN: // second finger
distBetweenFingers = spacing(event);
// the distance check is done to avoid false alarms
if (distBetweenFingers > 5f) {
mode = TWO_FINGERS_DRAG;
}
break;
case MotionEvent.ACTION_MOVE:
if (mode == ONE_FINGER_DRAG) {
PointF oldFirstFinger = firstFinger;
firstFinger = new PointF(event.getX(), event.getY());
scroll(oldFirstFinger.x - firstFinger.x);
plotOne.setDomainBoundaries(minXY.x, maxXY.x,
BoundaryMode.FIXED);
plotOne.redraw();
plotTwo.setDomainBoundaries(minXY.x, maxXY.x,
BoundaryMode.FIXED);
plotTwo.redraw();
} else if (mode == TWO_FINGERS_DRAG) {
float oldDist = distBetweenFingers;
distBetweenFingers = spacing(event);
zoom(oldDist / distBetweenFingers);
plotOne.setDomainBoundaries(minXY.x, maxXY.x,
BoundaryMode.FIXED);
plotOne.redraw();
plotTwo.setDomainBoundaries(minXY.x, maxXY.x,
BoundaryMode.FIXED);
plotTwo.redraw();
}
break;
}
return true;
}
private void zoom(float scale) {
float domainSpan = maxXY.x - minXY.x;
float oldMax = maxXY.x;
float oldMin = minXY.x;
float domainMidPoint = maxXY.x - (domainSpan / 2.0f);
float offset = domainSpan * scale / 2.0f;
minXY.x = domainMidPoint - offset;
maxXY.x = domainMidPoint + offset;
float newSpan = maxXY.x - minXY.x;
if (newSpan < (float)5) {
minXY.x = oldMin;
maxXY.x = oldMax;
}
if (minXY.x < leftBoundary) {
minXY.x = leftBoundary;
maxXY.x = leftBoundary + domainSpan * zoomRatio;
if (maxXY.x > series1.getX(series1.size() - 1).floatValue())
maxXY.x = rightBoundary;
}
if (maxXY.x > series1.getX(series1.size() - 1).floatValue()) {
maxXY.x = rightBoundary;
minXY.x = rightBoundary - domainSpan * zoomRatio;
if (minXY.x < leftBoundary) minXY.x = leftBoundary;
}
}
private void scroll(float pan) {
float domainSpan = maxXY.x - minXY.x;
float step = domainSpan / plotOne.getWidth();
float offset = pan * step;
minXY.x = minXY.x + offset;
maxXY.x = maxXY.x + offset;
if (minXY.x < leftBoundary) {
minXY.x = leftBoundary;
maxXY.x = leftBoundary + domainSpan;
}
if (maxXY.x > series1.getX(series1.size() - 1).floatValue()) {
maxXY.x = rightBoundary;
minXY.x = rightBoundary - domainSpan;
}
}
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
}
这是 main_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="300dp"
android:orientation="vertical"
android:background="#FF727272"
android:layout_margin="10dp">
<com.androidplot.xy.XYPlot
android:id="@+id/myFirstXYPlot"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
androidPlot.graphWidget.paddingLeft="20dp"
androidPlot.graphWidget.paddingRight="20dp"
androidPlot.graphWidget.backgroundPaint.color="#ff727272"
androidPlot.graphWidget.gridBackgroundPaint.color="#ffe3e3e3"
androidPlot.graphWidget.rangeLabelPaint.textSize="10dp"
androidPlot.graphWidget.domainLabelPaint.textSize="10dp"
androidplot.renderMode="use_background_thread"
/>
<com.androidplot.xy.XYPlot
android:id="@+id/mySecondXYPlot"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
androidPlot.graphWidget.backgroundPaint.color="#ff727272"
androidPlot.graphWidget.gridBackgroundPaint.color="#ffe3e3e3"
androidPlot.graphWidget.paddingLeft="20dp"
androidPlot.graphWidget.paddingRight="20dp"
androidPlot.graphWidget.rangeLabelPaint.textSize="10dp"
androidPlot.graphWidget.domainLabelPaint.textSize="10dp"
androidplot.renderMode="use_background_thread"
/>
</LinearLayout>
</LinearLayout>
关于java - androidplot缩放示例错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26964024/
我正在开发一个应用程序,为此我使用了 androidplot 库。我的要求是绘制曲线图 - 与显示的非常相似 here 我可以很好地绘制平滑图形,但我想删除与图形一起显示的 X 轴和 Y 轴。我只需要
AndroidPlot 是一个很棒的库。我关注了http://androidplot.com/docs/how-to-pan-zoom-and-scale/制作可滚动图表,但发现在图表滚动时域网格线是
我需要在折线图中隐藏域值。有人可以帮助我吗? plot0.setDomainBoundaries(0, windowsize, BoundaryMode.FIXED); plot0.a
我正在使用 Androidplot 创建我的图表。 我想用 oneChart.setDomainStep(XYStepMode.INCREMENT_BY_VAL, 1); 命令,但每次我运行我的应用程
我正在使用 AndroidPlot 创建一个简单的条形图应用程序,它可以实时显示一些值。我刚开始使用它,所以请耐心等待。有一个教程,它提供了一些基本信息,然后有 JavaDocs 似乎提供了一切,包括
我在 AndroidPlot 中定位和对齐域值时遇到问题。我附上了到目前为止所拥有内容的屏幕截图。 问题 1(定位): 由于我将 Unix 时间戳格式化为 MMM-yy 并将域标签方向设置为 -90
作品中有虚线、虚线等线型吗? 我知道您可以通过将 vertexColor 设置为 null 来添加/删除点,就像在这个示例中一样: LineAndPointFormatter blueFormat =
我正在使用 AndroidPlot 库并尝试更改域和范围标签的颜色。 我是这样设置的: //Setting the names of the axis XYPlot.setRangeLabel("#
我在单个图中有大约 12 个域标签。它们相互重叠。我无法改变他们的方向。请提出适用于 Android v2.2 及更高版本的解决方案。 最佳答案 试试这个方法, plot.getGraphWidget
我想知道如何使用 AndroidPlot 更改网格间距.我的网格目前有 9 行域和 9 行范围,我不知道这是从哪里来的。 此外,如果您碰巧知道如何使图形线条粗一点,我们将不胜感激。 最后两点应该得到修
我实际上使用 AndroidPlot 库在我的 android 项目中使用一个简单的图表,但我不知道如何更改域区域的值。 更具体地说,这一行: mySimpleXYPlot.setDomainValu
我是那个图书馆的新手。我正在尝试创建以下情节: 同时我有下一个: 我的问题:注意:颜色不重要 如何去掉黑色区域(范围域和标题上的标签在哪里)并将情节居中(如第一张图片所示) 如何添加第一张图片中的范围
小问题: 如何将 Androidplot 的 X 轴设置为日历(日期和时间)元素? for(int i=1; i
我正在将实时数据添加到 XY 图。如何删除图形的点/标记或使它们不可见?我在 java 文档中找不到相应的方法。 mSimpleXYPlot.getGraphWidget().setDrawMarke
我正在尝试对图表中的 x 标签执行以下操作。 第一个标签应该有格式: plot.getGraphWidget() .setDomainValueFormat(new SimpleDat
我关注了Quickstart tutorial并使用 new LineAndPointFormatter(Color.BLACK, Color.RED, Color.TRANSPARENT) 来绘制我
我正在使用 AndroidPlot 编写一个应用程序,其中用户需要能够触摸散点图上的一个点并显示有关该特定点的信息。换句话说,应用程序需要识别距触摸位置最近的点或以其他方式识别已触摸的点,并能够返回该
我正在尝试在图表上设置范围标签的格式,以便它们位于绘图区域内以最大化我的空间。 我遇到的问题是我不知道如何垂直定位范围标签,从而使标签被剪切: 为了获得图表,我使用以下命令: plot.setRang
我正在使用 androidplot 每分钟循环显示脉冲(本质上是相对较短的点序列)n 次,其余时间显示平坦值。开始处有一个删除栏,可删除 50 个最旧的点。但我不知道如何以特定的时间间隔(run()
我在尝试将方向传感器示例中的级别图旋转 90 度以使条形图指向(或远离)历史图时遇到困难。 我已在 xml 文件 中尝试了 android:orientation="",但没有得到积极的结果。 这似乎
我是一名优秀的程序员,十分优秀!