gpt4 book ai didi

android - view.getDrawingCache() 仅在 Samsung Galaxy note 8.0 中返回 null?

转载 作者:行者123 更新时间:2023-11-29 14:36:09 25 4
gpt4 key购买 nike

**注意:(对于 Nerd )不要将其标记为重复问题。

  1. 是的,我知道什么是 NullPointerException
  2. 是的,我已经尝试过 view.getDrawingCache 从 Stackoverflow 返回空答案。

我正在尝试单独为平板电脑开发一个绘图应用程序。我创建了一个用于绘图的自定义 View 。自定义 View 包含在 ScrollView 中,以便在图像太大时让用户滚动图像。

activity_drawing.xml

 <RelativeLayout
android:id="@+id/container"
android:layout_marginLeft="@dimen/activity_correction_answer_horizontal_margin"
android:layout_marginRight="@dimen/activity_correction_answer_horizontal_margin"
android:layout_width="match_parent"
android:layout_height="match_parent">

<in.com.hourglass.views.ImageScroll
android:layout_centerInParent="true"
android:id="@+id/image_scroll"
android:layout_width="match_parent"
android:layout_height="match_parent">

<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<in.com.hourglass.views.DrawView
android:id="@+id/draw_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
</in.com.hourglass.views.ImageScroll>
</RelativeLayout>

因此当在 View 上绘制完成后,用户可以保存图像并在 Canvas 上绘制。

我正在调整图像大小并将其作为 Bitmap 附加到自定义 View 并将它们保存为单个图像。整个过程在 Samsung Tablet 10.1 上运行良好。

但是当我尝试在屏幕较低的设备三星 Note 8.0 中测试相同内容时view.getDrawingCache() 给我一个空的 Bitmap

我已经调试并检查了自定义 View 的宽度和高度,它们指定了 ScrollView 的宽度和高度,并且自定义 View 中也存在位图。

我尽可能重用 Bitmap 以减少应用堆内存使用。

我知道,我必须对这个警告做些什么:

W/View: View too large to fit into drawing cache, needs 4380332 bytes, only 4096000 available

错误日志:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: in.com.hourglassPID: 10456
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
at android.graphics.Bitmap.createBitmap(Bitmap.java:614)
at in.com.hourglass.views.DrawView.getCorrectedBitmapWithoutResizing(DrawView.java:449)
at in.com.hourglass.activities.DrawingActivity.saveAnswerSheet(DrawingActivity.java:842)
at in.com.hourglass.activities.DrawingActivity.navigateNext(DrawingActivity.java:426)
at in.com.hourglass.activities.DrawingActivity.access$500(DrawingActivity.java:89)
at in.com.hourglass.activities.DrawingActivity$ToolIconClick.onClick(DrawingActivity.java:362)
at android.view.View.performClick(View.java:4789)
at android.view.View$PerformClick.run(View.java:19881)
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:5294)
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)

用于获取调整大小的位图的代码

       public class DrawView extends View {

public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(width, height);
}




public Bitmap getResizedBitmap(int originial_width, int original_height) {
this.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(this.getDrawingCache());
return Bitmap.createScaledBitmap(bitmap,originial_width_answersheet,original_height_answersheet,false);
}
}

我引用过但不成功的链接,

Android View.getDrawingCache returns null, only null

Call to getDrawingCache returns null when scroll is enabled

等..

最佳答案

根据您的解释,代码似乎无法绘制大图像,因此请使用下面的代码,它可以工作,

我还没有测试过,但我认为这会对你有所帮助

   public static Bitmap loadLargeBitmapFromView(View v) 
{
Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}

如下所示编辑您的方法

     public Bitmap getResizedBitmap(int originial_width, int original_height) {
this.setDrawingCacheEnabled(true);
Bitmap bitmap = null;
if(this.getDrawingCache()==null)
{
bitmap = loadLargeBitmapFromView(this);
}
else
{
bitmap = Bitmap.createBitmap(this.getDrawingCache());
}

return Bitmap.createScaledBitmap(bitmap,originial_width_answersheet,original_height_answersheet,false);
}

关于android - view.getDrawingCache() 仅在 Samsung Galaxy note 8.0 中返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38437255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com