2012-02-10 49 views
9

Tôi có DrawView. Nếu tôi chạm vào khung nhìn này, nó sẽ vẽ các vòng tròn nhỏ. Tôi sẽ không vẽ vòng tròn nhưng không chạm vào chế độ xem - với chức năng trợ giúp "setPoints". Những gì tôi làm:Cách tải canvas hiện tại?

package com.samples; 
import ... 

public class DrawView extends View { 
    ArrayList<Point> points = new ArrayList<Point>(); 

    Paint paint = new Paint(); 

    private int pSize = 5; 
    private int pColor = Color.BLACK; 

    public DrawView(Context context, AttributeSet attrs) { 

     super(context, attrs); 

     setFocusable(true); 
     setFocusableInTouchMode(true); 

     this.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       v.setOnTouchListener(this); 
        Point point = new Point(); 
        point.x = event.getX(); 
        point.y = event.getY(); 
        points.add(point); 
        invalidate(); 
       } 
       return true; 
      } 
     }); 
     requestFocus(); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     for (Point point : points) { 
      canvas.drawCircle(point.x, point.y, pSize, paint); 
     } 
    } 

    public void setPoints(Float xP, Float yP) 
    { 
     Point point = new Point(); 
     point.x = xP; 
     point.y = yP; 
     points.add(point); 
     postInvalidate(); 
    } 
} 

class Point { 
    float x, y; 

    @Override 
    public String toString() { 
     return x + ", " + y; 
    } 
} 

Vui lòng cho tôi biết, cách canvas out setPoints hoạt động?

Cập nhật: Ồ, đó thực sự là vấn đề thú vị. DrawView của tôi chứa trong HorizontalScrollView. Bởi vì nếu tôi đặt trong tọa độ bên phải DrawView này, không ai biết đâu là các vòng tròn có thể vẽ được.

+0

Câu hỏi này khó hiểu. Vui lòng xem lại nó – Raffaele

+0

Không dễ giải mã những gì bạn muốn hoàn thành :) Điều đầu tiên, xóa 'canvas2' đó: nó không hoạt động như bạn nghĩ. Tôi nghi ngờ bạn muốn giữ lại vòng tròn được vẽ trước đó, phải không? Nếu đây là mục tiêu của bạn, bạn phải duy trì lịch sử các cuộc gọi vẽ và có thể thực hiện theo hai cách: 1) bạn lưu trữ một mảng 'Point []' và vẽ từng vòng tròn trong 'onDraw'; hoặc 2) mỗi lần một vòng tròn được thêm vào, bạn cập nhật bộ nhớ cache 'Bitmap' – Raffaele

+0

Tôi sẽ không vẽ vòng tròn này nhưng không chạm vào màn hình! – Leo

Trả lời

4

Bạn không thể. Canvas được quản lý bởi hệ thống và được chuyển đến onDraw() của bạn. Tôi không hiểu tại sao bạn cần nó ở ngoài đó. Chỉ cần redeclare setPoints như thế này

public void setPoints(Canvas canvas, Float xP, Float Yp) 

Bạn có thể giữ một bộ nhớ cache của các bản vẽ trước đó (hoặc lưu trữ các điểm trước đó)

+0

Điểm không phải là vấn đề, tôi giữ nó. Giới thiệu về "Canvas canvas": Tôi có thể làm gì nếu không bao giờ gọi onDraw? – Leo

+1

Dường như bạn không biết cách Android vẽ Chế độ xem. Khi hệ thống phát hiện rằng một widget cần (lại) vẽ, nó gõ vào cửa của widget của bạn và nó phản hồi bằng 'onDraw (Canvas)'.Vì vậy, bạn được đảm bảo rằng phương pháp này sẽ được gọi là mỗi và mọi thời gian là cần thiết. Một cách để _trigger_ _the_ _repaint_ là bằng cách gọi 'invalidate()' (hoặc 'postInvalidate'). Vì vậy, bạn không bao giờ phải gọi onDraw mình, nhưng hãy chắc chắn rằng Android sẽ gọi nó khi cần thiết. Bạn cần phải cung cấp gọi lại. Ngoài ra, vui lòng nêu rõ ý của bạn với "Tôi muốn vẽ vòng kết nối nhưng không chạm vào chế độ xem" – Raffaele

+0

Bạn có thể cho tôi liên kết hoặc từ khóa không? – Leo

1

Thử khai báo canvas2 dưới dạng biến công khai trong lớp DrawView.

+0

Sự cố chỉ trong cuộc gọi Canvas. – Leo

0

Bạn vẽ vòng tròn của bạn trong onDraw(). Đó là cách View được cho là hoạt động (về mặt kỹ thuật nó thực sự ở phương pháp draw() nhưng chúng tôi sẽ bỏ qua điều đó). Trong setPoints(), đặt các điểm của vòng tròn trong các biến trong phạm vi lớp học, hãy gọi invalidate(), sau đó vẽ hình tròn như thế trong onDraw(). Nếu bạn làm theo phương pháp này, bạn đang theo dõi luồng của lớp mà khung nhìn đã được thiết kế cho.

+0

hmm .. public void setPoints (Float xP, Float Yp) { canvas2.drawCircle (xP, yP, 5, sơn); invalidate(); } vậy? – Leo

+0

No. 'canvas2.drawCircle (xP, yP, 5, sơn);' đi vào 'onDraw()'. Bạn lưu các giá trị cho 'xP',' yP' rồi gọi 'invalidate()' trong 'setPoints()' – DeeV

+0

Xem mã cập nhật, vui lòng – Leo

Các vấn đề liên quan