Java 在画布上绘画

Java 在画布上绘画,java,android,android-canvas,surfaceview,Java,Android,Android Canvas,Surfaceview,我有以下情况: 我有一个24端口的交换机。我想把它们画在画布上。我设法做到了这一点,但问题是,当我改变一个端口的状态时,我必须再次绘制它们,但它没有发生。 以下是我的课程: 端口模板: public class PortTemplate{ private Rect port = new Rect(); private PointerCoords insertPoint=new PointerCoords(); private float xCoord; private float yCoord

我有以下情况:

我有一个24端口的交换机。我想把它们画在画布上。我设法做到了这一点,但问题是,当我改变一个端口的状态时,我必须再次绘制它们,但它没有发生。 以下是我的课程:

端口模板:

public class PortTemplate{

private Rect port = new Rect();
private PointerCoords insertPoint=new PointerCoords();
private float xCoord;
private float yCoord;
private float gap;

...

//DRAWING PORT
public Rect drawPort(){
    port.set((int)insertPoint.x, (int)insertPoint.y, (int)insertPoint.x+portWidth, (int)insertPoint.y+portHeight);
    return port;
}
//**********
...
//setters and getters
主要活动

public class MainActivity extends Activity  implements OnClickListener{
Rect rec = new Rect();
int numberPorts=24;
PortTemplate[] recs=new PortTemplate[numberPorts];
PortTemplate[] newRecs=new PortTemplate[numberPorts];
Canvas canvas;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    port = (TextView) findViewById(R.id.port);

    mSelect = (Button) findViewById(R.id.select);
    mOptions = (Button) findViewById(R.id.option);

    mSelect.setOnClickListener(this);
    mOptions.setOnClickListener(this);

    surface= (SurfaceView) findViewById(R.id.surface);
    surface.setBackgroundColor(Color.TRANSPARENT);
    surface.getHolder().addCallback(new Callback() {

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            // Do some drawing when surface is ready

            PointerCoords insertRec=new PointerCoords();
            float x = insertRec.x=36;
            float y = insertRec.y=22;
            for(int i=0; i<numberPorts; i++)
            {
                recs[i]=new PortTemplate();
                recs[i].setInsertPoint(x,y);
                recs[i].setPortHeight(21);
                recs[i].setPortWidth(23);
                recs[i].setPortNumber(i+1);

                newRecs[i]=new PortTemplate();
                newRecs[i].setInsertPoint(x,y);
                newRecs[i].setPortHeight(21);
                newRecs[i].setPortWidth(23);
                newRecs[i].setPortNumber(i+1);

                x+=26.3;
            }

            Bitmap eqImage = BitmapFactory.decodeResource(getResources(), R.drawable.ports);
            Bitmap newImage = Bitmap.createScaledBitmap(eqImage, 700, 60, true);    
            canvas = holder.lockCanvas();
            canvas.drawBitmap(newImage, new Matrix(), null);
            EquipmentTemplate newEqup = new EquipmentTemplate();
            newEqup.setHeight(200);
            newEqup.setWidth(650);
            newEqup.setxCoord(0);
            newEqup.setyCoord(0);

            for(int i=0; i<numberPorts; i++)
            {
                canvas.drawRect(recs[i].drawPort(), recs[i].getPaint());
            }

            canvas.drawColor(Color.TRANSPARENT);
            holder.unlockCanvasAndPost(canvas);
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        }
    });


}
...
public类MainActivity扩展活动实现OnClickListener{
Rect rec=新的Rect();
整数端口=24;
PortTemplate[]recs=新端口模板[numberPorts];
PortTemplate[]newRecs=新PortTemplate[numberport];
帆布;
...
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
端口=(TextView)findViewById(R.id.port);
mSelect=(按钮)findviewbyd(R.id.select);
mOptions=(按钮)findViewById(R.id.option);
mSelect.setOnClickListener(此);
mOptions.setOnClickListener(this);
表面=(表面视图)findViewById(R.id.surface);
表面.背景颜色(颜色.透明);
surface.getHolder().addCallback(新的回调(){
@凌驾
已创建的公共空白表面(表面持有人){
//当表面准备好后,做一些绘图
PointerCoords insertRec=新的PointerCoords();
float x=insertRec.x=36;
浮动y=insertRec.y=22;
对于(inti=0;i一些事情

  • 您正在
    surfaceCreated
    中绘制图形,该方法仅在首次创建曲面时调用,因此以后不会调用此方法
  • 在您的情况下,您应该真正创建一个自定义的
    视图
    。只需扩展
    视图
    ,然后在
    onDraw
    中进行绘图。您还可以访问
    invalidate()
    等方法,这些方法将重新绘制
    视图
  • private void selectPortDialog()
    {
        String[] portsWithNumbers = new String[numberPorts];
    
        for(int i=0; i<numberPorts; i++)
        {
            portsWithNumbers[i]="Port: "+recs[i].getPortNumber();
        }
    
    
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        dialogBuilder.setTitle("Select Port");
        dialogBuilder.setSingleChoiceItems(portsWithNumbers, -1, new DialogInterface.OnClickListener() {
    
            @Override
            public void onClick(DialogInterface dialog, int which) {
                selected = recs[which].getPortNumber();
    
            }
        });
        dialogBuilder.setPositiveButton("Select", new DialogInterface.OnClickListener() {
    
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "Selected port: "+selected, Toast.LENGTH_LONG).show();
                port.setText("Port "+selected);
            }
        });
        AlertDialog alertDialog = dialogBuilder.create();
        alertDialog.show();
    
    }
    
    
    
    private void selectOptions()
    {
        final String[] options = new String[3];
    
        if(recs[selected-1].isConnected()==false && recs[selected-1].getReserved()==false && recs[selected-1].getDefect()==false)
        {
            options[0]="Connect";
            options[1]="Reserve";
            options[2]="Defect";
    
            AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
            dialogBuilder.setTitle("Action");
            dialogBuilder.setSingleChoiceItems(options, -1, new DialogInterface.OnClickListener() {
    
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    if(which==0)
                    {
                        newRecs[selected-1].setConnected(true);
                        refresh();
                    }
    
                }
            });
            AlertDialog alertDialog = dialogBuilder.create();
            alertDialog.show();
    
        }
    }
    
    public void refresh()
    {
        surface.getHolder().addCallback(new Callback() {
    
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                // Do some drawing when surface is ready
    
                canvas = holder.lockCanvas();
    
                for(int i=0; i<numberPorts; i++)
                {
                    canvas.drawRect(newRecs[i].drawPort(), newRecs[i].getPaint());
                }
    
                canvas.drawColor(Color.TRANSPARENT);
                holder.unlockCanvasAndPost(canvas);
            }
    
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
            }
    
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }
        });
    
    }