Java 在画布上绘画
我有以下情况: 我有一个24端口的交换机。我想把它们画在画布上。我设法做到了这一点,但问题是,当我改变一个端口的状态时,我必须再次绘制它们,但它没有发生。 以下是我的课程: 端口模板: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
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) {
}
});
}