使用自定义视图构建时间轴

时间:2013-03-30 18:10:10

标签: android android-layout

我正在构建一个带有定时事件的Android应用程序,我不确定应该用什么布局来构建我的时间轴。

事件可以有不同的高度,并且可以在用户点击它们时增长,但它们具有相同的宽度;

              .
              .
              .
------------- |
| Event 4   > | --------------
------------- | < Event 7    |
              | |            |
              | --------------
              .
              .
              .

我有两种视图类型:

  • EventView女巫持有事件信息并投下他的大纲
  • TimeBarView女巫是中间的酒吧(有一些财产,并且在很长的时间内延长)

我如何放置我的物品,以便尊重我的时间线上的时间(例如1周可能是10px)

感谢任何帮助。 谢谢!

2 个答案:

答案 0 :(得分:1)

我现在正在处理同样的问题。

我还没有完整的解决方案,但我有一个想法:

由于您必须支持时间轴,ListView不合适,因为事件可能会重叠。

相反,请考虑使用2列GridView。我建议使用支持不同商品尺寸的AndroidStaggeredGrid

对于在中间运行的实际“时间条”,我只需使用一条窄线作为GridView的背景。

时间轴上没有标记。相反,标记将位于EventView本身,无论是在左侧还是右侧,这样标记就会完全落在时间栏上。

这样,当您滚动网格时,它会给出时间栏本身正在滚动的错觉。

要表示空的时间间隔,只需添加一个空的视图,其高度与其所代表的间隔成比例。

希望它有所帮助...

答案 1 :(得分:0)

我不确定你的帖子中有足够的信息来确定布局过程中发生了什么,但RelativeLayout可能会做你需要的。你可以使用leftMargin作为绝对位置,也可以使用像RelativeLayout.LEFT_OF这样的“规则”

也就是说,使用Android框架创建自定义布局非常容易。只需覆盖onMeasure和onLayout。 onMeasure应该报告容器的大小(通常,与父容器一样大),并且非常简单。

onLayout通常如下所示:

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    int count = getChildCount();
    for (int i = 0; i < count; i++) {
        View child = getChildAt(i);
        if (child.getVisibility() != GONE) {
            // do the layout for each child here, with child.layout
            // e.g., child.layout(0, 0, r, b);
    }
}

View.layout需要4个参数 - 顶部,左侧,底部和右侧 - 非常简单。您可以在l,t,r和b中访问容器的尺寸。

HTH