Bitmap.getPixel в SurfaceView
У меня есть этот код, где есть Backgroung под рукой, оба растровые изображения. Теперь я должен контролировать методом onClick, касается ли щелчок руки или нет. Для этого я написал здесь, и некоторые ребята говорят мне использовать метод под названием "bitmap.getPixel(int x, int y)
"Это дает цвет точки касания. Для контроля, если щелчок не касается руки, я пишу"bitmap.getPixel(x, y)
!= Color.TRASPARENT"
, но не работает идеально. Под этим я пишу код SurfaceView.
PS Растровое изображение "Рука" - это изображение центральной Руки с прозрачными частями вокруг.
public class GamePanel extends SurfaceView implements SurfaceHolder.Callback{
private long missileStartTime;
private ThreadLv1 thread;
private OggettiLv1 hand;
private int conto=0;
private Sfondo sfondo;
MediaPlayer ouch;
public GamePanel(Context context){
super(context);
getHolder().addCallback(this);
thread = new ThreadLv1(getHolder(), this);
setFocusable(true);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){}
@Override
public void surfaceDestroyed(SurfaceHolder holder){
boolean retry = true;
while(retry)
{
try{thread.setRunning(false);
thread.join();
}catch(InterruptedException e){e.printStackTrace();}
retry = false;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder){
hand = new OggettiLv1(BitmapFactory.decodeResource(getResources(), R.drawable.mano5));
sfondo = new Sfondo(BitmapFactory.decodeResource(getResources(), R.drawable.sfondo));
ouch= MediaPlayer.create(getContext(), R.raw.ouch);
knifesong.start();
thread.setRunning(true);
thread.start();
}
public void update() {
}
@Override
public void draw(Canvas canvas)
{
if(canvas!=null) {
final int savedState = canvas.save();
background.draw(canvas);
hand.draw(canvas);
drawText(canvas);
canvas.restoreToCount(savedState);
}
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
float x = event.getX();
float y = event.getY();
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
int c = hand.sprite.getPixel((int) event.getX(), (int) event.getY());
if(c!=Color.TRANSPARENT){
conto++;
}
return true;
}
return false;
}
}
Кто-то знает проблему и решение в этом коде? Заранее спасибо.
1 ответ
Я думаю, что это может быть проблемой:
int c = hand.sprite.getPixel((int) event.getX(), (int) event.getY());
Я думаю, что вы получаете значение пикселя в точке x, y на спрайте, вы должны получить значение пикселя на холсте.
РЕДАКТИРОВАТЬ:
Поскольку ваш холст статический, я предлагаю сделать следующее: добавить растровое изображение в ваш класс
private Bitmap canvasState;
В функции рисования, инициализируйте canvasState, прежде чем что-либо еще
canvasState = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.RGB_565));
canvas.setBitmap(canvasState);
после этого каждое изменение, которое вы вносите в canvas, будет выполнено в canvasState, и вы можете использовать это в своем обработчике событий следующим образом:
int c = canvasState.getPixel((int) event.getX(), (int) event.getY());
Я не уверен, что код, который я написал, скомпилируется (я написал их с головы до ног), но я думаю, что вы можете решить ошибки компиляции самостоятельно.