Android 画圆不准确

Android 画圆不准确,android,bitmap,drawable,Android,Bitmap,Drawable,在我的应用程序中,当用户触摸屏幕时,会绘制一个圆,如果已经在a点绘制了一个圆,则无法在该点绘制另一个圆 当我使用canvas.drawCircle(…)时,它是不准确的。如果我点击靠近屏幕顶部的位置,那么我点击的位置(稍微向左或向右)就会非常微小地丢失。我走得越远,我的圆圈离我接触的地方就越远。如果我触摸屏幕的左侧,圆圈就在触摸点的右侧,如果我触摸屏幕的右侧,圆圈就在左侧 这是我的密码: public void onCreate(...){ super.onCreate(); set

在我的应用程序中,当用户触摸屏幕时,会绘制一个圆,如果已经在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();


}
它覆盖了整个屏幕,所以我知道不仅仅是位图没有延伸到底部。版面的高度小于其他所有内容的高度,版面的宽度与其他内容相同,但当我在onResume中使用layout.getHeight和layout.getWidth时,它们总是返回0,因此我无法真正使用它

我真的不知道是什么引起的。我也在两个模拟器上试过,得到了相同的响应。任何帮助都将不胜感激

此外,如果我点击绘制的圆圈(朝向屏幕底部),则会在该圆圈上方绘制另一个圆圈,但如果我点击之前点击的位置,则不会绘制新的圆圈,这确实是应该发生的。圆圈没有正确显示在屏幕上。

我找到了答案

奇怪的是,尽管位图的宽度与布局的宽度相匹配,但当我进行更多的测试时,我发现尺寸在左右两侧实际上也不匹配

我没有使用layout.getWidth()和layout.getHeight(),因为它在onResume()中返回0

但是,我认为与display.getHeight()不同的高度很可能是导致问题的原因,所以我基本上做到了:

new Handler().postDelayed(getLayoutSizeRunnable, 5000);
其中getLayoutSizeRunnable本质上是:

screenWidth = layout.getWidth();
screenHeight = layout.getHeight();
然后一切都很顺利


对于我的应用程序中的使用,我将使用if语句,这样第一次创建触摸点时,将计算布局大小,并基于它创建位图。

当我将屏幕高度和屏幕宽度固定为layout.getHeight()和layout.getWidth()时,解决了问题。不过,我必须用new handler().postDelayed(runnable,5000)来为它们返回一个值。我会在8小时的发布时间过后发布完整答案
screenWidth = layout.getWidth();
screenHeight = layout.getHeight();