2011-08-21 103 views
0

在我的應用程序中,當用戶觸摸屏幕時,繪製一個圓,並且如果圓點已經在點a處繪製,則不能在那裏繪製另一個圓。畫圓不準確

當我使用canvas.drawCircle(...)時,它是無情的。如果我點擊靠近屏幕的頂部,那麼它只是非常細微地丟失了我輕敲它的位置(稍微向左或向右)。我越走越遠離我的圈子就是我觸摸的地方。如果我觸摸屏幕的左側,則該圓圈會進入觸摸點的右側,如果我觸摸屏幕的右側,則該圓圈位於左側。

這裏是我的代碼:

public void onCreate(...){ 
    super.onCreate(); 
    setcontentView(...); 
    drawnX = new ArrayList<Float>(); 
    drawnY = new ArrayList<Float>(); 

    layout = (ImageView)findViewById(R.id.layout); 

    layout.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View view, MotionEvent me) { 
      newY = me.getY(); 
      newX = me.getX(); 
      int action = me.getAction(); 

      if (action==0){ 
       Log.v(tag, "New Touch"); 
       Log.i(tag, String.valueOf("Action " + action + 
         " happened at X,Y: " + "("+newX+","+newY + ")")); 
       getDistance(newX, newY); 
      } 
      return true; 
     } 
    }); 
@Override 
public void onResume(){ 
    super.onResume(); 
    display = getWindowManager().getDefaultDisplay(); 
    screenHeight = display.getHeight(); 
    screenWidth = display.getWidth(); 

    bitmap = Bitmap.createBitmap(screenWidth, screenHeight, Bitmap.Config.ARGB_8888); 
    canvas = new Canvas(bitmap); 
    paint = new Paint(); 
    circleRadius = screenHeight/50; 
} 
public void getDistance(float xNew, float yNew){ 
    // here I compare the new touch x and y values with the x and y values saved 
    // in the Array Lists I made above. If distance is > circleRadius, then: 
drawPoint(xNew, yNew) 
} 
public void drawPoint(final float x, final float y){ 
    minDistance = Float.NaN; 


    new Thread(new Runnable(){ 
     @Override 
     public void run(){ 
      paint.setColor(Color.RED); 
      canvas.drawCircle(x, y, circleRadius, paint); 
      layout.post(new Runnable(){ 
       @Override 
       public void run(){ 
        layout.setImageDrawable(new BitmapDrawable(bitmap)); 
//I have also tried setImageBitmap and setBackgroundDrawable 
       } 
      }); 
     } 
    }).start(); 


} 

詮釋了這一切的過程中,我也做了一些記錄在drawPoint,它表明了x和y座標匹配這是在onTouch得到。

我也試過maknig它LinearLayout,但是有相同的效果。

而且,位圖大小與屏幕大小和畫布大小相匹配。同時,爲了測試我做

canvas.drawARGB(...) 

,它覆蓋了整個屏幕,所以我知道這不只是位圖沒有被拉伸到了谷底。佈局的高度小於其他所有的高度,並且佈局的寬度與所有其他佈局相同,但是當我在我的onResume中使用layout.getHeight和layout.getWidth時,它們總是返回0,所以我不能真的使用它。

我真的不知道是什麼原因造成的。我也嘗試了兩個模擬器並得到了相同的響應。任何幫助將不勝感激。另外,如果我點擊繪製的圓圈(朝向屏幕底部),另一個圓圈將被繪製在該圓圈上方,但是如果我點擊之前拍攝的地方,則不會繪製新的圓圈,這真的是想要發生的事情。該圓圈只是沒有正確顯示在屏幕上。

+0

當我固定screenHeight和screenWidth實際上是layout.getHeight()和layout.getWidth()時,解決了這個問題。我不得不將它包裝在新的處理程序()中。儘管如此,postDelayed(runnable,5000)爲它們返回一個值。在8小時的發佈時限結束後,我會發布完整的答案 – Jakar

回答

0

我找到了答案。很奇怪的是,即使位圖的寬度與佈局的寬度相匹配,但當我做了更多的測試時,我發現這些尺寸實際上並沒有在左右兩個方向上一起組合。

我沒有使用layout.getWidth()和layout.getHeight(),由於它的onResume()

返回0,但是,我想從display.getHeight(不同高度)很可能也是會引起問題,所以我也基本上是:

new Handler().postDelayed(getLayoutSizeRunnable, 5000); 

其中getLayoutSizeRunnable基本上是:

screenWidth = layout.getWidth(); 
screenHeight = layout.getHeight(); 

然後一切都工作正常。

對於在我的應用程序中的使用,我將使用if語句,因此第一次創建接觸點時,會計算佈局大小,並根據它創建位圖。