2012-12-13 57 views
9

Tôi đang theo dõi để vẽ theo chế độ xem của riêng mình (R.id.view) nhưng mã này dường như không có bất kỳ ảnh hưởng nào. Nó không cho phép tôi vẽ gì cả.Android - Cách vẽ trên chế độ xem

public class MainActivity extends Activity implements OnTouchListener 
     { 
Path mPath; 
Canvas canvas; 
Paint mPaint; 
MaskFilter mEmboss; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     View view=(View)findViewById(R.id.view1); 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(0xFFFF0000); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(12); 

     canvas = null; 
     //view.draw(canvas); 
     mPath = new Path(); 
     Bitmap mBitmap; 
     //Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
     mBitmap = Bitmap.createBitmap(210, 170, Bitmap.Config.ARGB_8888); 
     canvas = new Canvas(mBitmap); 
     canvas.drawColor(0xFFAAAAAA); 

     canvas.drawBitmap(mBitmap, 0, 0, mPaint); 


     //canvas.drawPaint(mPaint); 
     view.draw(canvas); 
     canvas.drawPath(mPath, mPaint); 


     mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 
             0.4f, 6, 3.5f); 



     view.setOnTouchListener(new OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 
       float x = event.getX(); 
       float y = event.getY(); 
       Log.d("x", String.valueOf(x)); 
       Log.d("y", String.valueOf(y)); 

       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         Log.d("a","down"); 
         touch_start(x, y); 
         //invalidate(); 
         break; 
        case MotionEvent.ACTION_MOVE: 
         touch_move(x, y); 
         // invalidate(); 
         break; 
        case MotionEvent.ACTION_UP: 
         touch_up(); 
         // invalidate(); 
         break; 
       } 
       return true; 
      } 
     }); 

     // mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); 
    } 
    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 4; 

    private void touch_start(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 
    private void touch_move(float x, float y) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 
    private void touch_up() { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     canvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 





} 

Tôi phải làm gì để sử dụng sơn ngón tay freehanf theo quan điểm của riêng tôi?

+0

** Tham khảo câu trả lời của tôi [Nhấp vào đây] (http://stackoverflow.com/a/41135685/4629101) ** –

Trả lời

6

Sẽ là tốt nhất nếu bạn tạo một lớp mở rộng chế độ xem và đặt chế độ đó thành chế độ xem nội dung, theo cách năng động hơn theo cách đó. cũng là tham số Action_Move được gọi rất nhiều trong các sự kiện cảm ứng, vì vậy tốt nhất bạn nên lưu ý rằng, nếu không bạn sẽ nhận được một đường thẳng khi bạn muốn một đường cong.

Sửa:
Bạn sẽ khởi đầu ở onCreate bằng cách thay đổi
View view = new MyView();
setContentView(view);

Bên trong lớp MyView của bạn, bạn sẽ có một ArrayList của 'Con đường' đối tượng, mọi Action_UP được gọi , bạn thêm đường dẫn vào arrayList, sử dụng view.Invalidate(); và sau đó lớp sẽ gọi phương thức onDraw trong lớp xem của bạn. Vì vậy, bạn ghi đè lên nó như vậy.

@Override public void onDraw(Canvas c){
for(Path p: listOfPaths){
c.drawPath(p, paint);}
}

Lưu ý: Đây sẽ là tốt cho bản vẽ đơn giản, tôi không mong đợi để vẽ Mona Lisa trên máy tính bảng hoặc điện thoại của bạn với phương pháp này kể từ khi có rất nhiều dòng bạn có thể nhận thấy độ trễ. Nếu bạn muốn trở nên phức tạp và chuyên nghiệp hơn. Kiểm tra cách tiếp cận view.Invalidate(Rect r) với nó, điều này sẽ không làm mất hiệu lực toàn bộ chế độ xem nhưng chỉ có phần bạn vừa vẽ

+0

Bất kỳ lớp nào mở rộng chế độ xem sẽ có phương thức onDraw. Đơn giản chỉ cần gọi invalidate trong Action_Up của bạn, và nó sẽ gọi phương thức onDraw. để vẽ lại chế độ xem được cập nhật. Hy vọng điều này đã giúp. – dannyRods

+0

chúng tôi có thể lấy thêm thông tin không? Làm thế nào bạn sẽ làm điều này trong mã của mình? –

+1

Hy vọng rằng xóa nó lên – dannyRods

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