欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > Android >内容正文

Android

canvas画布会黑屏吗_Android SurfaceView 黑屏问题

发布时间:2024/7/23 Android 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 canvas画布会黑屏吗_Android SurfaceView 黑屏问题 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

说一个真实的案例。其中需求要做一个绘图功能,一听到绘图,自然而然就像到了SurfaceView这个类。所以我就用了。

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/edit"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

然后就是MySurfaceView继承SurfaceView,然后我们就会定义一个drawCanvas方法去绘图,通常的做法就是这样

package com.example.test;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.util.AttributeSet;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

public class MySurfaceVivew extends SurfaceView{

private SurfaceHolder holder;

private Bitmap bitmap;

public MySurfaceVivew(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

holder = this.getHolder();

}

private void drawCanvas(Bitmap bitmap){

Canvas canvas = holder.lockCanvas();

if(canvas != null){

canvas.drawBitmap(bitmap, 0, 0, null);

holder.unlockCanvasAndPost(canvas);

}

}

public void setBitmap(Bitmap bitmap){

this.bitmap = bitmap;

this.drawCanvas(bitmap);

}

}

通过setBitmap去加载一张图片,然后在用画布画出来。但是很不幸,现实是残酷的,当Activity加载布局时图片闪一下就黑屏了。为什么呢?查了一下资料,原来Activity在加载时后会卸载SurfaceView,在创建后很快就被卸载掉了,所以只能见到闪的一下就黑屏了。有些资料会说在onResume方法中设,我也试了一下,发现不行,这下连闪都不闪一下。调试发现,canvas画布为空。自然,黑屏也就理所当然了。那怎么办,解决问题的办法才是问题的关键。那么,我们就要在画布创建时把图片画出来。

有了突破点就好办了。canvas画布在什么时候创建,就的看他谁提供的。canvas = holder.lockCanvas(),不难看出宿主是surfaceholder。那么是不是surfaceholder被创建的同时创建了canvas呢?我做了一次尝试。

package com.example.test;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.util.AttributeSet;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

public class MySurfaceVivew extends SurfaceView implements SurfaceHolder.Callback{

private SurfaceHolder holder;

private Bitmap bitmap;

public MySurfaceVivew(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

holder = this.getHolder();

}

private void drawCanvas(Bitmap bitmap){

Canvas canvas = holder.lockCanvas();

if(canvas != null){

canvas.drawBitmap(bitmap, 0, 0, null);

holder.unlockCanvasAndPost(canvas);

}

}

public void setBitmap(Bitmap bitmap){

this.bitmap = bitmap;

this.drawCanvas(bitmap);

}

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

// TODO Auto-generated method stub

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

// TODO Auto-generated method stub

this.drawCanvas(bitmap);

}

@Override

public void surfaceDestroyed(SurfaceHolder holder) {

// TODO Auto-generated method stub

}

}

总结

以上是生活随笔为你收集整理的canvas画布会黑屏吗_Android SurfaceView 黑屏问题的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。