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 黑屏问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现代软件工程讲义 源代码管理
- 下一篇: 瑞斯康达nms_瑞斯康达接入网设备维护手