Как заставить View.invalidate работать в Click Listener - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу перерисовать пользовательское представление несколько раз в цикле for в ClickListener.Однако представление обновляется только один раз после завершения кода ClickListener, а не в цикле for.

Вот соответствующий фрагмент кода

        vw = (TouchEventView)findViewById(R.id.TouchEventView);

    clear = (Button)findViewById(R.id.button2);
    clear.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            coords = TouchEventView.getFloats(TouchEventView.points);
            if (coords.length < 4) {
                Toast.makeText(MainActivity.this,"You must have at least one line",Toast.LENGTH_LONG).show();
            }
            else if ( coords.length < 6) {
                SendData(length(coords[0],coords[1],coords[2],coords[3]));
                SendData("s");
            }
            else {
                for (int i = 0; i<coords.length-4; i=i+4) {
                    SendData(length(coords[i],coords[i+1],coords[i+2],coords[i+3]));
                    SendData(turn(coords[i],coords[i+1],coords[i+2],coords[i+3],coords[i+6],coords[i+7]));
                }
                int i = coords.length-4;
                SendData(length(coords[i],coords[i+1],coords[i+2],coords[i+3]));
                SendData("s");

         //  Now do the overlay

                TouchEventView.retrace = true;
                reords = new float[coords.length];

                for (int j=0; j<coords.length-1; j=j+4) {
                    try {
                        Thread.sleep(1000);
                    }
                    catch (Exception e) {
                    }
    //              Log.e("pitrack","i : " + j);
                    TouchEventView.leg = j;

                    vw.postInvalidate();
                }
            }
        }
    });

, а вот метод onDraw объектаcustomview (TouchEventView)

    @Override
protected void onDraw(Canvas canvas) {
    if (retrace) {
        canvas.drawLines(MainActivity.coords,paintRed);
        canvas.drawLine(MainActivity.coords[leg],MainActivity.coords[leg+1],MainActivity.coords[leg+2],MainActivity.coords[leg+3],paintGreen);
    }
    else {
        if (points.size() > 3) {
            canvas.drawLines(getFloats(points),paintRed);
        }
        if (x > -1) {
            canvas.drawLine(x, y, x1, y1, paintRed);
            canvas.drawBitmap(finish,x1-96,y1-96,paintRed);
            canvas.drawBitmap(start,startx-48,starty-48,paintRed);
        }
    }
}

Ни vw.invalidate (), ни vw.postInvalidate () не работают, кроме как в конце процесса ClickListener.

Как принудительно перерисоватьэкран в цикле?

1 Ответ

0 голосов
/ 18 февраля 2019

Единственное решение, которое я нашел до сих пор, - это встраивание customview.postInvalidate () как исполняемого файла в отдельный поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...