经过几个小时的尝试后,我正在寻找一些关于如何向MPAndroid添加快照滚动机制的提示。基本上我希望5个可见条对齐,这样它们就完全可见并居中。我现在导入了库源代码,因为看起来没有其他方法可以更改computeScroll(BarLineChartTouchListener)中的代码。
编辑: 澄清 - 我正在显示大约20个条形图但是图表被缩放以便用户可以水平滚动。困扰我的是它没有自动对齐,因此第一个可见的条形可能会被剪掉一半。我正在寻找捕捉效果,它会将位置四舍五入到最接近的条形宽度,留下5个完全可见的条形。
答案 0 :(得分:2)
我最终在BarLineChartBase.java中添加了以下函数。我知道它远非优雅,但似乎做得很好。它仅限于targetApi> 11,因为ValueAnimator。对于较低的API(我不能满足),您可能需要查看nineoldandroids或其他一些动画循环技术。
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void alignX() {
int count = this.getValueCount();
int xIndex = this.getLowestVisibleXIndex() + Math.round( (this.getHighestVisibleXIndex() - this.getLowestVisibleXIndex()) / 2.0f );
float xsInView = this.getXAxis().getValues().size() / this.getViewPortHandler().getScaleX();
Transformer mTrans = this.getTransformer(YAxis.AxisDependency.LEFT);
float[] pts = new float[] { xIndex - xsInView / 2f, 0 };
mTrans.pointValuesToPixel(pts);
final Matrix save = new Matrix();
save.set(this.getViewPortHandler().getMatrixTouch());
final float x = pts[0] - this.getViewPortHandler().offsetLeft();
final int frames = 20;
ValueAnimator valueAnimator = new ValueAnimator().ofInt(0, frames);
valueAnimator.setDuration(500);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
int prev = -1;
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if( (int) animation.getAnimatedValue() > prev ) {
save.postTranslate( -x / (float)frames, 0);
BarLineChartBase.this.getViewPortHandler().refresh(save, BarLineChartBase.this, true);
}
prev = (int) animation.getAnimatedValue();
}
});
valueAnimator.start();
}
我在computeScroll
的{{1}}函数末尾触发它。
我保留了变量的名称,因为我从BarLineChartTouchListener
,MoveViewJob
等函数中复制了代码。由于它只在x轴上对齐 - 我删除了Y轴计算并改为使用了零。欢迎任何优化,特别是来自作者@PhilippJahoda。