2015-05-17 138 views
0

我在課堂上練習時遇到了一些問題。練習是在畫布上多次繪製形狀。但是我只能繪製一次,當我繪製另一個時,前一個被刪除。這是我的CustomView代碼。 figuras是一種形狀的LinkedList,將來我會拯救它們。在抽獎時,我將從LinkedList中抽取數字。在畫布上多次繪製

package com.example.AndroidTest;

import android.content.Context; 
    import android.graphics.Canvas; 
    import android.graphics.Color; 
    import android.graphics.Paint; 
    import android.graphics.Paint.Style; 
    import android.text.TextUtils; 
    import android.view.MotionEvent; 
    import android.view.View; 
    import android.widget.Toast; 

    import java.util.LinkedList; 

公共類CustomView擴展視圖{

private final Paint brush; 
private LinkedList<Figures> figuras; 
public int id; 
private float startX; 
private float endX; 
private float startY; 
private float endY; 
Figures fig; // á partida é para mudar para o createFigure 
public CustomView(Context context, LinkedList <Figures> figures) 
{ 
    super(context); 
    brush = new Paint(); 
    brush.setStyle(Style.STROKE); 
    brush.setColor(Color.WHITE); 
    brush.setStrokeWidth(6); 
    figuras = figures; 
} 

@Override 
protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 


     createFigure(startX, startY, endX, endY); 
     fig.drawFigure(canvas, brush); 
     invalidate(); 

} 

public String getString(){ 
    String joined = TextUtils.join("\n\n", figuras); return joined; 
} // criar uma string a copiar o conteudo duma list com o intervalo de uma virgula. 


@Override 
public boolean onTouchEvent(MotionEvent event) { 

    if (event.getAction() == event.ACTION_DOWN) { 
     startY = event.getY(); 
     startX = event.getX(); 
     endY = event.getY(); 
     endX = event.getX(); 
     figuras.add(fig); 
     Toast.makeText(getContext(), "" + figuras.size(), Toast.LENGTH_SHORT).show(); 

    } else if (event.getAction() == event.ACTION_MOVE) { 
     endY = event.getY(); 
     endX = event.getX(); 
     figuras.getLast().setEndVars(endX, endY); 

    } 
    return super.onTouchEvent(event); 
} 

public void createFigure(float startX, float startY, float endX, float endY) { 


    switch (id) // aqui crio a figura Fig fig = new line/circle/rect 
    { 
     case 0: 
      fig = new Line(startX, startY, endX, endY); 
      break; 
     case 1: 
      fig = new Circle(startX, startY, endX, endY); 
      break; 
     case 2: 
      fig = new Rectangle(startX, startY, endX, endY); 
      break; 
    } 
    //return fig; 
} 

public void setID(int aux) 
{ 
    id = aux; 
} 

public LinkedList<Figures> getArray() 
{ 
    return figuras; 
} 

}

回答

0

後您調用已畫將被刪除,的onDraw將會再次調用invalidate一切。目前,您正在繪製一個無限循環,每次繪製一個具有startY,startX,endY和endX變量當前值的圖形,然後使您繪製的內容失效。如果這些變量發生了變化,舊的數字將不會再被繪製。

爲了繪製新圖形以及所有舊圖形,每次調用onDraw時,必須遍歷figuras並再次繪製每個圖形。那麼你應該看到所有數字都添加到figuras,因此你想繪製的所有數字。像這樣:

protected void onDraw(Canvas canvas) 
{ 
    super.onDraw(canvas); 
    for(Figures f : figuras) { 
     f.drawFigure(canvas, brush); 
    } 
} 

對性能有兩個更多的概念。您應在onTouchEvent中撥打invalidate,而不要撥打onDraw。這將節省大量的計算能力。目前我敢打賭,你可以使用手機作爲暖手。 你也應該在onTouchEvent中創建圖。在onDraw只做什麼是必要的。其他一切應該在onDraw以外。