开发者社区 问答 正文

在Horizo​​ntalScrollView和BarChart滚动之间切换

我有一个放置在Horizo​​ntalScrollView内的MPAndroidChart BarChart。现在,图表视图中有多个条形,并且图表宽度根据我的要求是固定的。由于图表的默认滚动行为,我可以看到所有的条形图。

唯一的问题是滚动行为不流畅,并且滞后很多。

我的想法是,一旦我开始滚动图表,便禁用Horizo​​ntalScrollView,并在触摸图表外部时将其启用。有人可以告诉我我该怎么做吗?我希望我的问题很清楚,并且不需要为此共享任何XML。提前致谢。

展开
收起
垚tutu 2019-11-28 18:45:44 673 分享 版权
阿里云 AI 助理回答

要实现您描述的滚动行为,您需要在Android中结合使用自定义触摸监听器和Horizo​​ntalScrollView与MPAndroidChart库。以下是一个简化的步骤说明,帮助您实现在触摸图表时禁用Horizo​​ntalScrollView滚动,并在触摸图表外部区域时重新启用滚动的功能:

  1. 创建自定义BarChart类:为了更好地控制触摸事件,您可以继承BarChart类并覆盖其触摸相关的方法。

  2. 处理触摸事件:重写onTouchEvent(MotionEvent event)方法来判断触摸位置是否在图表区域内。如果触摸点位于图表上,则消费该事件以阻止滚动;否则,将事件传递给父视图(即Horizo​​ntalScrollView)以便滚动。

public class CustomBarChart extends BarChart {

    private boolean isScrollEnabled = true;

    public CustomBarChart(Context context) {
        super(context);
        init();
    }

    public CustomBarChart(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomBarChart(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        // 初始化设置,例如图表样式等
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN && isInsideChart(event.getX(), event.getY())) {
            // 触摸点在图表内部,禁用滚动
            getParent().requestDisallowInterceptTouchEvent(true);
        } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
            // 触摸结束或取消,重新启用滚动
            getParent().requestDisallowInterceptTouchEvent(false);
        }
        return super.onTouchEvent(event);
    }

    private boolean isInsideChart(float x, float y) {
        // 根据您的图表布局计算是否在图表内部
        // 这里只是一个示例逻辑,您需要根据实际图表尺寸调整
        RectF chartArea = new RectF(getLeft(), getTop(), getRight(), getBottom());
        return chartArea.contains(x, y);
    }
}
  1. XML布局文件中使用自定义BarChart:在您的布局XML文件中,替换原有的com.github.mikephil.charting.charts.BarChart为您的自定义类CustomBarChart

  2. 优化滚动体验:虽然上述代码可以实现基本功能,但为了进一步提升滚动流畅性,您可能还需要考虑对图表进行性能优化,比如减少数据点数量、优化条形图绘制效率等。

请注意,这只是一个基础示例,您可能需要根据具体需求调整代码。此外,确保在集成前熟悉MPAndroidChart库的文档和API,以及Android触摸事件处理机制。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: