Хорошо, значит, ваш вентиль AND выбран с помощью метода whatWasTouched () и помещен в пустую часть холста, после повторения ваш вентиль AND исчезнет, и вы хотите, чтобы он оставался на своей позиции? Для этого вам нужно где-то сохранить положение логического элемента AND.
В вашем методе regionHit () вы рисуете битовый массив логического элемента AND.
canvas.drawBitmap(_andTest,Touch.horizontalTouched*grid.getBlockSize(),Touch.verticalTouched*grid.getBlockSize(),null);
Затем при следующем событии касания ваш whatWasTouched ()может не вернуть AND gate, а также ваш класс Touch будет иметь обновленные значения точек касания. Вот почему вы не видите И ворота в следующем касании.
Так что вам нужно сохранить выбранные ворота, а также их положение на холсте.
Создать класс Gate
public class Gate {
private Bitmap bitmap;
private int drawX;
private int drawY;
public Gate(Bitmap bitmap, int drawX, int drawY) {
this.bitmap = bitmap;
this.drawX = drawX;
this.drawY = drawY;
}
public void draw(Canvas c) {
c.drawBitmap(bitmap, drawX, drawY, null);
}
public void updateDrawPosition(int drawX, int drawY) {
this.drawX = drawX;
this.drawY = drawY;
}
}
И используйте выше класс по вашему мнению, как это
public class GatesView extends View {
private ArrayList<Gate> gates;
private Bitmap andGateBitmap;
public GatesView(Context context) {
super(context);
// bitmap should be decoded here
andGateBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.andgatetrans);
final int initialCapacity = 5;
gates = new ArrayList<>(initialCapacity);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// draw all saved gates in the list.
final int listSize = gates.size();
for (int i = 0; i < listSize; i++)
gates.get(i).draw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// when a new gate is selected add it to gatesList
gates.add(new Gate(andGateBitmap, initial Xpos to draw, initial Ypos to draw)); // bitmap should not be decoded from Resource in onDraw() or onTouchEvent().
invalidate(); // tell android that our view has updated and needs to be redrawn.
return true;
}
}