Hình ảnh Góc tròn trong Flutter


121

Tôi đang sử dụng Flutter để tạo danh sách thông tin về phim. Bây giờ tôi muốn ảnh bìa bên trái là ảnh có góc bo tròn. Tôi đã làm như sau, nhưng nó không hoạt động. Cảm ơn!

    getItem(var subject) {
    var row = Container(
      margin: EdgeInsets.all(8.0),
      child: Row(
        children: <Widget>[
          Container(
            width: 100.0,
            height: 150.0,
            decoration: BoxDecoration(
              borderRadius: BorderRadius.all(Radius.circular(8.0)),
              color: Colors.redAccent,
            ),
            child: Image.network(
              subject['images']['large'],
              height: 150.0,
              width: 100.0,
            ),
          ),
        ],
      ),
    );
    return Card(
      color: Colors.blueGrey,
      child: row,
    );
  }

như sau

nhập mô tả hình ảnh ở đây


Bạn đã tìm ra lý do tại sao phương pháp này không hoạt động?
Martin

Câu trả lời:


355

Sử dụng ClipRRectnó sẽ hoạt động hoàn hảo

ClipRRect(
    borderRadius: BorderRadius.circular(8.0),
    child: Image.network(
        subject['images']['large'],
        height: 150.0,
        width: 100.0,
    ),
)

9
Cảm ơn ! Tôi đã làm nó như bạn nói, và sau đó thêm vào fit: BoxFit.fill, nó trông khá tốt.
Liu Silong,

2
Cảm ơn - bạn có bất kỳ ý tưởng nào về cách tạo đường viền đầy màu sắc cho hình ảnh clipRect'ed không?
iKK,

3
@iKK - bọc nó trong một container với một BoxDecoration với biên giới phù hợp / borderRadius đạo cụ như vậy: Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(3.0), border: Border.all(color: Colors.grey[300])), child: ClipRRect( borderRadius: BorderRadius.circular(3.0), child: Image.network( uri, fit: BoxFit.fill, width: imageDimension, height: imageDimension, ), ), )
Daniel Allen

1
cảm ơn, một lời khuyên: chỉ hoạt động có chiều rộng và chiều cao tương tự
Álvaro Agüero

50

Bạn cũng có thể sử dụng CircleAvatar, đi kèm với

CircleAvatar(
  radius: 20,
  backgroundImage: NetworkImage('https://via.placeholder.com/140x100')
)

2
Đây là câu trả lời tốt nhất. Tôi đã làm thêmbackgroundImage: member[index].picture == null ? Image(image: AssetImage('assests/no-image.png')) : NetworkImage( member[index].picture,
saviour123

@ saviour123 không phải mọi hình ảnh có các góc tròn đều là 'hình đại diện'. Được chấp nhận một là câu trả lời chung chung.
nipunasudha

Không thể đặt chiều cao hoặc chiều rộng với tiện ích con này, điều này có vấn đề.
papillon

38

Việc sử dụng ClipRRectbạn cần phải mã hóa cứng BorderRadius, vì vậy nếu bạn cần nội dung tròn hoàn chỉnh, hãy sử dụng ClipOvalthay thế.

ClipOval(
  child: Image.network(
    "image_url",
    height: 100,
    width: 100,
    fit: BoxFit.cover,
  ),
),

2
Câu trả lời đơn giản nhất!
Alvin Konda

1
nếu hình ảnh con không phải là hình vuông cắt xén sẽ là hình elip trong giải pháp này.
Bilal Şimşek

29

Hãy thử điều này thay thế, hiệu quả với tôi:

Container(
  width: 100.0,
  height: 150.0,
  decoration: BoxDecoration(
    image: DecorationImage(
        fit: BoxFit.cover, image: NetworkImage('Path to your image')),
    borderRadius: BorderRadius.all(Radius.circular(8.0)),
    color: Colors.redAccent,
  ),
),

Aswer của bạn chắc chắn hữu ích, cảm ơn! Nhưng điều gì sẽ xảy ra nếu nội dung của một vùng chứa không chỉ là một hình ảnh mà là một tiện ích? Bất kỳ ý tưởng?
Oleksandr

13
   Container(
      width: 48.0,
      height: 48.0,
      decoration: new BoxDecoration(
        shape: BoxShape.circle,
        image: new DecorationImage(
            fit: BoxFit.fill,
            image: NetworkImage("path to your image")
        )
    )),

5

Đối với hình ảnh sử dụng cái này

ClipOval(
    child: Image.network(
        'https://url to your image',
        fit: BoxFit.fill,
    ),
);

Trong khi đối với Hình ảnh nội dung, hãy sử dụng cái này

ClipOval(
    child: Image.asset(
        'Path to your image',
        fit: BoxFit.cover,
    ),
)

1
Tôi đã sử dụng câu trả lời này làm câu trả lời, bạn không cung cấp bất kỳ điều gì hữu ích. -1 từ tôi.
CopsOnRoad

4

Với phiên bản mới của chủ đề chất liệu và rung, bạn cũng cần sử dụng tiện ích con "Padding" để có hình ảnh không lấp đầy vùng chứa của nó.

Ví dụ, nếu bạn muốn chèn một hình ảnh tròn trong AppBar, bạn phải sử dụng padding nếu không hình ảnh của bạn sẽ luôn cao bằng AppBar.

Hy vọng điều này sẽ giúp ai đó

InkWell(
        onTap: () {
            print ('Click Profile Pic');
        },
        child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: ClipOval(
                child: Image.asset(
                    'assets/images/profile1.jpg',
                ),
            ),
        ),
    ),

3

bạn có thể sử dụng ClipRRect như thế này:

  Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: ClipRRect(
                    borderRadius: BorderRadius.circular(25),
                    child: Image.asset(
                      'assets/images/pic13.jpeg',
                      fit: BoxFit.cover,
                    ),
                  ),
                )

bạn có thể đặt bán kính của mình hoặc người dùng chỉ cho trên cùng bên trái hoặc dưới cùng bên trái như:

Padding(
              padding: const EdgeInsets.all(8.0),
              child: ClipRRect(
                borderRadius: BorderRadius.only(
                    topLeft: Radius.circular(25)
                ,bottomLeft: Radius.circular(25)),
                child: Image.asset(
                  'assets/images/pic13.jpeg',
                  fit: BoxFit.cover,
                ),
              ),
            )

2

Sử dụng ClipRRect với thuộc tính hình ảnh được đặt là phù hợp: BoxFit.fill

ClipRRect(
          borderRadius: new BorderRadius.circular(10.0),
          child: Image(
            fit: BoxFit.fill,
            image: AssetImage('images/image.png'),
            width: 100.0,
            height: 100.0,
          ),
        ),

1

Sử dụng ClipRRect nó sẽ giải quyết vấn đề của bạn.

      ClipRRect(
              borderRadius: BorderRadius.all(Radius.circular(10.0)),
              child: Image.network(
                Constant.SERVER_LINK + model.userProfilePic,
                fit: BoxFit.cover,
              ),
            ),

0

Sử dụng Cách này trong hình ảnh vòng kết nối này cũng đang hoạt động + bạn cũng có trình tải trước cho hình ảnh mạng:

new ClipRRect(
     borderRadius: new BorderRadius.circular(30.0),
     child: FadeInImage.assetNetwork(
          placeholder:'asset/loader.gif',
          image: 'Your Image Path',
      ),
    )

0

Hãy thử Điều này nó hoạt động tốt.

Container(
  height: 220.0,
  width: double.infinity,
  decoration: BoxDecoration(
    borderRadius: new BorderRadius.only(
      topLeft: Radius.circular(10),
       topRight: Radius.circular(10),
    ),
    image: DecorationImage(
      fit: BoxFit.fill,
      image: NetworkImage(
        photoUrl,
      ),
     ),
   ),
);

-1

trang trí người dùng Hình ảnh cho một thùng chứa.

  @override
  Widget build(BuildContext context) {
    final alucard = Container(
        decoration: new BoxDecoration(
        borderRadius: BorderRadius.circular(10),
          image: new DecorationImage(
              image: new AssetImage("images/logo.png"),
              fit: BoxFit.fill,
          )
        )
    );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.