2012-01-19 22 views
9

có thể lặp lại How to make custom brush for canvas in android?Làm thế nào để tạo ra loại bàn chải cho sơn trong android

Xin chào bạn bè,

tôi quá khó khăn để tạo ra loại bàn chải để áp dụng sơn, nhưng không tìm thấy bất cứ điều gì liên quan đến điều này.

Tôi mới vẽ/canvas vì vậy tôi không có kiến ​​thức về điều này cho cơ bản tôi đã hoàn thành nhưng đối với hiệu ứng như tạo cọ tôi không có bất cứ điều gì như thế nào để tạo/thực hiện nó. Có ai có ví dụ hoặc mã cho điều này?

Tôi cần loại bàn chải cho ứng dụng của tôi đơn giản là một ví dụ nhu cầu hiểu biết:

enter image description here

Cảm ơn bạn.

+0

hey Pratik, cậu tìm thấy bất kỳ giải pháp cho việc này. bạn có thể vui lòng giúp tôi làm thế nào để đạt được như vậy. – skygeek

Trả lời

8

Tôi đoán không có cách nào dễ dàng. Tôi tìm thấy this discussion và đặc biệt là bài đăng sau đây thú vị:

Đồ họa máy tính chuyên nghiệp không bao giờ dễ dàng. Đó là lý do tại sao có quá rất ít người thực sự giải quyết nó. Để làm cho mọi thứ tồi tệ hơn, các kỹ thuật chuyên nghiệp hiếm khi được xuất bản. Tôi không biết bạn cần nỗ lực bao nhiêu để có được nó, nhưng tôi sẽ cho bạn chút ánh sáng. Vì vậy, nếu bạn muốn, bạn có thể nghiên cứu, phát triển và làm cho nó trở thành cách tốt nhất. Nếu nó có vẻ quá khó khăn cho bạn, hãy để nó ở đây như một sự tò mò.

Các cách chuyên nghiệp để làm cho bàn chải thư pháp hiện nay cũng giống như rằng:

Đường cong bậc thầy là mịn vì nó được vẽ dựa trên spline (s). Để có được kết quả chuyên nghiệp hơn, hãy xây dựng hai đường spline: một số sử dụng các số bạn nhận được (ví dụ: từ sự kiện chuột) nằm trên spline và một điểm khác bằng cách sử dụng các điểm như điểm kiểm soát spline. Vì vậy, đường cong mà bạn vẽ là đường cong được tạo ra từ nội suy của các số này hai đường splines. Bằng cách này, bạn có một "đường cong chính" để vẽ.

Bạn cũng phải có "độ dày chính" mà trên đó biến thể phải được áp dụng . Biến thể độ dày này được tính theo kết quả mà bạn muốn. Loại bàn chải thư pháp phổ biến hơn chỉ là như trong hình ảnh bạn đã liên kết: các vùng cong thường mỏng hơn so với các chữ cái thẳng. Đó là loại thông thường hơn vì hầu hết các nhà thiết kế nhận được loại kết quả này khi vẽ bằng máy tính bảng, vì vậy các chương trình mô phỏng hành vi này. Hiệu ứng này đặc biệt thường là được tính bằng cách sử dụng một hàm dựa trên đạo hàm thứ hai của dòng chính chính. Biên độ biến thiên độ dày có thể là một giá trị có thể cấu hình.

Các đường cong đường cong mỏng và sắc nét được thực hiện trong tính toán bổ sung. Đôi khi nó có thể là một ý tưởng tốt làm mịn ngay cả độ dày biến thể với splines hoặc một số loại "chức năng ceil".

Nếu bạn làm mọi thứ đúng, bạn có đường cong dày (và tất nhiên đã đóng) trong tay. Vẽ nó bằng cách sử dụng các thuật toán điền tốt nhất bạn có thể phát triển.Sử dụng anti-aliasing nếu bạn có thể.

Tất cả các kỹ thuật này có thể được tính theo thời gian thực trong khi người dùng di chuyển chuột. Bạn nhận được càng nhiều điểm, thì càng có nhiều phép tính bạn thực hiện, nhưng nó hoạt động tốt vì hầu hết các phép tính bạn đã tạo là vẫn hợp lệ. Thông thường bạn chỉ cần tái tạo lại một phần nhỏ (cuối cùng).

Một đề xuất cuối cùng: không bao giờ làm cho việc làm mịn 2D bằng cách sử dụng hàm hồi quy phương pháp, trừ khi điểm của bạn thực sự đại diện cho hàm (vì vậy bạn cần để giữ "ý nghĩa toán học" của các điểm càng nhiều càng tốt). Tôi có thể không tưởng tượng một cách chậm hơn để làm mịn các điểm không có các ngữ nghĩa đặc biệt . Ngoại lệ duy nhất là khi bạn có các điểm rất rất thưa thớt và thứ tự nhập không quan trọng, nhưng không phải là trường hợp khi ai đó đang vẽ bằng bút vẽ.

3

Bạn có thể đạt được hiệu ứng này bằng cách vẽ kết cấu bitmap trên canvas. Tôi cắt một chút kết cấu từ hình ảnh mà bạn chia sẻ và sử dụng đó như kết cấu trong vải: -

enter image description here

ảnh Texture: -

enter image description here

Đây là lớp quan điểm của tôi: -

import java.util.ArrayList; 
import java.util.List; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.view.MotionEvent; 
import android.view.View; 

import com.serveroverload.dali.R; 

public class CanvasBrushDrawing extends View { 
    private Bitmap mBitmapBrush; 
    private Vector2 mBitmapBrushDimensions; 

    private List<Vector2> mPositions = new ArrayList<Vector2>(100); 

    private static final class Vector2 { 
     public Vector2(float x, float y) { 
      this.x = x; 
      this.y = y; 
     } 

     public final float x; 
     public final float y; 
    } 

    public CanvasBrushDrawing(Context context) { 
     super(context); 

// load your brush here 
     mBitmapBrush = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); 
     mBitmapBrushDimensions = new Vector2(mBitmapBrush.getWidth(), mBitmapBrush.getHeight()); 

     setBackgroundColor(0xffffffff); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     for (Vector2 pos : mPositions) { 
      canvas.drawBitmap(mBitmapBrush, pos.x, pos.y, null); 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     int action = event.getAction(); 
     switch (action) { 
     case MotionEvent.ACTION_MOVE: 
      final float posX = event.getX(); 
      final float posY = event.getY(); 
      mPositions.add(new Vector2(posX - mBitmapBrushDimensions.x/2, posY - mBitmapBrushDimensions.y/2)); 
      invalidate(); 
     } 

     return true; 
    } 
} 

Bạn có thể sử dụng chế độ xem này trong hoạt động của bạn như sau: -

setContentView(new CanvasBrushDrawing(MainActivity.this)); 

Bây giờ bạn chỉ cần các tệp kết cấu tốt hơn từ nhà thiết kế của mình. Hy vọng nó sẽ giúp

Bạn có thể xem mã nguồn đầy đủ về Git repo https://github.com/hiteshsahu/Dali-PaintBox

+0

Xin chào Hitesh, vui lòng không thêm câu trả lời trùng lặp, trả lời một câu hỏi. Nếu bạn tìm thấy các bản sao gắn cờ chúng, nếu chúng không có bản sao, hãy để lại một bình luận trỏ đến giải pháp có thể bạn đã cung cấp ** một lần **. – bummi

+0

@Hitesh Sahu Tôi đang sử dụng đường dẫn cho hoạt động hoàn tác/làm lại nhưng khi tôi đặt vòng lặp for bên trong phương thức onDraw(), các cọ vẽ tùy chỉnh được áp dụng nhiều lần. Vui lòng kiểm tra câu hỏi của tôi tại đây, http://stackoverflow.com/questions/38995187/custom-brush-with-undo-redo-operation-in-android-canvas/38995449?noredirect=1#comment65385129_38995449 –

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