У меня есть для вас ответ!
Когда какой-либо из setImage...
методов вызывается на ImageView
во внутренней системе, запрашивается проход макета, например, setImageBitmap()
, как указано выше, определяется как
public void setImageBitmap(Bitmap bm) {
setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));
}
который звонит
public void setImageDrawable(Drawable drawable) {
if (mDrawable != drawable) {
mResource = 0;
mUri = null;
updateDrawable(drawable);
requestLayout(); //layout requested here!
invalidate();
}
}
, который имеет эффект «привязки» галереи к центру изображения, которое в данный момент находится ближе всего к центру галереи.
Что я сделал, чтобы предотвратить это, так это просмотр, который загружается в Галерею, имеет явную высоту и ширину (в dip
с) и использует подкласс ImageView
, который игнорирует запросы макета. Это работает, поскольку у галереи все еще есть проход макета изначально, но не стоит делать это каждый раз, когда изображение в галерее изменяется, что, я думаю, должно было бы произойти, если бы у представлений галереи были установлены ширина и высота WRAP_CONTENT
, что мы не Обратите внимание, что, поскольку invalidate()
все еще вызывается в setImageDrawable()
, изображение все равно будет отображаться при установке.
Мой очень простой ImageView
подкласс ниже!
/**
* This class is useful when loading images (say via a url or file cache) into
* ImageView that are contained in dynamic views (Gallerys and ListViews for
* example) The width and height should be set explicitly instead of using
* wrap_content as any wrapping of content will not be triggered by the image
* drawable or bitmap being set (which is normal behaviour for an ImageView)
*
*/
public class ImageViewNoLayoutRefresh extends ImageView
{
public ImageViewNoLayoutRefresh(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public ImageViewNoLayoutRefresh(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public ImageViewNoLayoutRefresh(Context context)
{
super(context);
}
@Override
public void requestLayout()
{
// do nothing - for this to work well this image view should have its dims
// set explicitly
}
}
edit: я должен упомянуть, что подходы onItemSelected также могут работать, но, поскольку мне нужно было подключиться к этому во время бросания, я пришел к вышесказанному, который я считаю более гибким