2015-12-04 2 views
0

Я разрабатываю приложение, которое после нажатия кнопки Я перехожу к новому действию, где 3 случайных изображения установлены на изображение. Если пользователю не нравятся выбранные 3 изображения, они могут нажать кнопку, чтобы создать 3 новых случайных изображения. У меня возникают две проблемы ...Получите новое случайное изображение при нажатии кнопки - android

  1. У меня есть ImageView набор для определенного размера, но когда изображения появляются иногда они меньше и показывают по горизонтали. Я бы хотел, чтобы они отображались вертикально и все как размер изображения. Как изменить код для этого?

  2. Я получаю новые изображения, которые появляются, когда я нажимаю кнопку, но я получаю сообщение об ошибке, когда у меня заканчивается память, когда я делаю это несколько раз. Как мне изменить код, чтобы я не использовал всю свою память?

Вот мой код

public ImageView shirts; 
public ImageView pants; 
public ImageView shoes; 
Button reload; 
private Bitmap currentBitmap = null; 
String[] projection = new String[]{ 
     MediaStore.Images.Media.DATA, 
}; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.suggested_outfit); 
    shirts = (ImageView)findViewById(R.id.shirtImage); 
    pants = (ImageView)findViewById(R.id.pantsImage); 
    shoes = (ImageView)findViewById(R.id.shoesImage); 

    shirts.setImageBitmap(getImage()); 
    pants.setImageBitmap(getImage()); 
    shoes.setImageBitmap(getImage()); 

    reload = (Button)findViewById(R.id.getNewOutfit); 
    reload.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      finish(); 
      startActivity(getIntent()); 
     } 
    }); 
} 


public Bitmap getImage() { 
    Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
    Cursor cur = getContentResolver().query(images, 
      projection,"", null, "" 
    ); 
    final ArrayList<String> imagesPath = new ArrayList<String>(); 
    if (cur.moveToFirst()) { 

     int dataColumn = cur.getColumnIndex(
       MediaStore.Images.Media.DATA); 
     do { 
      imagesPath.add(cur.getString(dataColumn)); 
     } while (cur.moveToNext()); 
    } 
    cur.close(); 
    final Random random = new Random(); 
    final int count = imagesPath.size(); 
    int number = random.nextInt(count); 
    String path = imagesPath.get(number); 

    currentBitmap = BitmapFactory.decodeFile(path); 

    return currentBitmap; 
} 

}

Я читал, что это не хорошая практика, чтобы перезагрузить деятельность, но я не могу понять способ генерировать 3 новые случайные изображений. Я открыт для любых предложений, если есть лучший способ сделать это.

ответ

1

Получение изображений через onClick метод будет иметь

do { 
    String path = cur.getString(dataColumn); 
    if(path.contains("yourDirectory")){ //in your case, your image directory 
     imagesPath.add(path); 
    } 
} while (cur.moveToNext()); 

в запрашиваемом намерения/деятельность

0

Декодирование Растровое изображение потребляет много памяти, на вашем коде вы декодируете растровое изображение много раз, когда кнопка щелчка может вызвать OutOfMemory. Попробуйте декодировать все ваши Bitmap один раз и сохранить их в списке. Когда клик генерирует случайный битмап, вы создаете случайный индекс списка Bitmap и извлекаете объект по этому индексу. Надеюсь, эта помощь!

+0

Не знаете, как сделать это, так как я перезарядить свою деятельность каждый раз при нажатии кнопки. Даже если я сохраню его в списке, не собирается ли он расшифровывать растровое изображение, потому что каждый раз я обновляю его? – Ashley

+0

Зачем вам нужна перезагрузка, это дорогое поведение, каждый раз, когда активность воссоздает ОС Android, необходимо снова выделить ресурс. Вы можете создать произвольный битмап без перезапуска активности. Помимо размера растрового изображения может возникнуть проблема с OutOfMemory, попробуйте перемасштабировать размер растрового изображения – ResolutioN

0

вы можете использовать этот utils: image loader у него есть менеджер памяти. Вы можете установить изображение, когда загрузка изображения завершена.

+0

Я не могу загрузить какие-либо пакеты. Мне нужно написать код. – Ashley

+0

использовать BitmapFactory.decodeStream (is, null, options) вместо использования BitmapFactory.decodeFile(). DecodeStream вызывает JNI >> nativeDecodeAsset() для декодирования Bitmap. –

Смежные вопросы