今天在写一个布局时,运行后报错,ImageView显示为黑色,无法加载图片,造成Cannot generate texture from bitmap异常,这个错误我是第一次看见,遂百度谷歌,查找到了一些解决方案:
参考http://www.2cto.com/kf/201410/342644.html
其中提到可能是android 4.0之后系统开启了GPU硬件加速导致的,可通过关闭加速来解决
注意:设置图片的非硬件加速模式是在api11之后添加的,所以需要进行版本控制
关于安卓硬件加速的还有一篇非常详细的博文,有兴趣的可以看下
Android-关于安卓手机的硬件加速问题
此处抄录部分内容:
从Android 3.0开始,Android的2D渲染管线可以更好的支持硬件加速。硬件加速使用GPU进行View上的绘制操作。
硬件加速可以在一下四个级别开启或关闭:
Application
Activity
Window
View
Application级别
往您的应用程序AndroidManifest.xml文件为application标签添加如下的属性即可为整个应用程序开启硬件加速:
<application android:hardwareAccelerated="true" ...>
Activity级别
您还可以控制每个activity是否开启硬件加速,只需在activity元素中添加android:hardwareAccelerated属性即可办到。比如下面的例子,在application级别开启硬件加速,但在某个activity上关闭硬件加速。
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
Window级别
如果您需要更小粒度的控制,可以使用如下代码开启某个window的硬件加速:
getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注:目前还不能在window级别关闭硬件加速。
View级别
您可以在运行时用以下的代码关闭单个view的硬件加速:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
注:您不能在view级别开启硬件加速
项目中曾遇到过加速后产生:Cannot generate texture from bitmap的问题。关闭后正常
所使用的图片格式不对,一般推荐使用PNG格式,当使用gif格式时,尤其注意android为节省内存,一般不支持显示gif或只显示第一帧,若非使用动态图,尽量不要使用gif,或者使用一些特殊的方法来支持gif加载
创建一个工具类
MyGifView.java
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.util.AttributeSet;
import android.view.View;
public class MyGifView extends View{
private long movieStart;
private Movie movie;
//此处必须重写该构造方法
public MyGifView(Context context,AttributeSet attributeSet) {
super(context,attributeSet);
//以文件流(InputStream)读取进gif图片资源
movie=Movie.decodeStream(getResources().openRawResource(R.drawable.keyboard));
}
@Override
protected void onDraw(Canvas canvas) {
long curTime=android.os.SystemClock.uptimeMillis();
//第一次播放
if (movieStart == 0) {
movieStart = curTime;
}
if (movie != null) {
int duraction = movie.duration();
int relTime = (int) ((curTime-movieStart)%duraction);
movie.setTime(relTime);
movie.draw(canvas, 0, 0);
//强制重绘
invalidate();
}
super.onDraw(canvas);
}
}
布局示例:
<com.example.showgifimage.MyGifView
android:id="@+id/iv"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_margin="20dp"
/>
注意:标签的设置 <com.example.showgifimage.MyGifView/>
格式:包名+.类名
关于gif加载还有其他的方法,例如
在Android中显示GIF动画