canvas.getDrawingCache()返回null - Android

时间:2015-04-23 14:13:31

标签: android canvas view bitmap

我在这个类中有单独的画布ViewCanvas类我正在绘制两个世界。这是代码:

public class ViewCanvas extends View {

    private Paint paint;
    private Typeface typeFace;

    public ViewCanvas(Context context) {
        super(context);
    }

    public ViewCanvas(Context context, String first, String second) {
        super(context);

        setDrawingCacheEnabled(true);
        buildDrawingCache(true);
        paint = new Paint();
        typeFace = Typeface.createFromAsset(context.getAssets(), "fonts/BigNoodleTitling.ttf");
        bounds = new Rect();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);

        paint.setColor(Color.BLACK);
        paint.setTextSize(20);
        paint.setTypeface(typeFace);

        // Closing hardware acceleration
        setLayerType(LAYER_TYPE_SOFTWARE, paint);

        // Drawing first word
        canvas.save();
        .
        .
        .
        .
        // Drawing second world
        canvas.restore();
        .
        .
        .
        .
    }
}

此代码工作正常。我在MainActivity中使用这个ViewCanvas,如下所示:

public class MainActivity extends Activity {

    private ViewCanvas viewCanvas;
    private Bitmap imageForShare;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        viewCanvas = new ViewCanvas(this, first, second);
        LinearLayout llCanvas = (LinearLayout) findViewById(R.id.llCanvas);
        llCanvas.addView(viewCanvas);


        imageForShare = viewCanvas.getDrawingCache();
}

这里imageForShare是空的,我不知道为什么。

在我的onClick方法中,viewCanvas.getDrawingCache()工作得很好。 imageForShare不为null,我可以使用它。这是我的代码:

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btnFacebook:
            imageForShare = viewCanvas.getDrawingCache();
            break;
    }
}

问题在哪里,我想在我的onCreate方法中使用imageForShare。

3 个答案:

答案 0 :(得分:0)

试试这个:

public static Bitmap loadBitmapFromView(View v) {
     Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);                
     Canvas c = new Canvas(b);
     v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
     v.draw(c);
     return b;
}

link

答案 1 :(得分:0)

你能否使用OnStart()获取截图?
活动的可见生命周期发生在对onStart()的调用

之间

答案 2 :(得分:0)

好的,我找到了解决方案。在onCreate方法中创建imageForShare是不可能的,因为在创建imageForShare之后画布正在绘制。所以我在onWindowFocusChanged中创建了imageForShare,并且效果很好:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    imageForShare = viewCanvas.getDrawingCache(); 
}