2012-08-09 62 views
0

我想問題很簡單。繪圖到畫布 - 沒有繪製其他項目

我想盡快畫一個點到畫布上。點將被繪製到我觸摸的位置。接下來,我想在屏幕上繪製另一個點,但不是第一個點的位置。意思是我想阻止在另一幅圖像上繪製圖像。

我試圖archieve與下面的代碼:

活動課

public class Draw extends Activity { 
    DrawView drawView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Set full screen view 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
             WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     drawView = new DrawView(this); 
     setContentView(drawView); 
     drawView.requestFocus(); 
    } 
} 

Canvas類

public class DrawView extends View implements OnTouchListener { 
    private static final String TAG = "DrawView"; 

    List<Point> points = new ArrayList<Point>(); 
    Vector<Bitmap> bitmaps = new Vector<Bitmap>(); 
    Paint paint = new Paint(); 


    public DrawView(Context context) { 
     super(context); 
     setFocusable(true); 
     setFocusableInTouchMode(true); 

     this.setOnTouchListener(this); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.WHITE); 
     for (Point point : points) { 
      canvas.drawBitmap(bitmaps.get(point.i), point.x, point.y, paint); 
     } 
    } 

    public boolean onTouch(View view, MotionEvent event) { 
     Log.d("Touch","Touch"); 
     Log.d("Points", "" + points.size()); 
     Log.d("Bitmaps", "" + bitmaps.size()); 

     int i = 0; 
     for (Point point : points) { 
      int height = bitmaps.get(i).getHeight(); 
      int width = bitmaps.get(i).getWidth(); 
      //Log.d("dimensions", height + ", " + width); 

      for (int x = 0; x <= width; x++) { 
       if (Math.floor(point.x + x) == Math.floor(event.getX())) { 
        points.get(i).isTaken = true; 
        Log.d("isTakenX", "" + point.isTaken); 
        break; 
       } 
       for (int y = 0; y <= height; y++) { 
        if (Math.floor(point.y + y) == Math.floor(event.getY())) { 
         points.get(i).isTaken = true; 
         Log.d("isTakenY", "" + point.isTaken); 
         break; 
        } 
       } 
      } 
      i++; 
     } 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      Log.d("EventDown","DOWN"); 
      boolean isTaken = false; 
      for (Point point : points) { 
       if (point.isTaken) { 
        isTaken = true; 
       } 
      } 
      if (!isTaken) { 
       bitmaps.add(BitmapFactory.decodeResource(getResources(), R.drawable.greenstar)); 
       Point point = new Point(); 
       point.x = event.getX(); 
       point.y = event.getY(); 
       point.i = bitmaps.size() - 1; 
       points.add(point); 
       //Log.d("pointClick",point.toString()); 
       invalidate(); 
       return true; 
      } 
     } 
     return false ; 
    } 
} 

    class Point { 
     float x, y; 
     int i; 
     boolean isTaken = false; 

     @Override 
     public String toString() { 
      return i + ": " + x + ", " + y; 
     } 
    } 

在onTouch方法,你可以看到我是如何摸清我不想透支的圖像位置。我保存所有圖像,並將其繪製到列表中以便修改它們。接下來,我檢查圖像在屏幕上佔用了多少空間,以及是否只點擊了該空間。

但是,在第一張圖像畫到畫布上之後,我無法畫出另一張。似乎程序停留在「isTaken」。可能我的對數如何檢查空間是否是錯誤的。但是,無法弄清楚什麼是錯誤的。

你有想法嗎?

THanks預先

回答

1

好幾點。一個邏輯錯誤和幾個增強。 (代碼和想法)

首先:當您使用foreach構造時,可以使用循環(例如point)中的變量從正在循環的列表中訪問實例。所以用簡單的point來改變你的points.get(i)

第二:如果你有圈,你不必檢查點是否在矩形(我想這就是你想要實現的)。檢查兩點的中心距離(已繪製的和已繪製的新點的距離)是否足夠大。使用畢達哥拉斯方程(c^2 = a^2 * b^2)。

第三個(實際的錯誤): 你對兩個for循環的邏輯錯誤,你正在分別對待x和y,但你必須一起檢查它們。你不需要循環來實現你想要的。

for循環更改到:

if(Math.pow(radius*2,2) > Math.pow(event.getX-point.x,2)+Math.pow(event.getY-point.Y, 2)) 
     point.isTaken = true; 

凡半徑繪製圓的半徑。 試試看,如果遇到更多問題,請回報。

+0

嘿,感謝您的幫助。其實我會畫正方形(後來的方形圖像)到屏幕上,對不起,錯誤的信息。第一個建議:之前嘗試過,因爲另一個錯誤而導致異常,因此更改了它。第二個建議:謝謝,這也會幫助我與廣場!我應該檢查舊廣場和新廣場的左上邊框之間的距離。第三條建議:剛纔我自己發現了這個錯誤。不過,如果我只是測量舊廣場和新廣場之間的距離,不需要檢查。非常感謝你。 – JustBasti 2012-08-09 19:37:18

+0

np,如果出現更多問題,只需向SO彙報。 – RaphMclee 2012-08-09 20:31:34

+0

處理您的想法。謝謝!我認爲我的大腦今天已經陷入困境:/ – JustBasti 2012-08-09 21:02:42