【问题标题】:Draw Circle is inaccurate画圈不准确
【发布时间】:2011-08-21 22:53:59
【问题描述】:

在我的应用中,当用户触摸屏幕时,会画一个圆,如果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,所以我不能真正使用它。

我真的不知道是什么原因造成的。我还在两个模拟器上尝试过,得到了相同的响应。任何帮助将不胜感激。

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

【问题讨论】:

  • 当我将 screenHeight 和 screenWidth 固定为实际上是 layout.getHeight() 和 layout.getWidth() 时,问题就解决了。不过,我必须将其包装在 new handler().postDelayed(runnable, 5000) 中才能为它们返回一个值。在 8 小时的发布时间框架过后,我将发布完整的答案

标签: android bitmap drawable


【解决方案1】:

我找到了答案。

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

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

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

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

getLayoutSizeRunnable 的本质是:

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

然后一切都很顺利。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多