如何获得此UI结果?

时间:2019-06-24 22:50:22

标签: android ios user-interface flutter user-experience

我试图从这个家伙(https://dribbble.com/shots/3812962-iPhone-X-Todo-Concept)重新创建一个设计概念,但是我在ListView对齐方面遇到了一些麻烦,所以我想。 我想做的就是在滑动时向右移动列表,而不会剪切卡的边缘。

我已经尝试过边距和填充,但是没有应用到容器上会产生我想要的结果。滑动时边缘会被切除。

我离开这里的是带有ListView的容器。

实际应用的屏幕截图: https://imgur.com/a/hJ96sEv

           Container(
              height: 350.0,
              child: ListView.builder(
                physics: NeverScrollableScrollPhysics(),
                itemCount: 3,
                controller: scrollController,
                scrollDirection: Axis.horizontal,
                itemBuilder: (context, position) {
                  return GestureDetector(
                      child: Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Card(
                          child: Container(
                            width: 250.0,
                            child: Column(
                              crossAxisAlignment: CrossAxisAlignment.start,
                              mainAxisAlignment:
                                  MainAxisAlignment.spaceBetween,
                              children: <Widget>[
                                Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  child: Row(
                                    mainAxisAlignment:
                                        MainAxisAlignment.spaceBetween,
                                    children: <Widget>[
                                      Icon(
                                        cardsList[position].icon,
                                        color: appColors[position],
                                      ),
                                      Icon(
                                        Icons.more_vert,
                                        color: Colors.grey,
                                      )
                                    ],
                                  ),
                                ),
                                Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  child: Column(
                                    crossAxisAlignment:
                                        CrossAxisAlignment.start,
                                    children: <Widget>[
                                      Padding(
                                        padding: const EdgeInsets.symmetric(
                                            horizontal: 8.0, vertical: 4.0),
                                        child: Text(
                                          "${cardsList[position].tasksRemaining} Tasks",
                                          style:
                                              TextStyle(color: Colors.grey),
                                        ),
                                      ),
                                      Padding(
                                          padding:
                                              const EdgeInsets.symmetric(
                                                  horizontal: 8.0,
                                                  vertical: 4.0),
                                          child: Text(
                                            "${cardsList[position].cardTitle}",
                                            style:
                                                TextStyle(fontSize: 28.0),
                                          )),
                                      Padding(
                                        padding: const EdgeInsets.all(8.0),
                                        child: LinearProgressIndicator(
                                          value: cardsList[position]
                                              .taskCompletion,
                                        ),
                                      )
                                    ],
                                  ),
                                ),
                              ],
                            ),
                          ),
                          shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(10.0)),
                        ),
                      ),
                      onHorizontalDragEnd: (details) {
                        animationController = AnimationController(
                            vsync: this,
                            duration: Duration(milliseconds: 450));
                        curvedAnimation = CurvedAnimation(
                            parent: animationController,
                            curve: Curves.fastOutSlowIn);
                        animationController.addListener(() {
                          setState(() {
                            currentColor =
                                colorTween.evaluate(curvedAnimation);
                          });
                        });

                        if (details.velocity.pixelsPerSecond.dx > 0) {
                          if (cardIndex > 0) {
                            cardIndex--;
                            colorTween = ColorTween(
                                begin: currentColor,
                                end: appColors[cardIndex]);
                          }
                        } else {
                          if (cardIndex < 2) {
                            cardIndex++;
                            colorTween = ColorTween(
                                begin: currentColor,
                                end: appColors[cardIndex]);
                          }
                        }
                        setState(() {
                          scrollController.animateTo((cardIndex) * 256.0,
                              duration: Duration(milliseconds: 450),
                              curve: Curves.fastOutSlowIn);
                        });

                        colorTween.animate(curvedAnimation);

                        animationController.forward();
                      });
                },
              ),
            ),

我要执行的操作是将列表向右移动,而在滑动时不会切割卡的边缘。

1 个答案:

答案 0 :(得分:0)

要实现该目标,您需要一个PageView而不是ListView,这样,您可以在到达特定位置时滑动并“捕捉”视图:

PageView.builder(
  itemCount: tasks.length,
  controller: PageController(initialPage: 0, viewportFraction: 0.8),
  itemBuilder: (context, index) {
     return Padding(
         padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 10),
         child: Container(
            decoration: BoxDecoration(
               boxShadow: [
                  BoxShadow(
                     color: Color(0x40000000),
                     blurRadius: 10,
                     offset: Offset(0, 12),
                  ),
               ],
            ),
            child: Card(
              shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10),
              ),
              color: Colors.white,
              child: Padding(
                 padding: const EdgeInsets.all(15),
                 child: Column(
                    children: <Widget>[
                       IntrinsicHeight(
                          child: Row(
                             crossAxisAlignment: CrossAxisAlignment.start,
                             children: <Widget>[
                                Icon(tasks[index].icon),
                                Expanded(
                                    child: Container(
                                       child: Align(
                                          alignment: Alignment.topRight,
                                          child: Icon(Icons.menu),
                                            ),
                                          ),
                                        ),
                                      ],
                                    ),
                                ),
                                Expanded(
                                  child: Container(
                                    width: double.infinity,
                                    child: Column(
                                      crossAxisAlignment: CrossAxisAlignment.start,
                                      mainAxisAlignment: MainAxisAlignment.end,
                                      children: <Widget>[
                                        Text(
                                          "${tasks[index].tasks} tasks",
                                          style: TextStyle(
                                             color: Color(0xD0000000),
                                             fontSize: 15,
                                            ),
                                        ),
                                        SizedBox(height: 10),
                                        Text(
                                          "${tasks[index].title}",
                                          style: TextStyle(
                                            color: Color(0xD0000000),
                                            fontSize: 24,
                                          ),
                                        ),
                                        SizedBox(height: 10),
                                        LinearProgressIndicator(
                                          value: tasks[index].percentage,
                                          backgroundColor: Color(0x300000FF),
                                        )
                                      ],
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ),
                      ),
                    ),
                  );
                },
              )

此实现的结果是这样的:

PageView

如果要更改卡的偏移量,则需要将值viewportFraction: 0.8修改为所需的任何值。 1.0是没有偏移的值。

您可以在此Gist Github

中找到我的完整实现