我有自定义的SurfaceView,在onDraw方法中设置一个背景,然后绘制画布,但只看到背景。如何在背景上用画布作画?试图添加一个背景与画布,它工作,但在左上角2-3dp被删除,并重新绘制每次背景将占用大量的内存。那么它能用第一种方法还是第二种方法来完成吗?左上角没有空位吗?
编辑...
GameView.java
public class GameView extends SurfaceView {
private Bitmap background;
private SurfaceHolder holder;
private GameManager gameLoopThread;
public GameView(Context context, AttributeSet attrs) {
super(context, attrs, 0);
setWillNotDraw(false);
gameLoopThread = new GameManager(this);
holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
gameLoopThread.setRunning(false);
while (retry) {
try {
gameLoopThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
gameLoopThread.setRunning(true);
gameLoopThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
});
background = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
}
public void onDraw(Canvas canvas) {
canvas.drawBitmap(background, 0, 0, null);
}
public void drawCanvas(Canvas canvas) {
if (x < getWidth() - 10) {
x += 10;
} else {
gameLoopThread.setRunning(false);
}
canvas.drawLine(0, 200, x, 200, paint);
}
}GameManager.java
public class GameManager extends Thread {
private GameView view;
private boolean running = false;
public GameManager(GameView view) {
this.view = view;
}
public void setRunning(boolean run) {
running = run;
}
@Override
public void run() {
while (running) {
Canvas c = null;
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.drawCanvas(c);
}
} finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
}
}
}MainActivity.java
public class MainActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout ll = (LinearLayout) findViewById(R.id.main);
ll.setLayoutParams(new LinearLayout.LayoutParams(640, 400));
}
}Main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center_horizontal|top">
<LinearLayout
android:id="@+id/main"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<com.android.GameView
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>结果是http://oi57.tinypic.com/15znrpy.jpg
如果我注释GameView onDraw方法并添加canvas.drawBitmap(背景,0,0,null);到drawCanvas,结果将是http://oi60.tinypic.com/t0g802.jpg
发布于 2014-07-08 18:29:47
没有一种具体的方法来设置SurfaceView的背景。
如果您在onDraw中设置了一个背景,然后在onDraw之外的某个地方绘图到画布上,它将调用onDraw并在刚刚绘制的任何内容上绘制背景。
每次重新绘制背景不会占用大量内存,前提是您没有尝试在UI线程上这样做。
另外,我不太清楚你所说的“左上角2-3dp被删除”和“左上角空空间”是什么意思。你能把这张照片和你试过的代码一起贴出来吗?
https://stackoverflow.com/questions/24638355
复制相似问题