我正在制作一个动画登录界面...我的代码如下
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
ImageView i = (ImageView)findViewById(R.id.img1);
if (i == null) throw new AssertionError();
i.setBackgroundResource(R.drawable.animation_pulse);
AnimationDrawable pro = (AnimationDrawable)i.getDrawable();
pro.start();
但是当我在模拟器中执行应用程序时,它会显示
java.lang.OutOfMemoryError: Failed to allocate a 17280012 byte allocation with
4194304 free bytes and 15MB until OOM
虽然我的可绘制文件小于2mb,甚至以下代码也无济于事。
android:largeHeap="true"
答案 0 :(得分:1)
尝试使用一些图像加载器库。这将解决问题。
UML
这些Glide最好:)
gradle依赖项:
// if you need jar ,please download it from https://mvnrepository.com/artifact/com.github.bumptech.glide/glide
compile group: 'com.github.bumptech.glide', name: 'glide', version: '3.8.0'
示例代码:
Glide.with(context)
.load(your drawable)
.override(yoursize, yoursize)
.into(new Target<Drawable>() {
@Override
public void onStart() {
}
@Override
public void onStop() {
}
@Override
public void onDestroy() {
}
@Override
public void onLoadStarted(Drawable placeholder) {
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
}
@Override
public void onResourceReady(Drawable resource, GlideAnimation<? super Drawable> glideAnimation) {
imageview.setImageDrawable(resource);
//start animation here
}
@Override
public void onLoadCleared(Drawable placeholder) {
}
@Override
public void getSize(SizeReadyCallback cb) {
}
@Override
public void setRequest(Request request) {
}
@Override
public Request getRequest() {
return null;
}
})
答案 1 :(得分:0)
请在清单文件中添加此内容,然后查看魔法
android:largeHeap="true"
android:hardwareAccelerated="false"
快乐的编码!!
答案 2 :(得分:0)
在anroidmenifest.xml上发布这个
<application
android:allowBackup="true"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
答案 3 :(得分:0)
目前,将图片从res/drawable/
移至res/drawable-nodpi/
。 res/drawable/
是res/drawable-mdpi/
的同义词,因此您说800x600是-mdpi
屏幕所需的分辨率(大约160dpi)。在更高密度的设备上,Android会自动扩展此类资源以保持相同的物理大小(5&#34; x 3.5&#34;),这会增加图像的内存消耗。
虽然此更改有所帮助,但您仍会在许多设备上遇到OutOfMemoryErrors
。您将需要完全摆脱这个动画,或者用不需要大约60MB堆空间的其他东西(800像素×600像素×4字节/像素×33图像)替换它。