2011-08-21 7 views
0

내 앱에서 사용자가 화면을 터치하면 원이 그려지고 점 a에서 원이 이미 그려진 경우 다른 원을 그릴 수 없습니다.원 그리기가 정확하지 않습니다.

canvas.drawCircle (...)을 사용할 때, 그것은 무적입니다. 화면의 꼭대기를 가볍게 두드리면, 왼쪽 또는 오른쪽으로 가볍게 두 드렸을 때 매우 미세하게 누락되었습니다. 멀리 떨어질수록 내 원은 내가 만진 곳에서 멀어집니다. 화면의 왼쪽을 터치하면 원이 터치 포인트의 오른쪽으로 이동하고 화면의 오른쪽을 터치하면 원이 왼쪽에 표시됩니다. 나는 또한 drawPoint 일부 로깅을,이 모든 과정 지능

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(); 


} 

, 그리고 x와 y 좌표가 onTouch에서 입수되는이 일치하는지 보여줍니다

여기 내 코드입니다.

또한 LinearLayout을 시도했지만 동일한 효과가있었습니다.

그리고 비트 맵 크기는 화면 크기와 캔버스 크기와 일치합니다. 또한, 테스트를 위해 나는

canvas.drawARGB(...) 

를하고는 화면 전체를 커버, 그래서 그것을 비트 맵이 바닥에 스트레칭되지 다만이지 않는다 알고있다. 레이아웃의 높이가 다른 모든 높이보다 작으며 레이아웃의 너비는 다른 모든 것과 같지만 내 onResume에서 layout.getHeight 및 layout.getWidth를 사용하면 항상 0을 반환하므로 정말로 그것을 사용합니다.

나는 그것을 실제로 일으키는 어떤 단서가 없습니다. 나는 또한 2 명의 에뮬레이터에서 시도해 보았고 같은 반응을 얻었다. 어떤 도움이라도 대단히 감사하겠습니다.

또한 그려진 원을 (화면 아래쪽으로) 탭하면 그 위에 다른 원이 그려지지만 이전에 두드린 곳을 탭하면 새 원이 그려지지 않습니다. 그것은 실제로 일어날 것입니다. 원이 화면에 올바르게 표시되지 않습니다.

+0

실제로 screenHeight 및 screenWidth를 layout.getHeight() 및 layout.getWidth()로 고정했을 때 문제가 해결되었습니다. 나는 새로운 핸들러()에서 그것을 감쌌다.postDelayed (runnable, 5000)를 사용하여 값을 리턴한다. 나는 8 시간 게시 시간 프레임이 지나면 완전한 대답을 게시 할 것이다. – Jakar

답변

0

답변을 찾았습니다.

이상하게도 비트 맵의 ​​너비가 레이아웃의 너비와 일치하더라도 조금 더 테스트했을 때 치수가 실제로 좌우로 맞지 않는 것을 발견했습니다.

나는 때문에 아주 잘 할 수있다)은 onResume()

을 0을 반환하지만, 내가 display.getHeight (에서 다른 높이 생각에 layout.getWidth()와 layout.getHeight()를 사용하지 않은 문제의 원인이 될, 그래서 나는 기본적으로했다 : getLayoutSizeRunnable은 본질적으로했다

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

가 :

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

그런 다음 모든 것이 완벽했다.

내 응용 프로그램에서 사용하기 위해 if 문을 사용하여 터치 포인트가 처음 만들어지면 레이아웃 크기가 계산되고 그에 따라 비트 맵이 만들어집니다.

관련 문제