【问题标题】:view.getDrawingCache() returns null only in Samsung Galaxy note 8.0?view.getDrawingCache() 仅在三星 Galaxy Note 8.0 中返回 null?
【发布时间】:2016-07-19 13:40:02
【问题描述】:

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

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

我正在尝试单独为平板电脑开发绘图应用程序。我创建了一个用于绘图的自定义视图。自定义视图包含在 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> 

所以当在视图上绘制完成后,用户可以保存图像并认为在Canvas 上绘制。

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

但是当我尝试在低屏设备 samsung Note 8.0 中进行测试时。 view.getDrawingCache() 给了我一个空的Bitmap

我已经调试并检查了customview的宽度和高度,scrollview都指定了宽度和高度,并且customview中也存在位图。

我尽可能重用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

等等。

【问题讨论】:

  • 我有一个像你一样的绘图视图,我在我的构造函数中使用this.setDrawingCacheEnabled(true);public DrawingView(Context c,AttributeSet attrs) 你试过这样吗?
  • 试过了,这也无济于事@YasinKaçmaz
  • 您在哪里将您的 Bitmap 附加到 Canvas ,在 onSizeChanged 中?
  • 在公共方法中不喜欢这个 public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap;无效();} @YasinKaçmaz
  • 您能否添加更多代码,我将您的与我的进行比较。特别是在我的onSizeChanged 方法中,我正在创建一个新的缩放位图并将其附加到我的画布上,例如:mCanvas = new Canvas(mBitmap);

标签: android bitmap scrollview android-canvas


【解决方案1】:

根据您的解释,似乎大图像不是由代码绘制的,因此请使用下面的代码,它是有效的,

我尚未测试,但我认为这会对您有所帮助

   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);
            }

【讨论】:

  • 成功了,谢谢。知道为什么我在三星 Tab 8.0 中内存不足,但在其他平板电脑上运行良好。
  • @HourGlass 很好,我迟到了。你也可以看看来自 Api Demos 的 FingerPaint 类:FingerPaint.java
  • 哈哈好吧伙计。一定会看看fingerPaint。谢谢你。@YasinKaçmaz
猜你喜欢
  • 2012-04-30
  • 1970-01-01
  • 2017-11-18
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多