티스토리 뷰

반응형

Marquee Widget 만들기 (1) - alternate 에서 이어지는 글입니다.

이 글에서는 1번 타입 (계속 한방향으로 흘러가는 Marquee) 을 만들어본 것을 기록합니다. 

 

 

참고로 Marquee는 flutter package가 이미 몇개있는데, 

text 하나만 받을 수 있게 구현되어있더라구요,,

 

저는 이미지 + text로 된 list를 받을 수 있는 위젯으로 만들어보려고 합니다. 

text만 scroll하기 원하신다면 이미 잘되어있는 package를 쓰시기를 추천드립니다.

 

 

[1] 코드

 

이렇게 Marquee 위젯을 만들어주고 

 

 

 

앱에서 테스트 해봅니다. 

 

 

 

 

 

[2] 코드 설명

 

이전 글의 alternate marquee와 다른 점은 build 메소드와 scroll 메소드 밖에 없는 데요

이거 위주로 살펴보겠습니다

(나머지 부분은 Marquee Widget 만들기 (1) - alternate  를 참고해주세요!)

 

 

## 1. 

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
        itemBuilder: (context, index) {
          return Center(
            child: widget.items[index % widget.items.length]
          );
        },
        scrollDirection: Axis.horizontal,
        controller: _scrollController,
        physics: NeverScrollableScrollPhysics(), // not allow the user to scroll.
    );
  }

 

원래 ListView.builder 를 쓸 때는 itemCount를 넘겨줘야합니다.

하지만 itemCount를 안넘겨주면 infinite list가 된다고 합니다. (_scrollController.position.maxScrollExtent를 찍어보면 Infinity가 나옴)

itemBuilder 안에서 index를 출력해보면 계속 index값이 올라가는 것을 확인할 수 있습니다.

 

이 index값이 계속 증가하는 것을 이용하여 list를 계속 반복해주면 됩니다. 

 

 

==>

사실 이렇게 해도 문제가 없는 지 잘모르겠는데

구글링, marquee 패키지들을 보면 이렇게 ListView.builder에 itemCount를 안넘겨주시게 구현하셨더라구요,, 😳

 

 

 

 

## 2. 

 

scroll 메소드에서는 10만큼 오른쪽으로 스크롤 시켜주는 코드를 작성해주었습니다. 

그리고 이동할 때 걸리는 시간으로는 주입받은 moveDuration을 넣어줬습니다. 

그리고 이동을 기다려주는 delay 코드를 넣어줬습니다. 

 

+ ScrollEndNotification을 이용해서 scroll이 끝나면 다음 이동을 시켜주게 바꿔도 좋을 것 같아요! (참고)

  Future<bool> _scroll() async {
    double _moveDistance = 10.0;

    _position += _moveDistance;
    _scrollController.animateTo(_position, duration: widget.moveDuration, curve: Curves.linear);

    await Future.delayed(widget.moveDuration);
    return true;
  }

 

반응형
댓글