如何让 View.invalidate 在 Click Listener 中工作

Posted

技术标签:

【中文标题】如何让 View.invalidate 在 Click Listener 中工作【英文标题】:How to get View.invalidate working within Click Listener 【发布时间】:2019-07-11 05:33:35 【问题描述】:

我想在 ClickListener 的 for 循环中多次重绘 customview。但是,视图仅在 ClickListener 代码完成时刷新一次,而不是在 for 循环内。

这里是相关代码sn-p

        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();
                
            
        
    );

这里是customview(TouchEventView)的onDraw方法

    @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);
        
    

除了在 ClickListener 进程结束时,vw.invalidate() 和 vw.postInvalidate() 都不起作用。

如何在 for 循环中强制重绘屏幕?

【问题讨论】:

【参考方案1】:

到目前为止,我发现的唯一解决方案是将 customview.postInvalidate() 作为可运行对象嵌入到单独的线程中。

【讨论】:

以上是关于如何让 View.invalidate 在 Click Listener 中工作的主要内容,如果未能解决你的问题,请参考以下文章

即使在 cli 上间接指定了多次,如何让 sbt 只运行一次任务?

如何让mysql自动启动? (仅限 linux-cli)

在 Android 上的 onDraw 之外更新视图的画布

如何让 .NET CLI 知道哪个连接用于上下文?

vue-cli 里如何让线上地址适配线下测试

如何让 Vue (vue cli 3) 正确处理 GraphQL 文件?