我试图创建一个简单的应用程序,在触摸屏幕的地方绘制一个 png 图形。我遇到的问题是,实际上只有我添加的图形的所有其他实例才会被渲染。每次我添加一个新实例时,模式都会交替出现。我总是只得到 50% 的图形渲染。
我在 HTC Hero 上使用 android level 3。
为了进一步解释这个问题,这是我从表面保持器回调中调用的绘制方法:
public void surfaceCreated(SurfaceHolder holder) {
drawOK = true;
drawIcon(100.0f, 100.0f);//line-1
drawIcon(50.0f, 100.0f);//line-2
drawIcon(100.0f, 50.0f);//line-3
drawIcon(50.0f, 50.0f);//line-4
//drawIcon(200.0f, 200.0f);//line-5
//drawIcon(100.0f, 200.0f);//line-6
}
当我将第 5 行和第 6 行注释掉时(如图所示),我只看到第 2 行和第 4 行渲染。当我添加第 5 行时,我看到第 1,3 和 5 行渲染。最后,当我添加第 6 行时,我看到第 2,4 和 6 行渲染。
为什么会这样?
更详细地解释应用程序的其余部分。我有以下布局xml:
<SurfaceView android:id="@+id/SurfaceView01" android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"/>
即我有一个单一的表面视图,我将在其上绘制 png 图形。
我的活动实现了 SurfaceHolder.Callback 并像这样初始化:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);
// register our interest in hearing about changes to our surface
holder = surfaceView.getHolder();
holder.addCallback(this);
}
即我链接调用,并使用 R 类设置内容视图。然后我获得对表面视图的引用并将活动注册为表面持有者回调。
我有一种将图标绘制到屏幕上的方法。就是这个:
private void drawIcon(float x, float y) {
if (!drawOK) return;
Canvas canvas = holder.lockCanvas();
// getting instance each time in case problem is related to reusing obj
mFiringImage = getResources().getDrawable(R.drawable.icon);
//so i can see overlapping icons, to rule out clipping issues
mFiringImage.setAlpha(125);
// This mutate call is incase the bounds are shared state, which i doubt
mFiringImage.mutate().setBounds(
(int)x-mFiringImage.getIntrinsicWidth()/2,
(int)y-mFiringImage.getIntrinsicHeight()/2,
(int)x+mFiringImage.getIntrinsicWidth()/2,
(int)y+mFiringImage.getIntrinsicHeight()/2
);
mFiringImage.draw(canvas);
holder.unlockCanvasAndPost(canvas);
}
即我锁定画布,获取可绘制的 png 资源,设置边界(使用 mutate 以防万一),并要求可绘制在画布上绘制自身。请注意,除非已创建曲面,否则我从不绘制。
我真的很困惑这里。
所有帮助表示赞赏。
ps 以下是完整列表:
package com.mypackage;
import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class Toucher extends Activity implements SurfaceHolder.Callback {
private Drawable mFiringImage;
private SurfaceView surfaceView;
private boolean drawOK;
private SurfaceHolder holder;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);
// register our interest in hearing about changes to our surface
holder = surfaceView.getHolder();
holder.addCallback(this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
Log.e(getClass().getSimpleName(), "=========================");
Log.e(getClass().getSimpleName(), "Action="+event.getAction());
Log.e(getClass().getSimpleName(), "History Size="+event.getHistorySize());
Log.e(getClass().getSimpleName(), "Pressure="+event.getPressure());
Log.e(getClass().getSimpleName(), "Raw X="+event.getRawX());
Log.e(getClass().getSimpleName(), "Raw Y="+event.getRawY());
Log.e(getClass().getSimpleName(), "X="+x);
Log.e(getClass().getSimpleName(), "Y="+y);
Log.e(getClass().getSimpleName(), "Precision X="+event.getXPrecision());
Log.e(getClass().getSimpleName(), "Precision Y="+event.getYPrecision());
Log.e(getClass().getSimpleName(), "Size="+event.getSize());
Log.e(getClass().getSimpleName(), "=========================");
drawIcon(x, y);
return super.onTouchEvent(event);
}
private void drawIcon(float x, float y) {
if (!drawOK) return;
Canvas canvas = holder.lockCanvas();
mFiringImage = getResources().getDrawable(R.drawable.icon);
mFiringImage.setAlpha(125);
mFiringImage.mutate().setBounds(
(int)x-mFiringImage.getIntrinsicWidth()/2,
(int)y-mFiringImage.getIntrinsicHeight()/2,
(int)x+mFiringImage.getIntrinsicWidth()/2,
(int)y+mFiringImage.getIntrinsicHeight()/2
);
mFiringImage.draw(canvas);
holder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
drawOK = true;
drawIcon(100.0f, 100.0f);//1
drawIcon(50.0f, 100.0f);//2
drawIcon(100.0f, 50.0f);//3
drawIcon(50.0f, 50.0f);//4
//drawIcon(200.0f, 200.0f);//5
//drawIcon(100.0f, 200.0f);//6
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (!hasFocus) drawOK = false;
}
}