Как изменить растровое изображение, нарисованное на холсте, с помощью vue-nativescript на Android?

Я хочу нарисовать прямоугольник на растровом изображении и изменить его позже, когда пользователь нажимает кнопку. Вот мой пример пастбина. Я не смог загрузить образец PNG и tns-core-modules на Playground, поэтому вы не можете выполнить это, к сожалению.

Я использую приложение vue-native с nativescript (tns --version: 5.4.0) и машинописью на эмуляторе Android 8.1.

Для рисования фигур я использую компонент Placeholder на основе поста в блоге Как создать холст в nativescript и пример Playground от Tiago Alves. Заполнитель создает представление с @creatingView="createCanvasView", В этом методе я создаю ImageView и андроид родной холст let canvas = new android.graphics.Canvas(bitmap), Я могу нарисовать растровое изображение и прямоугольник, используя canvas.drawBitmap(picture1) а также canvas.drawRect(...), Наконец, я рисую это представление в компоненте.

nativeView.setImageBitmap(bitmap);
event.view = nativeView;

Теперь моя проблема начинается. Я хочу заменить picture1 с участием picture2 когда пользователь нажимает кнопку, которая вызывает @tap="changePicture1",

В идеале я мог бы получить холст, идентифицировать активы (прямоугольники, растровые изображения...), изменить растровое изображение и перерисовать. Я не знаю, как это сделать.

В более простом случае я пытаюсь изменить изображение изображения. Здесь я получаю представление и устанавливаю его на новое изображение - это работает:

changePicture1() {
let picture1 = < Image > topmost().currentPage.getViewById(
                'myCanvasView');
picture1.imageSource = this.$store.state.image;
}

Также с помощью привязки я могу изменить изображение:

changePicture2() {
this.picUrl =  "~/assets/picture2.png"
}

Попытка сделать это на холсте, где я запутался. Вот некоторые попытки изменить picUrl, а затем перерисовать холст.

changePicture3() {
this.pic = this.$store.state.projects[0].image;
// Redraw the view to update new bitmap on canvas
let picView = topmost().currentPage;
picView.android.invalidate();
// let nv = <ViewBase> this.$refs.Placeholder; 
// nv.nativeView.invalidate()
// picLane.android.invalidate()
this.picView = this.$store.state.image;
}

1 ответ

Решение

Вы не можете заменить nativeView PlaceHolder снаружи creatingView мероприятие. Вы должны получить существующий nativeView из PlaceHolder, а затем просто обновить растровое изображение.

// this.$refs.CanvasViewRef returns Vue object
// this.$refs.CanvasViewRef.nativeView returns the actual Placeholder
const nativeView = this.$refs.CanvasViewRef.nativeView.nativeView; 

...
...

nativeView.setImageBitmap(bitmap);
Другие вопросы по тегам