android - 空位图 : View. getDrawingCache() 给出空位图

标签 android view android-studio bitmap

我正在自定义 View 上绘图。然后绘制的图像将转换为位图以进行进一步处理,但是当我这样做时 Bitmap bitmap = drawView1.getDrawingCache();位图为空。为什么它是null。以及如何解决它

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

自定义 View 的 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);
        }

    }


}

最佳答案

我的理解是 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 给出的评论得到了这个答案

关于android - 空位图 : View. getDrawingCache() 给出空位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31116012/

相关文章:

android - 在帧缓冲区上显示数据

android - 后台服务和作业调度程序 XMPP 聊天应用程序

mysql - 在 MySQL 中应用 VIEW 的一些好的例子是什么?

ios - 切换到另一个 View 时隐藏键盘

Android studio 的分配跟踪器图形 View

android-studio - 跨项目 Android Studio 共享自己的模块

Android Studio 添加基于 maven 的项目 libas 依赖项

android - 如果用户愿意,永久删除 Android 按钮

java - 递归函数总是返回 null

sql - DB2/400 中的 if-else 语句