成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Flutter中怎么利用Clipper自定義形狀-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)Flutter中怎么利用Clipper自定義形狀,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)專注于南山企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站制作。南山網(wǎng)站建設(shè)公司,為南山等地區(qū)提供建站服務(wù)。全流程按需制作網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

ClipOval 圓形裁剪

ClipOval( child: SizedBox(  width: 120.0,  height: 120.0,  child: Image.asset(   Config.assets_avatar_1,  ), ),);

CircleAvatar 圓形頭像

CircleAvatar( radius: 60.0, backgroundImage: AssetImage(  Config.assets_avatar_1, ),);

Container Decoration 裝飾形狀

通過BoxShape.circle實(shí)現(xiàn)圓形圖片

Container( width: 120.0, height: 120.0, decoration: BoxDecoration(  shape: BoxShape.circle,  image: DecorationImage(   image: AssetImage(    Config.assets_avatar_1,   ),  ), ));

通過BorderRadius實(shí)現(xiàn)圓形圖片

Container( width: 120.0, height: 120.0, decoration: BoxDecoration(  borderRadius: BorderRadius.all(Radius.circular(60.0)),   image: DecorationImage(    image: AssetImage(     Config.assets_avatar_1,    ),   ), ),)

ClipPath 路徑剪裁

ClipPath( clipper: TriangleClipper(ClipperPosition.LeftTop), child: Container(  width: 16.0,  height: 16.0,  decoration: BoxDecoration(   color: Colors.blue,  ), ),);enum ClipperPosition { LeftTop, RightTop,}class TriangleClipper extends CustomClipper<Path> { final ClipperPosition position; TriangleClipper(this.position); @override Path getClip(Size size) {  final path = Path();  path.lineTo(0.0, 0.0);  if (position == ClipperPosition.LeftTop) {   path.lineTo(size.width, 0.0);   path.lineTo(size.width, size.height);  } else if (position == ClipperPosition.RightTop) {   path.lineTo(size.width, 0.0);   path.lineTo(0.0, size.height);  }  path.close();  return path; } @override bool shouldReclip(CustomClipper oldClipper) {  return false; }}

ClipRect 矩形剪裁

Container( alignment: Alignment.topCenter, color: Colors.transparent, child: Container(  color: Colors.green,  child: ClipRect(   clipper: _RectClipper(20.0),   child: Image.asset(    Config.assets_avatar_1,    width: 160.0,    height: 160.0,    fit: BoxFit.fill,   ),  ), ),);class _RectClipper extends CustomClipper<Rect> { /// Remove side of size final double removeSize;  _RectClipper(this.removeSize);  @override Rect getClip(Size size) {  return new Rect.fromLTRB(   removeSize,   removeSize,   size.width - removeSize,   size.height - removeSize,  ); }  @override bool shouldReclip(CustomClipper<Rect> oldClipper) {  return false; }}

ClipRRect 圓角矩形剪裁

ClipRRect( borderRadius: BorderRadius.all(Radius.circular(16.0)), child: Image.asset(  Config.assets_avatar_1,  fit: BoxFit.fill,  width: 120.0,  height: 120.0, ),);

Star Rating(CustomPaint) 評(píng)分控件

評(píng)分控件 UI圖

實(shí)現(xiàn)方案

使用CustomPaint結(jié)合ClipPath畫出單個(gè)五角星;

使用Stack渲染兩層畫面  背景層,一排灰色五角星 前景層,一排亮色五角星,并使用ClipRect截取一定Width

實(shí)現(xiàn)代碼

class StarRatingDemo extends StatefulWidget { @override _StarRatingDemoState createState() => _StarRatingDemoState();}class _StarRatingDemoState extends State<StarRatingDemo> { /// ClipPath Star Rating _buildClipPathStarRating(double rate, int count) {  return Container(   padding: EdgeInsets.fromLTRB(24.0, 16.0, 24.0, 0.0),   child: StaticRatingBar(    size: 50.0,    rate: rate,    count: count,   ),  ); }  @override Widget build(BuildContext context) {  return Scaffold(   appBar: AppBar(    centerTitle: true,    title: Text('Star Rating'),   ),   body: ListView(    physics: BouncingScrollPhysics(),    children: <Widget>[     // _buildClipPathStarRating(1.0, 1),     _buildClipPathStarRating(0.5, 5),     _buildClipPathStarRating(2.0, 5),     _buildClipPathStarRating(3.0, 5),     _buildClipPathStarRating(4.0, 5),     _buildClipPathStarRating(5.0, 5),     _buildClipPathStarRating(5.5, 6),     SizedBox(height: 16.0),    ],   ),  ); }}class StaticRatingBar extends StatelessWidget { /// Number of stars final int count;  /// Init rate final double rate;  /// Size of the starts final double size;  final Color colorLight;  final Color colorDark;  StaticRatingBar({  this.rate = 5,  this.colorLight = const Color(0xFF1E88E5),  this.colorDark = const Color(0xFFEEEEEE),  this.count = 5,  this.size = 60, });  Widget buildDarkStar() {  return SizedBox(   width: size * count,   height: size,   child: CustomPaint(    painter: _PainterStars(     count: count,     color: colorDark,     strokeWidth: 0.0,     size: this.size / 2,     style: PaintingStyle.fill,    ),   ),  ); }  Widget buildLightStar() {  return ClipRect(   clipper: _RatingBarClipper(rate * size),   child: SizedBox(    height: size,    width: size * count,    child: CustomPaint(     painter: _PainterStars(      count: count,      strokeWidth: 0.0,      color: colorLight,      size: this.size / 2,      style: PaintingStyle.fill,     ),    ),   ),  ); }  @override Widget build(BuildContext context) {  return Stack(   children: <Widget>[    buildDarkStar(),    buildLightStar(),   ],  ); }}class _RatingBarClipper extends CustomClipper<Rect> { final double width;  _RatingBarClipper(this.width);  @override Rect getClip(Size size) {  return Rect.fromLTRB(0.0, 0.0, width, size.height); }  @override bool shouldReclip(_RatingBarClipper oldClipper) {  return false; }}class _PainterStars extends CustomPainter { final double size; final int count; final Color color; final PaintingStyle style; final double strokeWidth;  _PainterStars({  this.size,  this.count,  this.color,  this.strokeWidth,  this.style, }); double degree2Radian(int degree) {  return (pi * degree / 180); } Path createStarPath(double radius, Path path) {  double radian = degree2Radian(36);  double radiusIn = (radius * sin(radian / 2) / cos(radian)) * 1.1;  path.moveTo((radius * cos(radian / 2)), 0.0);  path.lineTo(   (radius * cos(radian / 2) + radiusIn * sin(radian)),   (radius - radius * sin(radian / 2)),  );  path.lineTo(   (radius * cos(radian / 2) * 2),   (radius - radius * sin(radian / 2)),  );  path.lineTo(   (radius * cos(radian / 2) + radiusIn * cos(radian / 2)),   (radius + radiusIn * sin(radian / 2)),  );  path.lineTo(   (radius * cos(radian / 2) + radius * sin(radian)),   (radius + radius * cos(radian)),  );  path.lineTo((radius * cos(radian / 2)), (radius + radiusIn));  path.lineTo(   (radius * cos(radian / 2) - radius * sin(radian)),   (radius + radius * cos(radian)),  );  path.lineTo(   (radius * cos(radian / 2) - radiusIn * cos(radian / 2)),   (radius + radiusIn * sin(radian / 2)),  );  path.lineTo(0.0, (radius - radius * sin(radian / 2)));  path.lineTo(   (radius * cos(radian / 2) - radiusIn * sin(radian)),   (radius - radius * sin(radian / 2)),  );  path.lineTo((radius * cos(radian / 2)), 0.0);  return path; } @override void paint(Canvas canvas, Size size) {  Paint paint = Paint();  paint.strokeWidth = strokeWidth;  paint.color = color;  paint.style = style;  Path path = Path();  double offset = strokeWidth > 0 ? strokeWidth + 2 : 0.0;    path = createStarPath(this.size - offset, path);  for (int i = 0; i < count - 1; i++) {   path = path.shift(Offset(this.size * 2, 0.0));   path = createStarPath(this.size - offset, path);  }   if (offset > 0) {   path = path.shift(Offset(offset, offset));  }  path.close();  canvas.drawPath(path, paint); }  @override bool shouldRepaint(_PainterStars oldDelegate) {  return oldDelegate.size != this.size; }}

看完上述內(nèi)容,你們對(duì)Flutter中怎么利用Clipper自定義形狀有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

當(dāng)前文章:Flutter中怎么利用Clipper自定義形狀-創(chuàng)新互聯(lián)
文章來源:http://jinyejixie.com/article28/jspjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作全網(wǎng)營銷推廣、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、網(wǎng)站改版、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
通道| 涟源市| 东光县| 扎赉特旗| 镇雄县| 开阳县| 钟山县| 高台县| 恭城| 苏尼特右旗| 丹寨县| 中方县| 柏乡县| 防城港市| 肥东县| 沂水县| 华阴市| 盱眙县| 瑞昌市| 同德县| 滦平县| 历史| 桐乡市| 安图县| 峨眉山市| 油尖旺区| 靖江市| 襄汾县| 灵寿县| 凌源市| 湖口县| 唐山市| 乌鲁木齐市| 奉贤区| 翼城县| 谢通门县| 临澧县| 封丘县| 五台县| 保定市| 石门县|