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

**注意:(对于书呆子)不要把它标为重复的问题。

  • 是的,我知道什么是NullPointerException
  • 是的,我已经尝试view.getDrawingCacheview.getDrawingCache返回空答案。
  • 我正试图单独为平板电脑开发绘图应用程序。 我创建了一个用于绘制的自定义视图。 自定义视图包含在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附加到自定义视图中,并将它们保存为单个图像。 这整个过程正常工作三星平板电脑10.1。

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

    我已经调试并检查了自定义视图的宽度和高度,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返回null,仅为null

    启用滚动时,调用getDrawingCache将返回null

    等等..


    根据您的解释,似乎大图不是由代码绘制的,所以请使用下面的代码它是工作,

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

       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);
                }
    
    链接地址: http://www.djcxy.com/p/67631.html

    上一篇: view.getDrawingCache() returns null only in Samsung Galaxy note 8.0?

    下一篇: Get Android view as Bitmap to save it on SD