2015-06-29 2 views
2

Я рисую на пользовательском представлении. Затем обрамленное изображение преобразуется в растровое изображение для дальнейшей обработки, но когда я делаю Bitmap bitmap = drawView1.getDrawingCache();, битмап имеет значение null. Почему это null.and, как ее решитьNull bitmap: View.getDrawingCache() дает Null bitmap

public class TrainingActivity extends ActionBarActivity { 
    private DrawingView drawView1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_training); 
     drawView1 = (DrawingView) findViewById(R.id.drawing1); 
     } 

public void submitButtonClicked(View v) { 
    Bitmap bitmap = drawView1.getDrawingCache(); 
} 

XML-файл для пользовательского зрения

<persistent.DrawingView 
     android:id="@+id/drawing1" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_marginBottom="3dp" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="5dp" 
     android:layout_marginTop="3dp" 
     android:layout_weight="1" 
     android:background="#FFFFFFFF" /> 

А также мой класс DrawingView является

public class DrawingView extends View { 
    //drawing path 
    private Path drawPath; 
    //drawing and canvas paint 
    private Paint drawPaint, canvasPaint; 
    //initial color 
    //private int paintColor = 0xFF660000; 
    private int paintColor = 0xFF000000; 
    //canvas 
    private Canvas drawCanvas; 
    //canvas bitmap 
    private Bitmap canvasBitmap; 
    private Context mContext; 

    public DrawingView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
     setupDrawing(); 
    } 

    private void setupDrawing() { 
//get drawing area setup for interaction 
     drawPath = new Path(); 
     drawPaint = new Paint(); 
     drawPaint.setColor(paintColor); 
     drawPaint.setAntiAlias(true); 
     drawPaint.setStrokeWidth(20); 
     drawPaint.setStyle(Paint.Style.STROKE); 
     drawPaint.setStrokeJoin(Paint.Join.ROUND); 
     drawPaint.setStrokeCap(Paint.Cap.ROUND); 
     canvasPaint = new Paint(Paint.DITHER_FLAG); 
     /* DisplayMetrics metrics = new DisplayMetrics(); 
     ((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int width = metrics.widthPixels; 
     int height = metrics.heightPixels; 
     drawCanvas.drawRect(100, height - 100, width - 100, 100, drawPaint);*/ 


    } 

    @TargetApi(Build.VERSION_CODES.KITKAT) 
    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 

//view given size 
     super.onSizeChanged(w, h, oldw, oldh); 
     canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     drawCanvas = new Canvas(canvasBitmap); 

     int leftx = 70; 
     int topy = 70; 
     Paint rectPaint=new Paint(); 
     rectPaint.setColor(Color.BLUE); 
     rectPaint.setAntiAlias(true); 
     rectPaint.setStrokeWidth(9); 
     rectPaint.setStyle(Paint.Style.STROKE); 
     rectPaint.setStrokeJoin(Paint.Join.ROUND); 
     rectPaint.setStrokeCap(Paint.Cap.ROUND); 

     drawCanvas.drawRect(leftx, topy, w-leftx, h-topy, rectPaint); 

     Rect r=new Rect(leftx, topy, w-topy, h-topy); 
     drawCanvas.clipRect(r); 





    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
//draw view 
     canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); 
     canvas.drawPath(drawPath, drawPaint); 




    } 

    public boolean onTouchEvent(MotionEvent event) { 
     //detect user touch 
     float touchX = event.getX(); 
     float touchY = event.getY(); 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       drawPath.moveTo(touchX, touchY); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       drawPath.lineTo(touchX, touchY); 
       break; 
      case MotionEvent.ACTION_UP: 
       drawCanvas.drawPath(drawPath, drawPaint); 
       drawPath.reset(); 
       break; 
      default: 
       return false; 
     } 
     invalidate(); 
     return true; 
    } 

    //for erasing purpose this function will be called 
    public void setErase(boolean isErase) { 
     //set erase true or false 
     boolean erase = isErase; 
     if (erase) { 
      //drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
      drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 
     } else { 
      drawPaint.setXfermode(null); 
     } 

    } 


} 
+0

Я думаю, что вы должны включить [рисунок кэш] (http://developer.android.com/reference/android/view/ View.html # setDrawingCacheEnabled% 28boolean% 29). – torque203

ответ

2

То, что я понимаю, был getDrawingCache() метод имеет ограничение на размер класса View (ширина и высота). Если класс View слишком велик, getDrawingCache() просто возвращает null. Таким образом, решение не должно было использовать метод, а вместо этого сделать это, как показано ниже.

Bitmap bitmap = Bitmap.createBitmap(drawView1.getMeasuredWidth(), drawView1.getMeasuredHeight(), Bitmap.Config.ARGB_8888); 
    Canvas bitmapHolder = new Canvas(bitmap); 
    drawView1.draw(bitmapHolder); 
// bitmap now contains the data we need! Do whatever with it!. 

Я получил этот ответ, следуя комментарий, данное этим парнем getDrawingCache() returns null

Смежные вопросы