Skip to content

iOS và Android ​

JavaScript API giống nhau trên hai nền tảng, nhưng engine vẽ thì không. iOS giao việc cho PencilKit của Apple. Android dùng một view tự viết, vẽ mỗi nét bằng các đường cong Bezier có độ dày thay đổi theo tốc độ ngón tay. Trang này gom mọi điểm khác biệt vào một chỗ.

Render ​

iOSAndroid
EnginePKCanvasView của PencilKitView tự viết, vẽ vào bitmap offscreen
Độ dày nétPencilKit tự phản hồi theo lực nhấn và tốc độ. Độ dày của tool là trung điểm của penMinWidth và penMaxWidth.max(penMaxWidth / (velocity + 1), penMinWidth), vận tốc tính bằng dp mỗi ms. Chậm thì dày, nhanh thì mảnh.
velocityFilterWeightBị bỏ quaLàm mượt vận tốc giữa các mẫu (mặc định 0.7)
defaultInkTypepen, marker, pencil; monoline, fountainPen, watercolor, crayon trên iOS 17+ (bản cũ hơn quay về pen)Bị bỏ qua
Bút stylusLực nhấn và độ nghiêng của Apple Pencil ảnh hưởng đến nét mựcĐược xử lý như ngón tay, trừ khi dùng pencilOnly

Vì sao Android có renderer riêng ​

Android không có engine mực hệ thống nào tương đương PencilKit. View trên Android là bản port native của cách tiếp cận dựa trên vận tốc quen thuộc trong các bảng ký tên: mỗi mẫu chạm mới thêm một đoạn Bezier bậc ba dựng từ bốn điểm gần nhất, và độ dày thay đổi dần từ đầu đến cuối mỗi đoạn. Nét vẽ được vẽ vào bitmap, nên nét đã xong không tốn chi phí vẽ lại trong lúc bạn viết tiếp.

Bạn có thể thử phiên bản JavaScript của cùng thuật toán ở trang Props.

Giá trị mặc định ​

PropiOSAndroid
penColorblack#111111
toolbarHeight4448
toolbarTintColorTint color của view (xanh hệ thống)Màu gốc của từng icon. Xem Màu toolbar.
baselineColorXám hệ thống, độ mờ 50%#80808080
baselineOffsetFromBottom816
baselineWidth với baselineStyle="dotted"1.52

Hãy đặt rõ các prop này nếu bạn muốn hai nền tảng trông giống nhau.

Lịch sử ​

iOSAndroid
undo() hoàn tác gìNét cuối, clear() hoặc setStrokeData()Nét cuối
clear()Undo đượcKhông undo được; còn làm rỗng redo stack
setStrokeData()Undo đượcBản vẽ trước bị mất; undo() gỡ từng nét vừa khôi phục
Nét mớiLàm rỗng redo stackLàm rỗng redo stack

Xuất ảnh ​

iOSAndroid
Nền của PNGLuôn trong suốtbackgroundColor nếu có
PNG từ saveToPhotoLibraryĐục, trắng nếu không có backgroundColorbackgroundColor nếu có, không thì trong suốt
ClipboardPNG trong suốt đã cắt sát qua UIPasteboardPNG đã cắt sát kèm nền qua URI của FileProvider
Lề khi trim2 pt0.6 × penMaxWidth dp + 2 px
Đơn vị và độ dày trong SVGPoint, độ dày trung bình mỗi nétPixel vật lý, (penMinWidth + penMaxWidth) / 2
Nơi lưu của toFileThư mục tạmThư mục cache
Kết quả saveToPhotoLibrary{ granted }; granted: false khi bị từ chối quyền{ granted, uri }; granted: false khi ghi thất bại

Chi tiết có ở Định dạng xuất.

Stroke data ​

iOSAndroid
Toạ độPointdp
tSố giây tính từ lúc nét bắt đầuMili giây theo uptime của hệ thống
Trường bổ sungpressure, size, azimuth, altitudeKhông có
Độ dày khi khôi phụcsize của từng điểmpenMinWidth và penMaxWidth hiện tại

Xem Dữ liệu nét vẽ và replay.

Đầu vào ​

iOSAndroid
pencilOnlydrawingPolicy của PencilKit (iOS 14+). Ngón tay bị bỏ qua.Chỉ TOOL_TYPE_STYLUS vẽ được. Ngón tay và đầu tẩy của stylus bị bỏ qua.
Bên trong ScrollViewKhông xử lý thêmView yêu cầu view cha không chặn lần chạm khi một nét bắt đầu
Lực nhấnPencilKit có dùngKhông dùng; độ dày chỉ phụ thuộc tốc độ
showToolPickerHiện tool picker của PencilKitBị bỏ qua

Toolbar ​

iOSAndroid
IconSF SymbolsVector drawable đi kèm, cùng phong cách
Menu overflowMenu native có icon (iOS 14+), action sheet trên bản cũ hơnPopupMenu chỉ có nhãn

Sự kiện ​

iOSAndroid
onChange mỗi nétCó thể gọi nhiều hơn một lầnMột lần
Thứ tự onChange và onEndonEnd trướconChange trước
Thông điệp lỗi khi renderFailed to encode imageFailed to render bitmap

Phát hành theo giấy phép MIT.