[Flutter Web] 마우스 호버시에 전개되는 아이콘 버튼을 만들어 보자
12685 단어 FlutterWebDartFlutter
만든 물건
마우스 호버에 의해 라벨이 표시되는 아이콘 버튼을 이미지했습니다.
마우스 호버시이므로 Flutter Web 상정입니다.
구현
모든 소스
class AccordionIconButton extends StatefulWidget {
final IconData _iconData;
final double _iconSize;
final String _label;
final double _maxWidth;
final void Function()? _onTap;
const AccordionIconButton(
{Key? key,
required IconData iconData,
required double iconSize,
required String label,
required double maxWidth,
void Function()? onTap})
: _iconData = iconData,
_iconSize = iconSize,
_label = label,
_maxWidth = maxWidth,
_onTap = onTap,
super(key: key);
@override
State<StatefulWidget> createState() => _State(width: this._iconSize);
}
class _State extends State<AccordionIconButton> {
static const double INITIAL_OPACITY = 0.0;
double opacity;
double width;
_State({
required this.width,
}) : opacity = INITIAL_OPACITY,
super();
@override
Widget build(BuildContext context) {
final Duration duration = Duration(milliseconds: 250);
final Widget iconWidget = Icon(
widget._iconData,
size: widget._iconSize,
);
final Widget textWidget = Text(
widget._label,
softWrap: false,
overflow: TextOverflow.fade,
);
return AnimatedContainer(
constraints: BoxConstraints(maxWidth: widget._maxWidth),
width: this.width,
curve: Curves.easeIn,
duration: duration,
child: InkWell(
borderRadius: BorderRadius.all(Radius.circular(10.0)),
onHover: (isHover) {
setState(() {
if (isHover) {
opacity = 1.0;
width = double.infinity;
} else {
opacity = INITIAL_OPACITY;
width = widget._iconSize;
}
});
},
onTap: widget._onTap,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
iconWidget,
Flexible(
child: AnimatedOpacity(
curve: Curves.easeIn,
duration: duration,
opacity: this.opacity,
child: textWidget,
))
],
),
),
);
}
}
Github
설명
매우 간단합니다.
마우스 호버 판단
InkWell
클래스의 onHover(bool)
로 검출할 수 있습니다.
호버 상태를 결정하고 전체 너비와 텍스트 항목의 투명도를 변경하고 있습니다.
그 외에도 MouseRegion
클래스등에서도 마우스의 판정은 가능합니다.
(이쪽은 마우스 커서의 위치 등까지 추적 가능)
InkWell(
onHover: (isHover) {
setState(() {
if (isHover) {
opacity = 1.0;
width = double.infinity;
} else {
opacity = INITIAL_OPACITY;
width = widget._iconSize;
}
});
},
...
)
애니메이션 표시
Animated 계 위젯을 사용하여 실현하고 있습니다.
자세한 해설은 공식이나 이 사이트 가 매우 참고가 됩니다.
AnimatedContainer(
constraints: BoxConstraints(maxWidth: widget._maxWidth),
width: this.width, // ←widthが変更された際に指定されたアニメーションでWidgetが変化する
curve: Curves.easeIn,
duration: duration,
...
)
요약
즐거운! ! ! (KONAMI 느낌) 😊
조금 만진 정도입니다만 마우스 조작의 검지 등 모바일 이외의 용도에서도 사용하기 쉬운 라이브러리가 갖추어져 있는 인상이었습니다.
코피페 할 수 없거나, 휠 클릭이 효과가 없거나 등 아직도 있습니다만,
FlutterWeb에서도 여러가지 만들어 가고 싶네요!
Reference
이 문제에 관하여([Flutter Web] 마우스 호버시에 전개되는 아이콘 버튼을 만들어 보자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yakuran1/items/d35b769e65cca84c9c4d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
모든 소스
class AccordionIconButton extends StatefulWidget {
final IconData _iconData;
final double _iconSize;
final String _label;
final double _maxWidth;
final void Function()? _onTap;
const AccordionIconButton(
{Key? key,
required IconData iconData,
required double iconSize,
required String label,
required double maxWidth,
void Function()? onTap})
: _iconData = iconData,
_iconSize = iconSize,
_label = label,
_maxWidth = maxWidth,
_onTap = onTap,
super(key: key);
@override
State<StatefulWidget> createState() => _State(width: this._iconSize);
}
class _State extends State<AccordionIconButton> {
static const double INITIAL_OPACITY = 0.0;
double opacity;
double width;
_State({
required this.width,
}) : opacity = INITIAL_OPACITY,
super();
@override
Widget build(BuildContext context) {
final Duration duration = Duration(milliseconds: 250);
final Widget iconWidget = Icon(
widget._iconData,
size: widget._iconSize,
);
final Widget textWidget = Text(
widget._label,
softWrap: false,
overflow: TextOverflow.fade,
);
return AnimatedContainer(
constraints: BoxConstraints(maxWidth: widget._maxWidth),
width: this.width,
curve: Curves.easeIn,
duration: duration,
child: InkWell(
borderRadius: BorderRadius.all(Radius.circular(10.0)),
onHover: (isHover) {
setState(() {
if (isHover) {
opacity = 1.0;
width = double.infinity;
} else {
opacity = INITIAL_OPACITY;
width = widget._iconSize;
}
});
},
onTap: widget._onTap,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
iconWidget,
Flexible(
child: AnimatedOpacity(
curve: Curves.easeIn,
duration: duration,
opacity: this.opacity,
child: textWidget,
))
],
),
),
);
}
}
Github
설명
매우 간단합니다.
마우스 호버 판단
InkWell
클래스의 onHover(bool)
로 검출할 수 있습니다.
호버 상태를 결정하고 전체 너비와 텍스트 항목의 투명도를 변경하고 있습니다.
그 외에도 MouseRegion
클래스등에서도 마우스의 판정은 가능합니다.
(이쪽은 마우스 커서의 위치 등까지 추적 가능)
InkWell(
onHover: (isHover) {
setState(() {
if (isHover) {
opacity = 1.0;
width = double.infinity;
} else {
opacity = INITIAL_OPACITY;
width = widget._iconSize;
}
});
},
...
)
애니메이션 표시
Animated 계 위젯을 사용하여 실현하고 있습니다.
자세한 해설은 공식이나 이 사이트 가 매우 참고가 됩니다.
AnimatedContainer(
constraints: BoxConstraints(maxWidth: widget._maxWidth),
width: this.width, // ←widthが変更された際に指定されたアニメーションでWidgetが変化する
curve: Curves.easeIn,
duration: duration,
...
)
요약
즐거운! ! ! (KONAMI 느낌) 😊
조금 만진 정도입니다만 마우스 조작의 검지 등 모바일 이외의 용도에서도 사용하기 쉬운 라이브러리가 갖추어져 있는 인상이었습니다.
코피페 할 수 없거나, 휠 클릭이 효과가 없거나 등 아직도 있습니다만,
FlutterWeb에서도 여러가지 만들어 가고 싶네요!
Reference
이 문제에 관하여([Flutter Web] 마우스 호버시에 전개되는 아이콘 버튼을 만들어 보자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yakuran1/items/d35b769e65cca84c9c4d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
InkWell(
onHover: (isHover) {
setState(() {
if (isHover) {
opacity = 1.0;
width = double.infinity;
} else {
opacity = INITIAL_OPACITY;
width = widget._iconSize;
}
});
},
...
)
AnimatedContainer(
constraints: BoxConstraints(maxWidth: widget._maxWidth),
width: this.width, // ←widthが変更された際に指定されたアニメーションでWidgetが変化する
curve: Curves.easeIn,
duration: duration,
...
)
즐거운! ! ! (KONAMI 느낌) 😊
조금 만진 정도입니다만 마우스 조작의 검지 등 모바일 이외의 용도에서도 사용하기 쉬운 라이브러리가 갖추어져 있는 인상이었습니다.
코피페 할 수 없거나, 휠 클릭이 효과가 없거나 등 아직도 있습니다만,
FlutterWeb에서도 여러가지 만들어 가고 싶네요!
Reference
이 문제에 관하여([Flutter Web] 마우스 호버시에 전개되는 아이콘 버튼을 만들어 보자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yakuran1/items/d35b769e65cca84c9c4d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)