我正在创建一个RecyclerView
以显示图片网格。选择其中一个时,它应打开一个带有过渡的新活动。
我正在使用Glide库加载图片,并且过渡效果很糟糕,因为它在新活动中重新加载了图片。因此,我必须将其保存在缓存中,然后将其用于过渡。
我有代码,但有时如果图片未加载,则会抛出Canvas RuntimeException。
这是日志:
07-03 15:19:58.633 28461-28461/jahirfiquitiva.project E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: jahirfiquitiva.project, PID: 28461
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@29f09d20
at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1282)
at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:599)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:538)
at android.widget.ImageView.onDraw(ImageView.java:1176)
at android.view.View.draw(View.java:15239)
at android.view.View.updateDisplayListIfDirty(View.java:14175)
at android.view.View.getDisplayList(View.java:14197)
at android.view.GhostView.onDraw(GhostView.java:52)
at android.view.View.draw(View.java:15239)
at android.view.View.updateDisplayListIfDirty(View.java:14175)
at android.view.View.getDisplayList(View.java:14197)
at android.view.View.draw(View.java:14967)
at android.view.ViewGroup.drawChild(ViewGroup.java:3406)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
at android.view.View.updateDisplayListIfDirty(View.java:14170)
at android.view.View.getDisplayList(View.java:14197)
at android.view.View.draw(View.java:14967)
at android.view.ViewGroup.drawChild(ViewGroup.java:3406)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
at android.view.ViewOverlay$OverlayViewGroup.dispatchDraw(ViewOverlay.java:219)
at android.view.View.draw(View.java:15248)
at android.widget.FrameLayout.draw(FrameLayout.java:598)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2906)
at android.view.View.updateDisplayListIfDirty(View.java:14175)
at android.view.View.getDisplayList(View.java:14197)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2536)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2352)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1982)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5891)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
这是打开其他活动并将图片保存为缓存的代码:
private void openViewer(WallpapersAdapter.WallsHolder wallsHolder, int index, final HashMap<String, String> data) {
final Intent intent = new Intent(wallsActivity, ViewerActivity.class);
intent.putExtra("wallUrl", data.get(WallpapersActivity.WALL));
intent.putExtra("wallName", data.get(WallpapersActivity.NAME));
intent.putExtra("transitionName", ViewCompat.getTransitionName(wallsHolder.wall));
//save image from drawable
//get its path and send it to activity
Bitmap bitmap = drawableToBitmap(wallsHolder.wall.getDrawable());
//Convert to byte array and send to the other activity
Log.e("Resolution", bitmap.getWidth() + "x" + bitmap.getHeight());
try {
//Write file
String filename = "bitmap.png";
FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
//Cleanup
stream.close();
bitmap.recycle();
//Pop intent
intent.putExtra("image", filename);
} catch (Exception e) {
e.printStackTrace();
}
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
this, wallsHolder.wall, ViewCompat.getTransitionName(wallsHolder.wall));
startActivity(intent, options.toBundle());
}
public static Bitmap drawableToBitmap (Drawable drawable) {
Bitmap bitmap = null;
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if(bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
我该怎么做才能解决此问题?提前致谢。
我怀疑您的位图偶尔会进入回收状态,然后Canvas
才有机会在此处使用它drawable.draw(canvas);
。
一个快速的解决方案应该是不调用bitmap.recycle();
,这对于android>
2.3.3
并不是严格要求的。如果仍然要强制回收该内存,则必须找到一种方法来检查何时确实不再需要位图(即,Canvas
有机会完成其绘制操作)。
这是我的缓存: 有什么想法为什么这会失败在Android2.3而不是4.0?
我在片段中有一个listview。listview的每一行都有imageview,我正在加载位图图像。我将位图设置为imageview的标记。下次遇到带有非空标记的图像视图时,我会在标记中回收位图并将图像重新加载到其中。这导致崩溃“画布:试图使用回收的位图android.graphics.bitmap”在活动方向更改时崩溃。我不明白为什么会这样。请帮忙。 堆栈跟踪:java.lang.Runtim
我正在使用而不是将背景、边框和/或背景色应用到页面的某个区域(主要是因为需要页面来构建,而不需要。因为我的内容可能会持续几页)。问题是,如果坐标(x=0,y=0)意味着左下角,则图像的位置不会像预期的那样。我还想将画布定位到一个固定的位置,但是似乎不起作用。请参阅附上的原始图像和要定位在{x,y,width,height}={100f,100f,200f,200f}的图像,该图像应该在页面的底部(
我有一个关于Android的RecyclerView的问题。状态 我正在使用RecyclerView,如何使用它并将其与RecyclerView绑定。状态 我的目的是保存RecyclerView的滚动位置。
在添加依赖项实现的com时。阿佐夫特。转盘:转盘:1.2。4'对于我的项目,Android Studio抛出的异常未能解决:recyclerview-v7。然后我尝试为recyclerview添加依赖项。仍然得到相同的错误。
显示网格 若要在图表画布启用网格,从菜单栏选择“图表”->“显示网格”。 对齐网格 若要在画布对齐对象到网格,从菜单栏选择“图表”->“对齐网格”。 更改图表符号 若要更改图表的符号,从菜单栏选择“图表”->“图表符号”。 【注意】下列选项会根据你所选择的图表类型而有所不同。 选项 描述 默认 Navicat Data Modeler 使用的默认符号样式。 简单 一个简单的符号样式。表、视图或实体