绘制圆是不准确的

时间:2011-08-21 22:54:00

标签: android bitmap drawable

在我的应用中,当用户触摸屏幕时,会绘制一个圆圈,如果已经在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中获得的坐标相匹配。

我也尝试过将它变成一个LinearLayout,但效果相同。

并且,位图大小与屏幕大小和画布大小相匹配。另外,我做了测试

canvas.drawARGB(...)

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

我真的不知道造成它的原因。我也在两个模拟器上尝试了它并得到了相同的响应。任何帮助将不胜感激。

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

1 个答案:

答案 0 :(得分:0)

我找到了答案。

奇怪的是,即使位图的宽度与布局的宽度相匹配,当我进行更多的测试时,我发现尺寸实际上并不是左右两侧合在一起。

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

中返回0

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

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

其中getLayoutSizeRunnable基本上是:

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

然后一切都很完美。

对于我的应用程序中的用法,我将使用if语句,因此第一次制作触摸点时,将计算布局大小,并根据它创建位图。