Как получить ширину и высоту андроида.штучка.Графическое представление?
╔══════════════════════════════════════════════╗ ^
║ ImageView ╔══════════════╗ ║ |
║ ║ ║ ║ |
║ ║ Actual image ║ ║ |
║ ║ ║ ║ |60px height of ImageView
║ ║ ║ ║ |
║ ║ ║ ║ |
║ ╚══════════════╝ ║ |
╚══════════════════════════════════════════════╝
<------------------------------------------------>
90px width of ImageView
у меня есть вид изображения с некоторой высотой и шириной по умолчанию, изображения хранятся в БД, и я хочу масштабировать изображение в соответствии с шириной высоты Imageview. Поскольку я не хочу, чтобы он давал значения по умолчанию, потому что когда-либо я изменяю его высоту и ширину, мне также нужно изменить его в коде.
Я пытаюсь получить высоту и ширину ImageView, но 0 возвращается мне в обоих случаях.
int height = ((ImageView) v.findViewById(R.id.img_ItemView)).getHeight();
это возвращает мне 0 даже он имеет высоту и ширину по умолчанию
10 ответов:
мой ответ на этот вопрос может помочь вам:
int finalHeight, finalWidth; final ImageView iv = (ImageView)findViewById(R.id.scaled_image); final TextView tv = (TextView)findViewById(R.id.size_label); ViewTreeObserver vto = iv.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { iv.getViewTreeObserver().removeOnPreDrawListener(this); finalHeight = iv.getMeasuredHeight(); finalWidth = iv.getMeasuredWidth(); tv.setText("Height: " + finalHeight + " Width: " + finalWidth); return true; } });
затем вы можете добавить работу масштабирования изображения из метода onPreDraw ().
Я просто установил это свойство, и теперь ОС Android заботится обо всем.
android: adjustViewBounds= "true"
используйте это в вашем макете.xml, где вы посадили свой ImageView :D
Я мог бы получить ширину и высоту изображения по его drawable;
int width = imgView.getDrawable().getIntrinsicWidth(); int height = imgView.getDrawable().getIntrinsicHeight();
причина, по которой размеры ImageView равны 0, заключается в том, что при запросе их представление все еще не выполнило шаги компоновки и измерения. Вы только сказали вид, как он будет" вести себя " в макете, но он все еще не рассчитал, куда поместить каждый вид.
Как вы решаете размер, чтобы дать вид изображения? Не можете ли вы просто использовать один из вариантов масштабирования, реализованных изначально?
сообщение в поток пользовательского интерфейса работает для меня.
final ImageView iv = (ImageView)findViewById(R.id.scaled_image); iv.post(new Runnable() { @Override public void run() { int width = iv.getMeasuredWidth(); int height = iv.getMeasuredHeight(); } });
Я думаю, что вы можете позволить ОС Android позаботиться об этом для вас. Установите тип шкалы на ImageView в
fitXY
и изображение, которое он отображает, будет иметь размер, соответствующий текущему размеру представления.<ImageView android:layout_width="90px" android:layout_height="60px" android:scaleType="fitXY" />
ваш xml-файл:
<ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/image" android:scaleType="fitXY" android:adjustViewBounds="true"/>
ваш java-файл:
ImageView imageView = (ImageView)findViewById(R.id.imageView); int width = imageView.getDrawable().getIntrinsicWidth(); int height = imageView.getDrawable().getIntrinsicHeight();
самый простой способ-получить ширину и высоту ImageView в методе onWindowFocusChanged действия
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); height = mImageView.getHeight(); width = mImageView.getWidth(); }
Если вы создали несколько изображений динамически чем попробовать это:
//инициализации массив изображений
private ImageView myImages[] = new ImageView[your_array_length];
//создать программно и добавить на родительский вид
for (int i = 0; i < your_array_length; i++) { myImages[i] = new ImageView(this); myImages[i].setId(i + 1); myImages[i].setBackgroundResource(your_array[i]); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( frontWidth[i], frontHeight[i]); ((MarginLayoutParams) params).setMargins(frontX_axis[i], frontY_axis[i], 0, 0); myImages[i].setAdjustViewBounds(true); myImages[i].setLayoutParams(params); if (getIntent() != null && i != your_array,length) { final int j = i; myImages[j].getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw() { myImages[j].getViewTreeObserver().removeOnPreDrawListener(this); finalHeight = myImages[j].getMeasuredHeight(); finalWidth = myImages[j].getMeasuredWidth(); your_textview.setText("Height: " + finalHeight + " Width: " + finalWidth); return true; } }); } your_parent_layout.addView(myImages[i], params); }
// вот именно. Счастливое Кодирование.