我正在开发一个应用程序,只要单击一个按钮,我就会进入一个新的活动,其中3个随机图像被设置为imageView。如果用户不喜欢所选的3个图像,则可以单击按钮以生成3个新的随机图像。我有两个问题......
我将imageView设置为特定大小,但是当图像显示时,它们有时会变小并且水平显示。我希望它们垂直显示,并且全部显示为imageView的大小。如何更改代码才能执行此操作?
当我点击按钮时,我正在显示新图像但是我收到一条错误,说我做了几次后我的内存不足。如何更改代码以便停止使用我的所有内存?
这是我的代码
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个新的随机图像。如果有更好的方法,我愿意接受任何建议。
答案 0 :(得分:1)
通过onClick
方法获取图像必须具有
do {
String path = cur.getString(dataColumn);
if(path.contains("yourDirectory")){ //in your case, your image directory
imagesPath.add(path);
}
} while (cur.moveToNext());
在请求的意图/活动中
答案 1 :(得分:0)
解码位图消耗大量内存,在您的代码中,当您点击按钮可能导致OutOfMemory时,您多次解码位图。尝试一次解码所有位图并将其保存到列表中。当单击以生成随机Bitmap时,您可以创建列表Bitmap的随机索引并通过该索引检索对象。希望这有帮助!
答案 2 :(得分:0)
你可以使用这个工具:image loader 它有内存管理器。你可以在图像加载完成时设置imageview。