2013-05-13 2 views
1

그래서 저는 드로잉 앱에서이 이상한 문제에 직면하고 있습니다.안드로이드는 다른 경로의 상단에 경로를 그립니다.

이 선은 위에서 아래로 그리고 왼쪽에서 오른쪽으로 1에서 8까지 그렸습니다. 나는 선을 그리는거야 동안은 다른 모든 라인 뒤에 그리기 것 같은

enter image description here

, 그것은 보여줍니다. 화면에서 나가게 할 때마다 가끔이 튀어 나옵니다. 이것은 완전히 무작위로 보입니다.

나는 무엇보다 항상 다른 모든 것을 위에 그리는 것을 간과하고 있습니까?

내 DrawView.java :이처럼 내 MainActivity에 DrawView를 인스턴스화하고

public class DrawView extends View implements OnTouchListener { 

    private Path path = new Path(); 
    private Paint paint = new Paint(); 

    private Map<Path, Paint> pathMap = new HashMap<Path, Paint>(); 

    private boolean isScreenCleared = false; 

    public DrawView(Context context) { 
     super(context); 
     this.setOnTouchListener(this); 

     paint.setColor(Color.BLACK); 
     paint.setAntiAlias(true); 
     paint.setStrokeWidth(5); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeJoin(Paint.Join.ROUND); 
     paint.setStrokeCap(Paint.Cap.ROUND); 

    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     if (isScreenCleared) { 
      pathMap.clear(); 
      canvas.drawColor(Color.WHITE); 
      isScreenCleared = false; 
     } else { 
      //Current line 
      canvas.drawPath(path, paint); 

      //All other lines 
      for (Map.Entry<Path, Paint> p : pathMap.entrySet()) { 
       canvas.drawPath(p.getKey(), p.getValue()); 
      } 
     } 
    } 

    public boolean onTouch(View view, MotionEvent event) { 
     float eventX = event.getX(); 
     float eventY = event.getY(); 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      path = new Path(); 
      path.reset(); 
      path.moveTo(eventX, eventY); 
      return true; 
     case MotionEvent.ACTION_MOVE: 
      path.lineTo(eventX, eventY); 
      break; 
     case MotionEvent.ACTION_UP: 
      Paint newPaint = new Paint(); 
      newPaint.set(paint); 
      pathMap.put(path, newPaint); 
      break; 
     default: 
      return false; 
     } 

     invalidate(); 
     return true; 
    } 

    public float getRadius() { 
     return paint.getStrokeWidth(); 
    } 

    public void setRadius(float radius) { 
     paint.setStrokeWidth(radius); 
    } 

    public void setColor(int color) { 
     paint.setColor(color); 
     System.out.println("Color set to: " + color); 
    } 

    public void clearScreen() { 
     isScreenCleared = true; 
     invalidate(); 
    } 
} 

:

Relative layout = (RelativeLayout) findViewById(R.id.drawscreen); 

DrawView dv = new DrawView(layout.getContext()); 

답변

0

좋아, 나는 Spartygw에 문제 덕분에 찾았지만 Vector의보다 더 나은 뭔가를 발견했다.

결정 성이있는 LinkedHashMap이 있습니다.

이렇게 사용하면 문제가 해결됩니다. 또한

:

도면 내 말에 신속하게 실수 동안 내가 분명히 전체 (링크)의 HashMap 후 현재 행 을 그릴 필요로 그것은 다른 모든 뒤에 그림.

+0

표시하지 않은 것을 사용하지 않는 한 LinkedHashMap을 사용하는 것이 최상의 컨테이너 선택이 아닙니다. 그것은 벡터 또는 목록보다 무거운 컨테이너 또는 ... – spartygw

0

이 경로를 저장할 수는 HashMap을 사용하지 마십시오. Vector를 사용하고 끝에 새로운 경로를 추가하십시오. 그런 다음 벡터를 그릴 때 벡터를 반복하면서 가장 최근의 벡터를 올바른 순서로 그릴 것입니다. HashMap의 문서에서

:

Note that the iteration order for HashMap is non-deterministic. 
+0

문제를 발견해 주셔서 감사합니다. 나는 Vector 대신 LinkedHashMap을 사용하는 대답을 올렸다. – James

+0

수락 된 답변을 받으시겠습니까? 나는 몇 가지 포인트가 필요해! :) – spartygw

+0

다시 스티프 ... – spartygw

관련 문제