Java 如何缩放图像或调整大小以避免内存不足错误?
我是开发新手,我已经尝试制作一个简单的游戏有一段时间了,但我无法使它正常工作,因为它在大多数设备上不断出现内存不足的问题 我尽可能地缩小了图像大小,我的最大图像是117kB 我的图像存储在一个可绘制的文件夹中。我不认为我的图像需要单独使用xxhdpi或xhdpi。所以在清单中我提到了所有支持屏幕大小的代码 我在舱单上尝试了以下方法,但没有效果Java 如何缩放图像或调整大小以避免内存不足错误?,java,android,image,bitmap,Java,Android,Image,Bitmap,我是开发新手,我已经尝试制作一个简单的游戏有一段时间了,但我无法使它正常工作,因为它在大多数设备上不断出现内存不足的问题 我尽可能地缩小了图像大小,我的最大图像是117kB 我的图像存储在一个可绘制的文件夹中。我不认为我的图像需要单独使用xxhdpi或xhdpi。所以在清单中我提到了所有支持屏幕大小的代码 我在舱单上尝试了以下方法,但没有效果 android:largeheap = "true" android:noHistory = "true" (for every acti
android:largeheap = "true"
android:noHistory = "true" (for every activity so that it doesn't stack up over each other)
我有大约50个活动(都有单独的格式,所以不能只做一个活动),这些活动是从一个普通的应用程序类随机生成的
我的Q1.java
public class Q1 extends Activity {
TextView textview;
int score;
MediaPlayer player;
TextView scored;
LinearLayout imageview3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_q1);
scored = (TextView) findViewById(R.id.score);
imageview3 = (LinearLayout) findViewById(R.id.scoreview);
Intent mintent = getIntent();
score = mintent.getIntExtra("score", 0);
scored.setText(String.valueOf(score));
TextView scrolltext=(TextView) findViewById(R.id.scrolltext);
Typeface custom_font = Typeface.createFromAsset(getAssets(), "fonts/panicStricken.ttf");
scrolltext.setTypeface(custom_font);
}
public void button(View view) {
player = MediaPlayer.create(Q1.this, R.raw.correct);
player.setVolume(50,50);
player.start();
Class activityToShow = ActivityList.getInstance().getRandomActivity();
Intent intent = new Intent(this,activityToShow );
intent.putExtra("score", score);
startActivity(intent);
}
public void fedex(View view) {
player = MediaPlayer.create(Q1.this, R.raw.wrong);
player.setVolume(50,50);
player.start();
score = score - 1;
scored.setText(String.valueOf(score));
if (score == 0) {
Intent intent = new Intent(this, GameOver.class);
startActivity(intent);
}
}
@Override
public void onBackPressed() {
Intent intent = new Intent(this,MainMenu.class);
startActivity(intent);
super.onBackPressed();
finish();
}
我的布局与xml
<ImageView
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/scoreview"
android:background="@drawable/pic"
android:onClick="pic"
android:layout_marginTop="50dp"
android:id="@+id/imageView11" />
我知道有篇文章是关于
但我不太擅长编程,而且对我来说,将代码应用到自己的应用程序中仍然有点棘手
有人能帮我找到最好的方法吗
我认为我无法进一步缩小图像的大小。我能做的最好的可能就是将所有图像的大小保持在平均50kB,也就是说大约50个50kB的图像
当android将所有这些图像加载到一起时,我的大小缩减是否足以阻止这场内存不足的噩梦?为避免内存不足错误,请使用BitmapFactory.Options类减小图像像素大小,然后压缩图像,如下所示
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 3;
Bitmap bmp = BitmapFactory.decodeFile(filePath, options);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 85, stream);
imageView.setImageBitmap(bmp);
真正的问题发生在图像大小调整上。只需调整图像大小几次/或一次并不真正令人担忧,但当您经常这样做时,您肯定会立即遇到OOM错误。解决这个问题的策略是通过缓存。当您缓存图像时,它将保证您只需要以更少的时间/步骤调整大小 下面是一个可视化的用例流程图。
上面的流程图显示了处理此案例的正确方法。我们有一个抽象的
缓存
,用于存储以前的图像(注意:缓存是您个人的首选,它可以是任何类型:内存缓存、数据库缓存或文件缓存。也可以随意阅读)。还有一个关于如何高效加载图像/缩略图而不会将质量降低太多的问题。可能值得一试。问题是我不知道如何将位图工厂代码应用到我的游戏中……比如我如何分配一个图像以在每个活动中可伸缩?嘿……你的方法似乎是一个不错的选择,但我的问题是如何将其应用到我的代码中,因为我是一个初学者……如果你能告诉我如何将其应用到活动。。。漂亮吗?如果你能遵循我建议的算法,下次你会更容易。基本上,我的解决方案的整个想法是缓存大小调整后的图像,这样下次如果你再次需要该图像,你就不再需要调整它的大小,因为你的缓存中有一个大小调整后的图像的副本。(调整大小是OOM的罪魁祸首之一)顺便说一句,我也是Android的新手。如果您有个人问题,可以在我的个人资料中找到我的联系人。干杯