Я сделал вид, что изображение с фиксированными размерами показывает изображение из пользовательского пункта назначения. Масштабирование и ориентация уже работают, но когда я запускаю приложение, сначала открывается первое серое окно. Когда я снова загружаю его, он показывает картинку, как это должно быть. Может кто-нибудь, пожалуйста, скажите мне, что здесь происходит и как я смогу это исправить? Я уже гугл этой проблемы, но я думаю, что это что-то делать с последовательностью, в которой мой код выполняет .. Вот мой код для показа изображения:Imageview не показывает изображение при первой попытке
public void refreshImageView(String highlight){
File image;
if(highlight==null){
image=new File(mydb.getCityById(cityId).getPicture());
}else{
try{
image=new File(mydb.getHighlightById(highlightId).getFile());
}catch(Exception e){
Log.i(TAG, "There is no file saved for this highlight");
image=new File("");
}
}
if(image.exists()&&image.toString().endsWith(".jpg")){
mImagePreview.setVisibility(View.VISIBLE);
int maxWidth=mImagePreview.getWidth(), maxHeight=mImagePreview.getHeight();
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeFile(image.getAbsolutePath(),options);
options.inSampleSize=calculateInSampleSize(options,maxWidth,maxHeight);
options.inJustDecodeBounds=false;
Bitmap mBitmap=BitmapFactory.decodeFile(image.getAbsolutePath(), options);
try{
mBitmap=checkOrientation(image.getAbsolutePath(),mBitmap);
}catch(Exception e){
Log.i(TAG, "Picture could not be rotated");
}
Bitmap bitmapPrev=Bitmap.createBitmap(
mBitmap.getWidth()+20,
mBitmap.getHeight()+20,Bitmap.Config.ARGB_8888);
Canvas canvas=new Canvas(bitmapPrev);
canvas.drawColor(R.color.black);
canvas.drawBitmap(mBitmap, 10,10,new Paint(Paint.FILTER_BITMAP_FLAG));
mImagePreview.setImageBitmap(bitmapPrev);
}
else{
mImagePreview.setVisibility(View.GONE);
}
}
//method for calculating sample size
private static int calculateInSampleSize(BitmapFactory.Options options, int maxWidth, int maxHeight){
final int height=options.outHeight,width=options.outWidth;
int inSampleSize=1;
if(height>maxHeight || width>maxWidth){
final int heightRatio=Math.round((float)height/(float)maxHeight),
widthRatio=Math.round((float)width/(float)maxWidth);
inSampleSize=heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
//method to check orientation of picture
private Bitmap checkOrientation(String path, Bitmap bitmap) throws IOException{
ExifInterface ei = new ExifInterface(path);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
return rotateImage(bitmap, 90);
case ExifInterface.ORIENTATION_ROTATE_180:
return rotateImage(bitmap, 180);
case ExifInterface.ORIENTATION_ROTATE_270:
return rotateImage(bitmap, 270);
default:
return bitmap;
}
}
//method to rotate image
public static Bitmap rotateImage(Bitmap source, float angle) {
Matrix matrix = new Matrix();
matrix.postRotate(angle);
Bitmap rotated = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
return rotated;
Я знаю, но тогда изображение просматривает изображение в полном размере, прежде чем приспосабливать его к масштабу изображения. Это делает загрузку изображения очень медленной, и поэтому я сделал это так, но спасибо в любом случае. –
Затем вы должны использовать библиотеку подвыборки с масштабированием изображения. Он делает все это и многое другое. Получить его на https://github.com/davemorrissey/subsampling-scale-image-view – lionscribe