ভিউ-ভিত্তিক লেআউটগুলিতে, আপনাকে MotionEventPredictor ছাড়াও InProgressStrokesView এর ভিতরে ব্যবহারকারীদের স্পর্শ ইনপুটগুলি পরিচালনা করতে হবে।
সর্বোত্তম অঙ্কন কর্মক্ষমতা অর্জনের জন্য, InProgressStrokesView ক্লাসের startStroke() , addToStroke() , এবং finishStroke() পদ্ধতিগুলি ব্যবহার করুন, MotionEvent অবজেক্টগুলিকে ইনপুট হিসেবে পাস করুন:
UI কম্পোনেন্ট সেট আপ করুন
ভিউ-ভিত্তিক লেআউটের জন্য, আপনার ভিউ হায়ারার্কিতে
InProgressStrokesViewযোগ করুন।<FrameLayout> <ScrollView android:id="@+id/my_content" android:width="match_parent" android:height="match_parent" > <!-- Your content here. --> </ScrollView> <androidx.ink.authoring.InProgressStrokesView android:id="@+id/in_progress_strokes_view" android:width="match_parent" android:height="match_parent" /> </FrameLayout>InProgressStrokesViewচালু করুনআপনার অ্যাক্টিভিটি বা ফ্র্যাগমেন্টের
onCreate()পদ্ধতির মধ্যে,InProgressStrokesViewএর একটি রেফারেন্স পান এবং ব্যবহারকারীর ইনপুট পরিচালনা করার জন্য একটি টাচ লিসেনার সেট করুন।আপনার কার্যকলাপ বা খণ্ডের [
onCreate()) [ink-draw-include6] পদ্ধতির মধ্যে,InProgressStrokesViewএর একটি রেফারেন্স পান এবং ব্যবহারকারীর ইনপুট পরিচালনার জন্য একটি স্পর্শ শ্রোতা স্থাপন করুন।class MyActivity : View.OnTouchListener { private lateinit var contentView: ScrollView private lateinit var inProgressStrokesView: InProgressStrokesView private lateinit var predictor: MotionEventPredictor // ... other variables override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) predictor = MotionEventPredictor.newInstance(contentView) contentView = findViewById(R.id.my_content) contentView.setOnTouchListener(touchListener) inProgressStrokesView = findViewById(R.id.in_progress_strokes_view) } // ... (touchListener implementation) }স্পর্শ ইভেন্টগুলি পরিচালনা করুন
UI উপাদানগুলি স্থাপন করার পরে, আপনি স্পর্শ ইভেন্টের উপর ভিত্তি করে অঙ্কন শুরু করতে পারেন।
MotionEventঅ্যাকশনInProgressStrokesViewপদ্ধতিবিবরণ
স্ট্রোক রেন্ডারিং শুরু করুন
স্ট্রোক প্রসারিত করুন
ইনপুট শেষ করুন, স্ট্রোকের জ্যামিতি চূড়ান্ত করার জন্য প্রস্তুত হন।
স্ট্রোক বাতিল করুন
class MyActivity : View.OnTouchListener { private lateinit var contentView: ScrollView private lateinit var inProgressStrokesView: InProgressStrokesView private var pointerId = -1 private var strokeId: InProgressStrokeId? = null private lateinit var predictor: MotionEventPredictor override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) contentView = findViewById(R.id.my_content) predictor = MotionEventPredictor.create(contentView) contentView.setOnTouchListener(touchListener) inProgressStrokesView = findViewById(R.id.in_progress_strokes_view) } private val touchListener = { view: View, event: MotionEvent -> predictor.record(event) when (event.actionMasked) { MotionEvent.ACTION_DOWN -> { // First pointer - treat it as inking. view.requestUnbufferedDispatch(event) val pointerIndex = event.actionIndex pointerIdToStrokeId[event.getPointerId(pointerIndex)] = inProgressStrokesView.startStroke(event, pointerId) return true } MotionEvent.ACTION_POINTER_DOWN -> { val stroke = strokeId ?: return false inProgressStrokesView.cancelStroke(stroke, event) strokeId = null pointerId = -1 return false } MotionEvent.ACTION_MOVE -> { val predictedEvent = predictor.predict() try { for (pointerIndex in 0 until pointerCount) { val strokeId = pointerIdToStrokeId[event.getPointerId(pointerIndex)] ?: continue inProgressStrokesView.addToStroke(event, pointerId, strokeId, predictedEvent) } finally { predictedEvent?.recycle() } } } MotionEvent.ACTION_UP -> { val pointerIndex = event.actionIndex val strokeId = pointerIdToStrokeId[event.getPointerId(pointerIndex)] ?: return false inProgressStrokesView.finishStroke(event, pointerId, strokeId) return true } MotionEvent.ACTION_CANCEL -> { val pointerIndex = event.actionIndex val strokeId = pointerIdToStrokeId[event.getPointerId(pointerIndex)] ?: return false inProgressStrokesView.cancelStroke(strokeId, event) return true } } return false } }সমাপ্ত স্ট্রোকগুলি পরিচালনা করুন
finishStroke()এর পরে, স্ট্রোকটি প্রায় সম্পূর্ণ। স্ট্রোকটি সম্পূর্ণরূপে প্রক্রিয়াজাত করা হয় এবং অন্য কোনও স্ট্রোক না থাকলে আপনার অ্যাপ্লিকেশনে অ্যাক্সেসযোগ্য হয়ে ওঠে। এটি নিশ্চিত করে যে ক্লায়েন্টের কাছে স্ট্রোকটি হস্তান্তর করার আগে সমস্ত অঙ্কন ক্রিয়াকলাপ সম্পন্ন হয়েছে।সমাপ্ত স্ট্রোকগুলি পুনরুদ্ধার করতে, আপনার কাছে দুটি বিকল্প আছে:
- আপনার অ্যাক্টিভিটি অথবা ViewModel এর মধ্যে
InProgressStrokesFinishedListenerইন্টারফেসটি বাস্তবায়ন করুন এবংaddFinishedStrokesListenerকল করেInProgressStrokesViewসাথে শ্রোতা নিবন্ধন করুন। - সমস্ত সমাপ্ত স্ট্রোক সরাসরি পেতে
InProgressStrokesView.getFinishedStrokes()এ কল করুন।
class MyActivity : ComponentActivity(), InProgressStrokesFinishedListener { ... private val finishedStrokesState = mutableStateOf(emptySet<Stroke>()) override fun onCreate(savedInstanceState: Bundle?) { ... inProgressStrokesView.addFinishedStrokesListener(this) } // ... (handle touch events) @UiThread override fun onStrokesFinished(strokes: Map<InProgressStrokeId, Stroke>) { finishedStrokesState.value += strokes.values inProgressStrokesView.removeFinishedStrokes(strokes.keys) } }একবার আপনি সমাপ্ত স্ট্রোকগুলি পুনরুদ্ধার করার পরে, আপনি সেগুলি আঁকতে
ViewStrokeRendererব্যবহার করতে পারেন:class DrawingView(context: Context) : View(context) { private val viewStrokeRenderer = ViewStrokeRenderer(myCanvasStrokeRenderer, this) override fun onDraw(canvas: Canvas) { viewStrokeRenderer.drawWithStrokes(canvas) { scope -> canvas.scale(myZoomLevel) canvas.rotate(myRotation) canvas.translate(myPanX, myPanY) scope.drawStroke(myStroke) // Draw other objects including more strokes, apply more transformations, ... } } }- আপনার অ্যাক্টিভিটি অথবা ViewModel এর মধ্যে