Сохранение изображения, которое было нарисовано на растровом изображении с помощью onTouchEvent - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь коснуться области моего приложения, чтобы разместить на экране вентили AND. Поэтому, когда я касаюсь области ворот И, а затем снова касаюсь, чтобы разместить ее на схеме, ворота притягиваются в месте моего касания, но как только я снова касаюсь, они исчезают.

я создал схему статически, используя canvas.drawBitmap, и они появляются там и остаются. Это означает, что я создал тонну изображений canvas.drawBitmap, которые остаются на экране ..

@Override
    public boolean onTouchEvent(MotionEvent motionEvent) {
        Log.d("Debugging", "In onTouchEvent");

        if((motionEvent.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP) {


            placeComponent();
            Touch.horizontalTouched = (int)motionEvent.getX()/ grid.getBlockSize();
            Touch.verticalTouched = (int)motionEvent.getY()/ grid.getBlockSize();
        }

        draw();
        return true;
    }

    void placeComponent(){
        Log.d("Debugging", "In placeComponent");

        // Convert the float screen coordinates
        // into int grid coordinates
        touchTemp = whatWasTouched(Touch.horizontalTouched, Touch.verticalTouched);
    }

    private void regionHit() {
        Bitmap _andTest = BitmapFactory.decodeResource(getResources(), R.drawable.andgatetrans);

        if(touchTemp.equals("AND")){
            canvas.drawBitmap(_andTest,Touch.horizontalTouched*grid.getBlockSize(),Touch.verticalTouched*grid.getBlockSize(),null);
            //drawIcons.drawANDGatev2(canvas,Touch.horizontalTouched*grid.getBlockSize(),Touch.verticalTouched*grid.getBlockSize());
        }
        if(touchTemp.equals("OR")){
        }
        if(touchTemp.equals("NOT")){
        }
        if(touchTemp.equals("SWITCH")){
        }

    }
    // used to tell regionHit() what to do
    private String whatWasTouched(float horizontalTouched, float verticalTouched) {
        if(horizontalTouched >= 5.0 && horizontalTouched <= 9.0){
            if(verticalTouched >= 0.0 && verticalTouched <=4.0){
                return "AND";
            }
        }
        if(horizontalTouched >= 5.0 && horizontalTouched <= 9.0){
            if(verticalTouched >= 5.0 && verticalTouched <=9.0){
                return "OR";
            }
        }
        if(horizontalTouched >= 5.0 && horizontalTouched <= 9.0){
            if(verticalTouched >= 10.0 && verticalTouched <=14.0){
                return "NOT";
            }
        }
        if(horizontalTouched >= 5.0 && horizontalTouched <= 9.0){
            if(verticalTouched >= 15.0 && verticalTouched <=19.0){
                return "SWITCH";
            }
        }
        if(horizontalTouched >= 0.0 && horizontalTouched <= 4.0){
            if(verticalTouched >= 0.0 && verticalTouched <=4.0){
                return "Play/Pause";
            }
        }
        if(horizontalTouched >= 0.0 && horizontalTouched <= 4.0){
            if(verticalTouched >= 5.0 && verticalTouched <=9.0){
                return "EDIT";
            }
        }
        if(horizontalTouched >= 0.0 && horizontalTouched <= 4.0){
            if(verticalTouched >= 10.0 && verticalTouched <=14.0){
                return "WIRE";
            }
        }
        if(horizontalTouched >= 0.0 && horizontalTouched <= 4.0){
            if(verticalTouched >= 15.0 && verticalTouched <=19.0){
                return "LED";
            }
        }

        return "-1";
    }

Примечание: regionTouched () вызывается в draw () над onTouchEvent (). Я ожидаю, что смогу коснутьсяобласть моего одноэкранного приложения, в которой указаны ворота «И», а затем коснитесь еще раз, чтобы поместить его на пустую часть холста и оставить его там, а также назначить его положение на холсте, на котором он был размещен. Но все, что он делает, помещается и удаляется, как только я снова касаюсь экрана.

1 Ответ

1 голос
/ 09 октября 2019

Хорошо, значит, ваш вентиль 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...