Попытка получить размер изображения в ImageView
Я пытаюсь получить реальный размер изображения, отображаемого в представлении изображения. На самом деле мое изображение больше, чем экран, и изображение просматривает изображение, чтобы изменить его. Я ищу новый размер.
Я попытался переопределить метод onDraw ImageView в пользовательском представлении, но я не получаю правильную высоту и ширину...
public class LandImageView extends ImageView
{
public LandImageView( Context context )
{
super( context );
}
public LandImageView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public LandImageView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
protected void onDraw( Canvas canvas )
{
super.onDraw( canvas );
int test = this.getWidth();
int test2 = this.getHeight();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);
}
}
Есть ли у вас какие-либо подсказки?
Ответы
Ответ 1
Ни один из ответов здесь фактически не отвечает на вопрос:
Из Bitmap
любого размера, отображаемого ImageView
, найдите фактические размеры отображаемого изображения в отличие от размеров поставляемого Bitmap
.
А именно:
- Использование
ImageView.getDrawable().getInstrinsicWidth()
и getIntrinsicHeight()
приведет к возврату исходных измерений.
- Получение
Drawable
через ImageView.getDrawable()
и отбрасывание его на BitmapDrawable
, затем с помощью BitmapDrawable.getBitmap().getWidth()
и getHeight()
также возвращается исходное изображение и его размеры.
Единственный способ получить размеры фактического отображаемого изображения - извлечение и использование преобразования Matrix
, используемого для отображения изображения, как оно показано. Это необходимо сделать после этапа измерения, и здесь пример показывает, что он вызван в Override
onMeasure()
для пользовательского ImageView
:
public class SizeAwareImageView extends ImageView {
public SizeAwareImageView(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// Get image matrix values and place them in an array
float[] f = new float[9];
getImageMatrix().getValues(f);
// Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
final float scaleX = f[Matrix.MSCALE_X];
final float scaleY = f[Matrix.MSCALE_Y];
// Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
final Drawable d = getDrawable();
final int origW = d.getIntrinsicWidth();
final int origH = d.getIntrinsicHeight();
// Calculate the actual dimensions
final int actW = Math.round(origW * scaleX);
final int actH = Math.round(origH * scaleY);
Log.e("DBG", "["+origW+","+origH+"] -> ["+actW+","+actH+"] & scales: x="+scaleX+" y="+scaleY);
}
}
Примечание. Чтобы преобразовать изображение Matrix
из кода вообще (например, в Activity
), функция ImageView.getImageMatrix()
- например. myImageView.getImageMatrix()
Ответ 2
Я продлил ответ B T, чтобы создать из него статический метод, и включить изображение влево и в верхнее положение в ImageView:
/**
* Returns the bitmap position inside an imageView.
* @param imageView source ImageView
* @return 0: left, 1: top, 2: width, 3: height
*/
public static int[] getBitmapPositionInsideImageView(ImageView imageView) {
int[] ret = new int[4];
if (imageView == null || imageView.getDrawable() == null)
return ret;
// Get image dimensions
// Get image matrix values and place them in an array
float[] f = new float[9];
imageView.getImageMatrix().getValues(f);
// Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
final float scaleX = f[Matrix.MSCALE_X];
final float scaleY = f[Matrix.MSCALE_Y];
// Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
final Drawable d = imageView.getDrawable();
final int origW = d.getIntrinsicWidth();
final int origH = d.getIntrinsicHeight();
// Calculate the actual dimensions
final int actW = Math.round(origW * scaleX);
final int actH = Math.round(origH * scaleY);
ret[2] = actW;
ret[3] = actH;
// Get image position
// We assume that the image is centered into ImageView
int imgViewW = imageView.getWidth();
int imgViewH = imageView.getHeight();
int top = (int) (imgViewH - actH)/2;
int left = (int) (imgViewW - actW)/2;
ret[0] = left;
ret[1] = top;
return ret;
}
Ответ 3
Я обнаружил, что WarrenFaith предложили использовать setAdjustViewBounds, но мне пришлось изменить ImageView_ layout/layout_height Image_width на 'wrap_content' (с помощью 'match_parent', setAdjustViewBounds ничего не сделал). Чтобы получить поведение по высоте/ширине/гравитации, которое я хотел, мне пришлось обернуть ImageView в FrameLayout:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:scaleType="fitCenter"
android:adjustViewBounds="true"
/>
</FrameLayout>
После этого размеры ImageView (возвращаемые getWidth() и getHeight()) соответствуют размеру изображения изображения.
Ответ 4
Попробуйте
ImageView.getDrawable().getIntrinsicHeight()
ImageView.getDrawable().getIntrinsicWidth()
Ответ 5
Я прохожу мимо, но надеюсь, что это все еще помогает
Я исхожу из предположения, что вы говорите о растровых изображениях в вашем изображенииView
то, что вы хотите понять, - это разница между
bmpBack.getWidth()
- > это дает вам размер вашего растрового изображения
а также
bmpBack.getScaledWidth(canvas)
;
- > это даст вам размер растрового изображения, отображаемого на экране.
Я никогда не использовал ImageView, потому что относительный дисплей сводил меня с ума, поэтому, в конце концов, я просто переопределял onDraw и сделал свой холст очень похожим на opengl.
Я думаю, что это ваша проблема.
приветствия
Джейсон
Ответ 6
Вы можете использовать imageview viewtreeobserver и addonDrawListener.
ViewTreeObserver vto = imageView.getViewTreeObserver();
vto.addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
@Override
public void onDraw() {
float[] f = new float[9];
imageView.getImageMatrix().getValues(f);
// Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
final float scaleX = f[Matrix.MSCALE_X];
final float scaleY = f[Matrix.MSCALE_Y];
// Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
final Drawable d = imageView. getDrawable();
final int origW = d.getIntrinsicWidth();
final int origH = d.getIntrinsicHeight();
// Calculate the actual dimensions
final int actW = Math.round(origW * scaleX);
final int actH = Math.round(origH * scaleY);
}
});
Ответ 7
попробуйте переопределить onMeasure(int widthMeasureSpec, int heightMeasureSpec)
вместо onSizeChanged.
Ответ 8
Если вы правильно поняли, вам понадобится ваше измерение ImageView, чтобы соответствующим образом масштабировать изображение. Я сделал это с помощью специального класса, где я переопределяю вызов onMeasure()
, чтобы получить ширину и высоту.
class LandImageView extends ImageView{
public LandImageView (Context context, AttributeSet attrs) {
super (context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int width = MeasureSpec.getSize(widthMeasureSpec);
final int height = MeasureSpec.getSize(heightMeasureSpec);
Log.v("", String.format("w %d h %d", width, height));
// width and height are the dimensions for your image
// you should remember the values to scale your image later on
this.setMeasuredDimension(width, height );
}}
В onMeasure вы получаете ширину и высоту изображения, чтобы он соответствовал вашему представлению.
Вы можете использовать LandImageView в своем макете следующим образом:
<my.package.LandImageView ... >
Ответ 9
Попробуйте загрузить свой ресурс, используя BitmapFactory.decodeResource(ресурсы res, int id, BitmapFactory.Options opts) с классом BitmapFactory.Options(), BitmapFactory.Options()
имеет флаг, который называется "inJustDecodeBounds" и дает только размеры ресурсов.
Надеюсь, что это помогло.
Ответ 10
public class images extends Activity {
ImageView i1;
LinearLayout l1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
i1=(ImageView)findViewById(R.id.iv);
l1 = new LinearLayout(this);
ImageView i = new ImageView(this);
ImageView i1 = new ImageView(this);
i.setImageResource(R.drawable. imagename.........);
l1.addView(i);
l1.addView(i1);
setContentView(l1);
}
}
сначала добавьте изображения в папку ресурсов ur....... и в xml файле создайте изображение...
Ответ 11
Я искал решение для установки размера представления изображения на масштабированное изображение, чтобы предотвратить пустое пространство сверху/снизу или влево/вправо (поскольку размер представления не изменяется в соответствии с масштабированным изображением).
То, что я нашел, чтобы сделать трюк, это использовать метод mImageView.setAdjustViewBounds(true);
, который приводит к правильному размеру макета. У меня нет масштабированного размера изображения, но я получил результат, который я искал... просто, если кому-то это нужно...
Ответ 12
Я думаю, вам нужен размер изображения, видимый на экране, для этого вам просто нужно это сделать:
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
initialWidth = this.getMeasuredWidth();
initialHeight = this.getMeasuredHeight();
}
И взгляните на документацию по таким методам, как: getWidht()
, getHeight()
, getMeasuredWidth()
, getMeasuredHeight()
и т.д. Вы узнаете, что он делает, чтобы дать вам этот размер.
EDIT: Если вы хотите, чтобы фактические width
и height
изображения загружались в imageView
. Вы можете изменить вызовы метода от getMeasuredWidth()
до getIntrinsicWidth()
и getMeasuredHeight()
до getIntrinsicHeight()
следующим образом:
Drawable drawable = getDrawable();
actualWidth = drawable.getIntrinsicWidth();
actualHeight = drawable.getIntrinsicHeight();
Ответ 13
Просто можно использовать этот код (в действии):
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
final ImageView imageView = findViewById(R.id.imageView);
int width = imageView.getWidth(), height = imageView.getHeight();
}
В случае, если изображение достигает концов imageView.
Ответ 14
Как насчет ImageView.getBackground() или ImageView.getDrawable(), а затем Drawable.getBounds()?