Draw Circle является неточным - PullRequest
       24

Draw Circle является неточным

0 голосов
/ 22 августа 2011

В моем приложении, когда пользователь касается экрана, рисуется круг, и если круг уже нарисован в точке a, тогда другой круг не может быть нарисован там.

, когда я использую холст.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(...)

, и он охватил весь экран, так что я знаю, что это не просто растровое изображение не растягивается на дно.Высота макета меньше, чем высота всего остального, а ширина макета такая же, как и у всех остальных, но когда я использую layout.getHeight и layout.getWidth в моем onResume, они всегда возвращают 0, поэтому я не могудействительно используйте это.

Я действительно понятия не имею, что это вызывает.Я также попробовал это на двух эмуляторах и получил тот же самый ответ.Любая помощь будет принята с благодарностью.

Кроме того, если я коснусь нарисованного круга (ближе к нижней части экрана), то над ним будет нарисован еще один круг, но если я коснусь того места, где ранее нажал,тогда новый круг не будет нарисован, что на самом деле и должно быть.круг просто не отображается на экране правильно.

1 Ответ

0 голосов
/ 23 августа 2011

Я нашел ответ.

Как ни странно, даже несмотря на то, что ширина растрового изображения соответствовала ширине макета, когда я провел еще немного испытаний, я обнаружил, что размеры на самом деле не совпадают ни слева, ни справа.

Я не использовал layout.getWidth () и layout.getHeight (), потому что он возвращает 0 в onResume ()

Но я думал, что высота, отличная от display.getHeight (), вполне может быть причиной проблемы, поэтому я сделал по существу:

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

где getLayoutSizeRunnable было по существу:

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

Тогда все работало отлично.

А для использования в моем приложении я буду использовать оператор if, чтобы при первом создании точки касания вычислялся размер макета и на его основе создавалось растровое изображение.

...