Đặt chiều rộng và chiều cao ImageView theo chương trình?


643

Làm cách nào tôi có thể đặt ImageViewchiều rộng và chiều cao của chương trình?


4
Lạ như âm thanh, thông tin này khá khó tìm. Câu hỏi xứng đáng được nâng cao hơn.
phunehehe

14
Chú thích cho bất cứ ai đấu tranh với điều này đến từ nền tảng khác. các "kích thước và hình dạng để phù hợp với" tùy chọn được xử lý đẹp trong Android; nhưng thật khó để tìm thấy. bạn thường muốn kết hợp chiều rộng cha mẹ, nội dung gói chiều cao, điều chỉnhViewBound được bật , tỷ lệ fitToCenter và cropToPadding sai . sau đó là tự động. Tôi thực sự hy vọng nó sẽ giúp được ai đó!
Fattie

Câu trả lời:


1100

Có thể đã quá muộn nhưng vì lợi ích của những người khác có cùng vấn đề, hãy đặt chiều cao của ImageView:

imageView.getLayoutParams().height = 20;

Hi vọng điêu nay co ich.

Quan trọng. Nếu bạn đang đặt chiều cao sau khi bố cục đã được 'bố trí', hãy đảm bảo bạn cũng gọi:

imageView.requestLayout();

102
Nếu bạn đang đặt chiều cao sau khi bố cục đã được 'bố trí', hãy đảm bảo bạn gọi image_view.requestLayout ()
Rhys Davis

9
Nếu tôi cần quấn_content thì sao?
Francisco Corrales Morales

8
Bỏ phiếu vì một ngày bạn là sếp của tôi và tôi vẫn đang học hỏi từ bạn Hakim :)
Sami Eltamawy

9
@FranciscoCorralesMorales sử dụng cái này cho quấn_content image_view.getLayoutParams().height = RelativeLayout.LayoutParams.WRAP_CONTENT.. Nếu khung nhìn cha mẹ được LinearLayoutthay thế RelativeLayoutbằng nó
Sami Eltamawy

39
Vậy, làm thế nào để chỉ định đơn vị ? Làm thế nào để nói rằng đó là dp , không phải sp , v.v.
Saeed Neamati

231

Nếu chế độ xem hình ảnh của bạn là động, câu trả lời có chứa getLayout sẽ không thành công với ngoại lệ null.

Trong trường hợp đó, cách chính xác là:

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(100, 100);
iv.setLayoutParams(layoutParams);

7
nếu tôi đặt mã đó thì hình ảnh của tôi biến mất tại sao? ImageView imgLogo = ImageView mới (cái này); imgLogo.setImageDrawable (logo); LinearLayout.LayoutParams layoutParams = new linearLayout.LayoutParams (32,32); imgLogo.setLayoutParams (layoutParams); hàng.addView (imgLogo);
Mustafa Güven

3
Cảm ơn câu trả lời này, đưa tôi đi đúng hướng. Là một ghi chú được thêm vào, nên đặt linearLayout thành kiểu xem chính của hình ảnh. Ví dụ: nếu chế độ xem hình ảnh của bạn nằm trong một thư viện, bạn nên sử dụng các tham số bố cục của Thư viện thay vì Tuyến tính hoặc bạn sẽ có ngoại lệ truyền.
profexorgeek

3
@ MustafaGüven Tôi gặp vấn đề tương tự như bạn, nơi tôi ImageViewbiến mất. Bí quyết là làm cho phần bố cục (nghĩa là <this_part_here>.LayoutParams) giống với phần cha mẹ của ImageViewnó. Vì vậy, ví dụ, nếu bạn đặt bạn ImageViewtrong TableRowvòng một TableLayout, bạn nên có nó như TableRow.LayoutParams.
2323030

để giải thích chi tiết về người dùng ($ some_number) -> bạn cần tạo LayoutParams theo cha mẹ và đặt chúng trên con (imageView), cũng có thể requestLayout () dường như không cần thiết tại thời điểm viết
Bamboomy

lol bạn tạo thông số mới, câu trả lời tệ, bạn chỉ có thể nhận được thông số hiện tại, ý tôi là nếu bạn làm điều đó (tạo cái mới) thì bạn thậm chí không cần xml, sau đó cũng tạo / thêm chế độ xem hình ảnh theo chương trình ...
user924

52

Cách đơn giản này để thực hiện nhiệm vụ của bạn:

setContentView(R.id.main);    
ImageView iv = (ImageView) findViewById(R.id.left);
int width = 60;
int height = 60;
LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(width,height);
iv.setLayoutParams(parms);

và một cách khác nếu bạn muốn cung cấp kích thước màn hình theo chiều cao và chiều rộng thì hãy sử dụng mã bên dưới:

setContentView(R.id.main);    
Display display = getWindowManager().getDefaultDisplay();
ImageView iv = (LinearLayout) findViewById(R.id.left);
int width = display.getWidth(); // ((display.getWidth()*20)/100)
int height = display.getHeight();// ((display.getHeight()*30)/100)
LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(width,height);
iv.setLayoutParams(parms);

Hy vọng sử dụng đầy đủ cho bạn.


Đây là công việc tốt cho tôi !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Hiển thị hiển thị = getWindowManager (). GetDefaultDisplay (); ImageView iv = (linearLayout) findViewById (R.id.left); int width = display.getWidth (); // ((display.getWidth () * 20) / 100) int height = display.getHeight (); // ((display.getHeight () * 30) / 100) linearLayout.LayoutParams parms = new linearLayout.LayoutParams ,Chiều cao); iv.setLayoutParams (parms);
Selim Raza

Tại sao mọi người khai báo intcác biến nếu chúng sẽ không được sử dụng lại ở nơi khác? Có vẻ không cần thiết nhưng tôi không biết nhiều về nó.
n00

1
chỉ để hiểu rõ hơn @ n00dles ,,, không có gì khác
duggu

36

Tôi đã chơi cái này với pixeldp.

private int dimensionInPixel = 200;

Cách đặt theo pixel :

view.getLayoutParams().height = dimensionInPixel;
view.getLayoutParams().width = dimensionInPixel;
view.requestLayout();

Cách đặt bởi dp :

int dimensionInDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dimensionInPixel, getResources().getDisplayMetrics());
view.getLayoutParams().height = dimensionInDp;
view.getLayoutParams().width = dimensionInDp;
view.requestLayout();

Hy vọng điều này sẽ giúp bạn.


1
Làm thế nào tôi có thể làm điều này cho một giá trị dp cụ thể (nghĩa là không chuyển đổi từ px sang dp)?
alxcyl

@Hiren có nghĩa là gì bởi getResource (). GetDisplayMetrics () khi tôi đọc tài liệu, nó dường như là DisplayMetrics. Bạn có thể vui lòng giải thích cho tôi một chút ngắn gọn. Tôi mới dùng Android, cảm ơn.
Srini

Nguyên nhân do: java.lang.NullPulumException: Cố gắng ghi vào trường 'int android.view.Viewgroup $ LayoutParams.height' trên một tham chiếu đối tượng null
MD Khali

16

Nếu bạn cần đặt chiều rộng hoặc chiều cao của mình thành match_parent(lớn như cha mẹ của nó) hoặc wrap_content(đủ lớn để phù hợp với nội dung bên trong của chính nó), thì ViewGroup.LayoutParamscó hai hằng số này:

imageView.setLayoutParams(
    new ViewGroup.LayoutParams(
        // or ViewGroup.LayoutParams.WRAP_CONTENT
        ViewGroup.LayoutParams.MATCH_PARENT,      
        // or ViewGroup.LayoutParams.WRAP_CONTENT,     
        ViewGroup.LayoutParams.MATCH_PARENT ) );

Hoặc bạn có thể đặt chúng như trong câu trả lời của Hakem Zaied :

imageView.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
//...

11

Bạn có thể đặt giá trị cho tất cả các trường hợp.

demoImage.getLayoutParams().height = 150;

demoImage.getLayoutParams().width = 150;

demoImage.setScaleType(ImageView.ScaleType.FIT_XY);

1
Nguyên nhân do: java.lang.NullPulumException: Cố gắng ghi vào trường 'int android.view.Viewgroup $ LayoutParams.height' trên một tham chiếu đối tượng null
MD Khali

8

Cách tốt nhất và dễ nhất để thiết lập nút động là

 Button index=new Button(this);
 int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 45, getResources().getDisplayMetrics());             
 int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 42, getResources().getDisplayMetrics());

Chiều cao và chiều rộng trên được tính bằng pixel px . 45 là chiều cao tính bằng dp và 42 là chiều rộng tính bằng dp .

 index.setLayoutParams(new <Parent>.LayoutParams(width, height));

Vì vậy, ví dụ: nếu bạn đã đặt nút của mình trong TableRow trong TableLayout, bạn nên đặt nó dưới dạng TableRow.LayoutParams

 index.setLayoutParams(new TableRow.LayoutParams(width, height));

8

Chỉ cần tạo một đối tượng LayoutParams và gán nó cho imageView của bạn

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(150, 150);
imageView.setLayoutParams(params);

5
image_view.getLayoutParams().height 

trả về giá trị chiều cao tính bằng pixel. Bạn cần lấy kích thước màn hình trước để đặt giá trị đúng.

 Display display = context.getWindowManager().getDefaultDisplay();
 DisplayMetrics outMetrics = new DisplayMetrics();
 display.getMetrics(outMetrics);
 int screen_height = outMetrics.heightPixels;
 int screen_width = outMetrics.widthPixels;

Sau khi bạn có được kích thước màn hình, bạn có thể đặt chiều rộng và chiều cao của hình ảnh bằng cách sử dụng lề thích hợp.

 view.getLayoutParams().height = screen_height - 140;
 view.getLayoutParams().width = screen_width - 130 ;

3

Để đặt ImageView và Chiều cao theo lập trình, bạn có thể làm

            //Makesure you calculate the density pixel and multiply it with the size of width/height
            float dpCalculation = getResources().getDisplayMetrics().density;
            your_imageview.getLayoutParams().width = (int) (150 * dpCalculation);

            //Set ScaleType according to your choice...
            your_imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);

2

kotlin

val density = Resources.getSystem().displayMetrics.density
view.layoutParams.height = 20 * density.toInt()

1

Trong trường hợp kích thước widget cần được đặt theo chương trình, đảm bảo các quy tắc dưới đây.

  1. Đặt LayoutParam cho Bố cục mà bạn đang thêm chế độ xem đó . Trong trường hợp của tôi, tôi đang thêm vào TableRowvì vậy tôi phải làmTableRow.LayoutParams
  2. Theo mã này

final float scale = getResources().getDisplayMetrics().density; int dpWidthInPx = (int) (17 * scale); int dpHeightInPx = (int) (17 * scale);

TableRow.LayoutParams deletelayoutParams = new TableRow.LayoutParams(dpWidthInPx, dpHeightInPx); button.setLayoutParams(deletelayoutParams); tableRow.addView(button, 1);


1
Tôi thích điều này. Tôi đang sử dụng nó! Cảm ơn.
n00

0

Nếu bạn muốn vừa với hình ảnh trong chế độ xem hình ảnh, bạn có thể sử dụng "bọc nội dung" trong thuộc tính chiều cao và chiều rộng với loại tỷ lệ nhưng nếu bạn muốn đặt thủ công, bạn phải sử dụng LayoutParams.

Bố cục là hiệu quả để thiết lập chiều cao và chiều rộng bố trí theo chương trình.


0
int newHeight = 150;
            int newWidth = 150; 
            holder.iv_arrow.requestLayout();
            holder.iv_arrow.getLayoutParams().height = newHeight;
            holder.iv_arrow.getLayoutParams().width = newWidth;
            holder.iv_arrow.setScaleType(ImageView.ScaleType.FIT_XY);
            holder.iv_arrow.setImageResource(R.drawable.video_menu);
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.