2011-08-21 46 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语句,因此第一次创建接触点时,会计算布局大小,并根据它创建位图。